3

与这个问题非常相似,但我尝试了接受的答案,但没有奏效。这是正在发生的事情。

我有一个用于在照片中标记人物的表格,如下所示:

表格.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)
...

模型.py

class Photo(models.Model):
    user = models.ForeignKey(User)
...

class Person(models.Model):
    user = models.ForeignKey(User)
    photos = models.ManyToManyField(Photo)
...

我希望用户能够在最初标记照片后编辑照片上的标签,因此我有一个页面,他们可以在其中查看单张照片并编辑其标签。出于显而易见的原因,我希望预先选择已标记个人的复选框。我试图通过为表单的初始字典提供我想要选择的人员列表来做到这一点,就像我上面链接的问题的答案一样。

视图.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。提前致谢。

4

1 回答 1

2

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

现在这实际上是一个非常好的习惯,因为您正在剖析所有逻辑和演示文稿。这是一个很棒的 DRY 原则。

于 2013-07-23T17:12:07.073 回答