Django,在创建后将ChoiceField设置为表单
我想显示一个表单,其中包含一些自定义的用户数据。更具体地说,我想为每个用户使用不同的数据填充Django,在创建后将ChoiceField设置为表单,django,Django,我想显示一个表单,其中包含一些自定义的用户数据。更具体地说,我想为每个用户使用不同的数据填充forms.ChoiceField 这是我的表格: class WallPostForm(forms.Form): text = forms.CharField(label=u'', widget=TinyMCE(attrs={'cols': 70, 'rows': 5})) relates_to = forms.ChoiceField(label=u'Relates to', choic
forms.ChoiceField
这是我的表格
:
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'对象没有属性“fields”
错误
我做错了什么?Django在
\uuuu init\uuu
中设置表单的字段
属性
因此,只需交换代码:
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)
不过,您可能不应该像这样重写表单的\uuuu init\uuuu
。Django的表单系统希望init中的data
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)
Django在\uuuu init\uuuu
中设置表单的字段
属性
因此,只需交换代码:
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)
不过,您可能不应该像这样重写表单的\uuuu init\uuuu
。Django的表单系统希望init中的data
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)
作为Jack答案的补充,您最好只替换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
(我重命名了变量,它不会是查询集。)作为Jack答案的补充,您最好只替换选项
属性,而不是整个字段:
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
(我重命名了变量,它不是查询集。)您可以使用“初始”参数,请参阅文档:您可以使用“初始”参数,请参阅文档:这是真的。谢谢你的意见。很抱歉,我不能接受两个答案都是正确的。谢谢你的意见。很抱歉,我不能接受两个答案都是正确的。