Django Formset无法按用户对象过滤
我搞不清楚怎么把表单设置成只显示当前登录用户的博客帖子。表单显示得没问题,但它允许任何用户给任何博客帖子分配照片,不管那个博客帖子是谁的。我要怎么把博客帖子的选项过滤成只给当前登录的用户呢?
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()之前做这件事。