Django Formset无法按用户对象过滤

1 投票
1 回答
583 浏览
提问于 2025-04-19 03:32

我搞不清楚怎么把表单设置成只显示当前登录用户的博客帖子。表单显示得没问题,但它允许任何用户给任何博客帖子分配照片,不管那个博客帖子是谁的。我要怎么把博客帖子的选项过滤成只给当前登录的用户呢?


views.py

@login_required
def addimage(request):
    user = request.user
    blogposts = Blogpost.objects.filter(user=user)
    print blogposts
    imageformset = modelformset_factory(Image, AddImageForm,extra=1) 
    if request.method == "POST":
        formset = imageformset(request.POST, request.FILES)
        if formset.is_valid() :
            for form in formset.cleaned_data:
                    image = form['image']
                    title = form['title']
                    blogpost = form['blogpost']
                    description = form['description']
                    photo = Image(
                        title = title,
                        image= image,
                        blogpost=blogpost,
                        description=description,
                        )
                    photo.user = request.user
                    photo.save()

            messages.success(request, 'We did it. Pictures are on the interwebs!')
            return HttpResponseRedirect("/%s/%s/" % (user, blogpost.slug))


    else:
        formset = imageformset()

    return render_to_response('photos/add_photos.html', {
        'formset' : formset,
        'blogpost' : blogposts,
        },
        context_instance=RequestContext(request))

forms.py

from django import forms 
from .models import *

class AddImageForm(forms.ModelForm):
    class Meta:
        model   = Image
        fields = ('image', 'title', 'blogpost', 'description')

Add_photos.html

{% extends "base.html" %}
{% load static %}
{% block content %}
<div>
    <form action="" method="POST" enctype="multipart/form-data">{% csrf_token %}
    <div id="submit"><input id="submit-btn" type="submit" value="Save"></div>
        {{ formset.management_form }}
        {{ formset.as_p }}

       <input type="submit" value="Save">
    </form>
</div>
{% endblock %}

1 个回答

2

看起来你的博客帖子字段是一个外键(ForeignKey)。默认情况下,这个字段会用django.forms.ModelChoiceField来表示。这个ModelChoiceField是从ChoiceField继承来的,而ChoiceField的选项是一个模型查询集(QuerySet)。你可以查看关于ModelChoiceField的详细说明。

所以你需要给这个字段的查询集属性提供一个自定义的查询集。这有点依赖于你的表单是怎么构建的。我发现最简单的方法是在构造函数里做,但如果使用表单集工厂,这就有点复杂。你可以在构造表单集之后尝试这样做:

formset = imageformset()
for form in formset.forms:
    form.fields['blogpost'].queryset = Blogpost.objects.filter(user=user)

我觉得你还需要在代码的request.method == 'POST'分支中调用formset.is_valid()之前做这件事。

撰写回答