在Django表单中预先选择多个复选框

时间:2013-07-23 16:38:57

标签: django django-forms

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。提前谢谢。

1 个答案:

答案 0 :(得分:2)

你可以做的只是使用django表格为你处理所有这些。请参阅此question。理想情况下,它归结为让djnago处理您的表单及其验证和初始值。

现在这是一个非常好的习惯,因为你正在剖析所有的逻辑和演示。这是一个伟大的DRY原则。

相关问题