Search code examples
pythondjangoforms

How to override form field in Django function based view?


I like to use a form in a function based view but I like to override the kategoria select field to show only the objects that related to the user.

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>

Solution

  • You can:

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