与this question非常相似,但我尝试了接受的答案但是没有用。这是正在发生的事情。
我有一个用于在照片中标记人物的表单,如下所示:
forms.py
class TaggingForm(forms.Form):
def __init__(self, *args, **kwargs):
queryset = kwargs.pop('queryset')
super(TaggingForm, self).__init__(*args, **kwargs)
self.fields['people'] = forms.ModelMultipleChoiceField(required=False, queryset=queryset, widget=forms.CheckboxSelectMultiple)
...
models.py
class Photo(models.Model):
user = models.ForeignKey(User)
...
class Person(models.Model):
user = models.ForeignKey(User)
photos = models.ManyToManyField(Photo)
...
我希望用户能够在他们最初标记照片后编辑照片上的标签,因此我有一个页面,可以在其中查看单张照片并编辑其标签。出于显而易见的原因,我希望预先选择已标记的个人复选框。我尝试通过给表单的初始字典提供我想要选择的人员列表,就像我在上面链接的问题的答案一样。
views.py
def photo_detail(request,photo_id):
photo = Photo.objects.get(id=photo_id)
initial = {'photo_id':photo.id, 'people':[p for p in photo.person_set.all()]}
form_queryset = Person.objects.filter(user=request.user)
if request.method == "POST":
form = TaggingForm(request.POST, queryset=form_queryset)
# do stuff
else:
form = TaggingForm(initial=initial, queryset=form_queryset)
...
当我尝试按照上面的代码初始化人员时,表单没有显示,但也没有抛出错误。如果我从初始字典中取出'people'键/值对,表单显示正常,但没有任何人检查。 如果重要的话,我也在使用Django 1.5。提前谢谢。
答案 0 :(得分:2)
你可以做的只是使用django表格为你处理所有这些。请参阅此question。理想情况下,它归结为让djnago处理您的表单及其验证和初始值。
现在这是一个非常好的习惯,因为你正在剖析所有的逻辑和演示。这是一个伟大的DRY原则。