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})
。有什么原因导致这不起作用吗?