设置 Django ModelChoiceField 的初始值

And*_*eas 2 django django-models django-forms

我有一个模型,其中包含到其他模型的 m2m-Fields。

class OtherModel(models.Model)    
    name = models.CharField(max_length=100, null=True)

class Model(models.Model)
    name = models.CharField(max_length=100, null=True)
    otherModel = models.ManyToManyField(OtherModel)
Run Code Online (Sandbox Code Playgroud)

对于模型类,我使用普通的 FormSet()。对于 otherModel 类,我使用 formset_factory()

我只想允许从 OtherModel 从数据库中选择数据,因此我使用以下代码将 OtherModel 中的 CharField 名称更改为 ModelChoiceField:

def otherModel_formset(self, patientenID):

    class OtherModelForm(ModelForm):
        name= ModelChoiceField(queryset=OtherModel.objects.all())

        def __init__(self, *args, **kwargs):
            super(OtherModelForm, self).__init__(*args, **kwargs)


        class Meta:
            model = OtherModel
            fields = ['name']

    return formset_factory(form=OtherModelForm, max_num=10)
Run Code Online (Sandbox Code Playgroud)

我可以将选定的名称保存在 m2m 字段中,但在重新加载时他们没有选择任何内容

例子:

<select id=some_id" name="some_name">
     <option value="1"> HAWAII </option>
     <option value="2"> ALASKA</option> 
</select>
Run Code Online (Sandbox Code Playgroud)

在示例中,阿拉斯加在提交和重新加载时被选择,应如下所示:

<select id=some_id" name="some_name">
     <option value="1"> HAWAII </option>
     <option value="2" **selected="selected"**> ALASKA</option> 
</select>
Run Code Online (Sandbox Code Playgroud)

但这是在html内容中:

<select id=some_id" name="some_name">
     <option value="1"> HAWAII </option>
     <option value="2"> ALASKA</option> 
</select>
Run Code Online (Sandbox Code Playgroud)

有人知道解决办法吗?

小智 5

问题是使用request.POSTinitial={'name': 'ALASKA'}在一起。发生这种情况是因为 的值request.POST总是覆盖参数“initial”的值,因此我们必须将其分开。我的解决方案是使用这种方式。

views.py

if request.method == "POST":
    form=OtherModelForm(request.POST) 
else:
    form=OtherModelForm() 
Run Code Online (Sandbox Code Playgroud)

forms.py

class OtherModelForm(ModelForm):
    name= ModelChoiceField(queryset=OtherModel.objects.all(), initial={'name': 'ALASKA'})
Run Code Online (Sandbox Code Playgroud)

- - - - - 或者 - - - - -

views.py

if request.method == "POST":
    form=OtherModelForm(request.POST) 
else:
    form=OtherModelForm(initial={'name': 'ALASKA'}) 
Run Code Online (Sandbox Code Playgroud)

forms.py

class OtherModelForm(ModelForm):
    name= ModelChoiceField(queryset=OtherModel.objects.all())
Run Code Online (Sandbox Code Playgroud)