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

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

您可以使用“初始”参数,请参阅文档:

您可以使用“初始”参数,请参阅文档:

这是真的。谢谢你的意见。很抱歉,我不能接受两个答案都是正确的。谢谢你的意见。很抱歉,我不能接受两个答案都是正确的。