【发布时间】:2013-07-22 20:51:59
【问题描述】:
与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)
...
当我尝试在上面的代码中初始化人员时,表单没有显示,但也没有抛出任何错误。如果我从初始字典中取出“人”键/值对,表单会显示得很好,但没有检查任何人。 如果这很重要,我也在使用 Django 1.5。提前致谢。
【问题讨论】:
-
我认为这会有所帮助stackoverflow.com/questions/604266/…
-
我错过了什么吗?这个答案似乎只是引入了我已经设置的初始值的概念。这只是复选框的初始值不起作用,如果不是我要检查的对象列表,我不知道该给它什么。
-
为什么不使用 django 表单来为您完成设置初始值的工作?这就是我想要达到的目的。
-
很好,在表单定义中设置初始值是可行的,尽管我必须向表单传递一个额外的参数。谢谢!
-
回答了您的问题。随意点赞和接受。
标签: django django-forms