Django,创建后在表单中设置ChoiceField

时间:2013-02-26 10:02:59

标签: django

我想在其中显示包含一些自定义用户数据的表单。更具体地说,我想为每个用户填充forms.ChoiceField不同的数据。

这是我的Form

class WallPostForm(forms.Form):
    text = forms.CharField(label=u'', widget=TinyMCE(attrs={'cols': 70, 'rows': 5}))
    relates_to = forms.ChoiceField(label=u'Relates to', choices=[], widget=forms.Select(), required=False)

    def __init__(self, data):
        self.fields['relates_to'] = forms.ChoiceField(label=u'Relates to', choices=data, widget=forms.Select(), required=False)
        super(WallPostForm, self).__init__()

这就是我所说的:

user = get_object_or_404(User, username=username)
data = UserTopics.objects.filter(user=user, result=0).values('id', 'topic__name')[:10]
form = WallPostForm(data)

我收到'WallPostForm' object has no attribute 'fields'错误。

我做错了什么?

3 个答案:

答案 0 :(得分:4)

作为杰克答案的补充,你可能最好只更换choices属性,而不是整个字段:

def __init__(self, *args, **kwargs):
    relates_to_choices = kwargs.pop('relates_to_choices')
    super(WallPostForm, self).__init__(*args, **kwargs)
    self.fields['relates_to'].choices = relates_to_choices

(我重命名了变量,它不是查询集。)

答案 1 :(得分:2)

Django在fields中设置表单的__init__属性。

所以只需交换你的代码:

def __init__(self, data):
    super(WallPostForm, self).__init__()
    self.fields['relates_to'] = forms.ChoiceField(label=u'Relates to', choices=data, widget=forms.Select(), required=False)

尽管如此,你可能不应该像这样覆盖Form的{​​{1}}。 Django的表单系统期望init中的__init__ arg包含表单的数据,而不是您用于选择字段的查询集。

我会以不同的方式覆盖它:

data

然后叫它:

def __init__(self, *args, **kwargs):
    relates_to_queryset = kwargs.pop('relates_to_queryset')
    super(WallPostForm, self).__init__(*args, **kwargs)
    self.fields['relates_to'] = forms.ChoiceField(label=u'Relates to', choices=relates_to_queryset, widget=forms.Select(), required=False)

答案 2 :(得分:-1)

您可以使用“初始”参数,请参阅文档:https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.Form.initial