我想在其中显示包含一些自定义用户数据的表单。更具体地说,我想为每个用户填充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'
错误。
我做错了什么?
答案 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)