Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 正在尝试在下拉列表中获取要使用Form.initial选择的选项_Django_Django Forms_Django Views - Fatal编程技术网

Django 正在尝试在下拉列表中获取要使用Form.initial选择的选项

Django 正在尝试在下拉列表中获取要使用Form.initial选择的选项,django,django-forms,django-views,Django,Django Forms,Django Views,我想要一个表格,有一个地区的下拉列表,其中一个地区是根据一些其他数据预先选定的。要选择一个地区,我需要将初始值设置为以下值: class myExtendedContactInfoForm(ExtendedContactInfoForm): districts = [(x.id, x.district) for x in District.objects.all()] district = forms.ChoiceField(choices=districts, required

我想要一个表格,有一个地区的下拉列表,其中一个地区是根据一些其他数据预先选定的。要选择一个地区,我需要将初始值设置为以下值:

class myExtendedContactInfoForm(ExtendedContactInfoForm):
    districts = [(x.id, x.district) for x in District.objects.all()]
    district = forms.ChoiceField(choices=districts, required=False, initial=2)
如果我实例化MyExtendedContactinform而不设置initial,则下拉列表可以正常工作:

form = myExtendedContactInfoForm(contact=contact)
但是为了让表单的其余部分正常工作,我实际上需要传递初始数据,因此我必须这样做:

form = myExtendedContactInfoForm(contact=contact, initial=init_data)
但这会使下拉列表中的选择停止工作。文档中解释了原因。它在django中说:

请注意,如果字段定义了initial,并且在实例化表单时包含initial,则后一个首字母将具有优先权

我如何解决这个问题?这有点像名称空间污染

非常感谢,, 托马斯

类似于:

class myExtendedContactInfoForm(ExtendedContactInfoForm):
    def __init__(self, *args, **kwargs):
        if 'initial' in kwargs:
            kwargs['initial']['district'] = 2
        super(myExtendedContactInfoForm, self).__init__(*args, **kwargs)
比如:

class myExtendedContactInfoForm(ExtendedContactInfoForm):
    def __init__(self, *args, **kwargs):
        if 'initial' in kwargs:
            kwargs['initial']['district'] = 2
        super(myExtendedContactInfoForm, self).__init__(*args, **kwargs)

作为覆盖表单的
\uuuu init\uuu
方法的替代方法,您可以从表单的
init\u数据中删除
区域
键。这样,其他字段将从表单的初始数据填充,而
区域
字段使用自己的初始值

init_data.pop('districts', None)
form = myExtendedContactInfoForm(contact=contact, initial=init_data)

作为覆盖表单的
\uuuu init\uuu
方法的替代方法,您可以从表单的
init\u数据中删除
区域
键。这样,其他字段将从表单的初始数据填充,而
区域
字段使用自己的初始值

init_data.pop('districts', None)
form = myExtendedContactInfoForm(contact=contact, initial=init_data)

我更喜欢以不同的方式指定选项:

class MemberForm(forms.Form):
    google_account = forms.EmailField()
    group = forms.ChoiceField()

    def __init__(self, *args, **kwargs):
        super(MemberForm,self).__init__(*args, **kwargs)
        self.fields['group'].choices = [(g.id,g.name) for g in get_group_choices()]
其中
get\u group\u choices()
执行所有数据库查询等。显然,您可以在
\uuuu init\uuuu
中执行查询,这基本上取决于当时的风格

使用这种方法,我从未遇到过初始值的问题


编辑:不知何故,我完全误解了这样一个事实,即您试图将初始值硬编码到表单中。您可以将初始值硬编码到视图中吗?

我更喜欢用不同的方式指定选项:

class MemberForm(forms.Form):
    google_account = forms.EmailField()
    group = forms.ChoiceField()

    def __init__(self, *args, **kwargs):
        super(MemberForm,self).__init__(*args, **kwargs)
        self.fields['group'].choices = [(g.id,g.name) for g in get_group_choices()]
其中
get\u group\u choices()
执行所有数据库查询等。显然,您可以在
\uuuu init\uuuu
中执行查询,这基本上取决于当时的风格

使用这种方法,我从未遇到过初始值的问题


编辑:不知何故,我完全误解了这样一个事实,即您试图将初始值硬编码到表单中。您可以将初始值硬编码到视图中吗?

为什么不使用forms.ModelChoiceField(queryset=District.objects.all())?不起作用,表单的初始值大于字段的初始值。好的,我还是把这个留在这里-很高兴看到为什么它不起作用为什么不使用forms.ModelChoiceField(queryset=District.objects.all())不起作用,表单的首字母超过字段的首字母。好的一点,我将把它留在这里-很高兴看到它为什么不起作用。更新({'initial':{'district':2})不是更好吗?e、 g.如果kwargs[“首字母”]不是set@jpic不,
{'initial':{'a':1,'b':2}}。更新({'initial':{'district':2}}
将删除所有现有的首字母缩写。更新({'initial':{'district':2})不是更好吗?例如,如果kwargs['initial']不是set@jpic否,
{'initial':{'a':1,'b':2}}。更新({'initial':{'district':2}
将删除所有现有的首字母缩写。我实际上不想硬编码值2。我只是为了简洁而写的。实际上它将基于其他一些设置。无论哪种方式,我首选的方法都是将该值传递到视图中的首字母:
f=ContactForm(initial={'myfield':myvalue})
。这不起作用有什么原因吗?我实际上不想硬编码值2。我只是为了简洁而写的。实际上,它将基于其他一些设置。无论哪种方式,我首选的方法是将该值传递到视图中的首字母:
f=ContactForm(initial={'myfield':myvalue})
。有什么原因导致这不起作用吗?