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 的问题

Django:让 ModelChoiceField 在运行时评估查询集

Django 表单不使用 ModelChoiceField 保存 - ForeignKey

带有modelchoicefield的Django多个表单->查询太多