我正在使用 ModelChoiceField:
field1 = forms.ModelChoiceField(queryset=...)
如何指定表单显示时选择的初始值?
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__
,因此可以正确显示。
你可以直接使用
field1 = forms.ModelChoiceField(queryset=..., initial=0)
选择第一个值等。它比其他答案更通用。
Django 现在允许像其他表单字段一样通过定义
initial
来设置默认初始值 现在这就足够了:
form = YourForm(initial = {'field1': instance_of_mymodel })
虽然两者仍然有效。
代码
form = YourForm(initial = {'field1': instance_of_mymodel.pk })
和
form = YourForm(initial = {'field1': instance_of_mymodel })
或紧随其后的初始字段:
field1 = forms.ModelChoiceField(queryset=..., initial=0)
所有工作。
前两种方式将覆盖最后一种方式。
field1 = forms.ModelChoiceField(
queryset=Model.objects.all(),
empty_label="Selected value")
只是想在偶然发现这个问题后添加这个答案。我知道它至少可以在 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 冗余地传递它会更加干燥。
你也可以这样做:
form = YourForm(initial = {'field1': pk })
如果您通过查询字符串或ajax调用解析主键,则不需要实例,查询集已经为您的下拉列表处理了该问题,pk索引了您想要的状态