Django:如何设置 ModelChoiceField 的初始值?

问题描述 投票:0回答:7

我正在使用 ModelChoiceField:

    field1 = forms.ModelChoiceField(queryset=...)

如何指定表单显示时选择的初始值?

django django-forms
7个回答
111
投票

如果您想设置默认初始值,您应该像其他表单字段一样定义

initial
,除非您将其设置为 id

假设你有

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__
,因此可以正确显示。


30
投票

你可以直接使用

 field1 = forms.ModelChoiceField(queryset=..., initial=0) 

选择第一个值等。它比其他答案更通用。


12
投票

Django 现在允许像其他表单字段一样通过定义

initial
来设置默认初始值 除非您将其设置为 id

现在这就足够了:

form = YourForm(initial = {'field1': instance_of_mymodel })

虽然两者仍然有效。


6
投票

代码

form = YourForm(initial = {'field1': instance_of_mymodel.pk })

form = YourForm(initial = {'field1': instance_of_mymodel })

或紧随其后的初始字段:

field1 = forms.ModelChoiceField(queryset=..., initial=0) 

所有工作。

前两种方式将覆盖最后一种方式。


3
投票
    field1 = forms.ModelChoiceField(
        queryset=Model.objects.all(), 
        empty_label="Selected value")

0
投票

只是想在偶然发现这个问题后添加这个答案。我知道它至少可以在 Django 3.2 上运行。 如果您在

__init__
方法中有一些计算值,您也可以在实例化时设置初始值:

def __init__(self, value, *args, **kwargs):
    # super call, etc.
    self.do_something(value)
    self.fields['field'].initial = value

如果表单使用

value
执行多项操作,则仅传递一次而不是在实例化中使用
initial
kwarg 冗余地传递它会更加干燥。


-1
投票

你也可以这样做:

form = YourForm(initial = {'field1': pk })

如果您通过查询字符串或ajax调用解析主键,则不需要实例,查询集已经为您的下拉列表处理了该问题,pk索引了您想要的状态

© www.soinside.com 2019 - 2024. All rights reserved.