Django,ModelChoiceField() 和初始值
Posted
技术标签:
【中文标题】Django,ModelChoiceField() 和初始值【英文标题】:Django, ModelChoiceField() and initial value 【发布时间】:2010-11-23 03:23:18 【问题描述】:我正在使用这样的东西:
field1 = forms.ModelChoiceField(queryset=...)
如何让我的表单显示选定的 a 值?
【问题讨论】:
【参考方案1】:如果你想设置默认初始值,你应该定义initial
,就像除set it to the id instead之外的其他表单字段一样。
假设你有这样的field1
:
class YourForm(forms.Form):
field1 = forms.ModelChoiceField(queryset = MyModel.objects.all() )
那么您需要在创建表单时设置初始值,如下所示:
form = YourForm(initial = 'field1': instance_of_mymodel.pk )
而不是:
form = YourForm(initial = 'field1': instance_of_mymodel )
我还假设您已经为您的模型定义了__unicode__
,因此它可以正确显示。
【讨论】:
在撰写本文时不知道版本是什么,但这个问题现在有点过时了。在撰写本文时,在 Django 1.5 中,这两种方法都可以使用。 知道为什么我会收到__init__() got an unexpected keyword argument field1
【参考方案2】:
你可以使用
field1 = forms.ModelChoiceField(queryset=..., initial=0)
选择第一个值等。这是更通用的方式,然后是另一个答案。
【讨论】:
这适用于哪个版本的 Django?在 1.8 版中它似乎对我不起作用。 我已经从source code 验证并自己测试它是否适用于django>=1.8
。我相信这应该适用于所有版本,包括>=1.4
@Raffi 是的,link in my comment above 指向 Django=1.8.11 的 ModelChoiceField.__init__(..., initial,...)
的参数。【参考方案3】:
他们改变的时代:
现在可以像其他表单字段一样通过定义initial
来设置默认初始值除了您将其设置为id。
现在这就足够了:
form = YourForm(initial = 'field1': instance_of_mymodel )
虽然两者仍然有效。
【讨论】:
请说明您正在运行的 Django 版本,因为“时代已经改变”。更改了一些可能会升级到 1.2...【参考方案4】:你也可以这样做:
form = YourForm(initial = 'field1': pk )
如果您通过查询字符串或通过 ajax 调用解析主键,则不需要实例,查询集已经为您的下拉列表处理了该问题,pk 索引您想要的状态
【讨论】:
【参考方案5】:代码
form = YourForm(initial = 'field1': instance_of_mymodel.pk )
和
form = YourForm(initial = 'field1': instance_of_mymodel )
或直接跟随的初始字段:
field1 = forms.ModelChoiceField(queryset=..., initial=0)
所有工作。
前两种方式将覆盖最后一种方式。
【讨论】:
【参考方案6】:field1 = forms.ModelChoiceField(queryset=Model.objects.all(), empty_label="Selected value")
就这么简单......!
【讨论】:
以上是关于Django,ModelChoiceField() 和初始值的主要内容,如果未能解决你的问题,请参考以下文章
表单 ModelChoiceField 查询集 + 额外选择字段 django 表单
Django - ModelChoiceField 查询集如何工作?
Django:让 ModelChoiceField 在运行时评估查询集