Как переопределить поле формы в представлении на основе функций в Django?

Мне нравится использовать форму в представлении, основанном на функциях, но я хочу переопределить поле выбора kategoria, чтобы показывать только объекты, связанные с пользователем.

models.py

class Blog_poszt(models.Model):

    def __str__(self):
        return str(self.user)

    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blog_szerzo")
    datetime = models.DateTimeField(auto_now_add=True, auto_now=False)
    cim = models.CharField(max_length=300)
    cim_slug = models.CharField(max_length=300, null=True, blank=True)
    szoveg = models.CharField(max_length=10000, null=True, blank=True)
    kategoria = models.ForeignKey('Blog_kategoriak', on_delete=models.CASCADE, null=True, blank=True)
    kep = models.FileField(upload_to="blog/", null=True, blank=True)

class Blog_kategoriak(models.Model):

    def __str__(self):
        return str(self.user)

    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="kategoria_szerzo")
    datetime = models.DateTimeField(auto_now_add=True, auto_now=False)
    kategoria = models.CharField(max_length=200)

forms.py

class UjBlogposztForm(forms.ModelForm):

    class Meta:
        model = Blog_poszt
        fields = '__all__'
        exclude = ('user',) 
    

views.py

def blog_poszt(request):

    form = UjBlogposztForm(request.POST, request.FILES)

    if request.method == 'POST':
        if form.is_valid:
            form.instance.user = request.user
            form.save()

    context = {
        'form': form,
    }

html

<form method="post" enctype="multipart/form-data">
    {% csrf_token %} 
        {{ form.as_p }}
            <button type="submit" class="btn btn-dark">Mentés</button>
</form>

Вы можете:

def blog_poszt(request):
    ... 
    form = UjBlogposztForm()
    form.fields["kategoria"].queryset = Blog_kategoriak.objects.filter(user=request.user)

    context = {"form": form}
    ....

Вы можете сделать это с помощью метода __init__ формы.

Попробуйте сделать это следующим образом:

forms.py

from django import forms

class UjBlogposztForm(forms.ModelForm):
    
    class Meta:
        model = Blog_poszt
        fields = '__all__'
        exclude = ('user',) 

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(UjBlogposztForm, self).__init__(*args, **kwargs)
        if user:
            self.fields['kategoria'].queryset = Blog_kategoriak.objects.filter(user=user)

views.py

from django.shortcuts import render

def blog_poszt(request):
    if request.method == 'POST':
        form = UjBlogposztForm(request.POST, request.FILES, user=request.user)
        if form.is_valid():
            form.instance.user = request.user
            form.save()
            # Redirect to a success page or handle as needed
    else:
        form = UjBlogposztForm(user=request.user)

    context = {
        'form': form,
    }
    return render(request, 'your_template.html', context)

Метод __init__ в UjBlogposztForm модифицирован для принятия аргумента user, который используется для фильтрации набора запросов поля Your Model kategoria, чтобы показывать только категории, относящиеся к данному пользователю. В файле представления текущий пользователь (request.user) передается форме при инстанцировании, что гарантирует, что поле kategoria будет заполнено вариантами, относящимися только к текущему пользователю.

Вернуться на верх