0

我想显示一个包含一些自定义用户数据的表单。更具体地说,我想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'错误。

我究竟做错了什么?

4

3 回答 3

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

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

于 2013-02-26T10:43:54.270 回答
2

Djangofields__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)

不过,您可能不应该像那样覆盖Forma __init__。Django 的表单系统期望datainit 中的 arg 包含表单的数据,而不是您用于选择字段的查询集。

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

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)

然后调用它:

form = WallPostForm(request.POST or None, relates_to_queryset=data)
于 2013-02-26T10:15:03.630 回答
-1

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

于 2013-02-26T10:47:25.870 回答