设置Django ModelChoiceField的初始值

时间:2013-06-18 20:45:54

标签: django django-models django-forms

我有一个带有m2m-Fields的Model到OtherModel。

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)

对于类Model I,使用普通的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)

我可以在m2m字段中保存所选名称,但在重新加载时他们没有选择

exampel:

<select id=some_id" name="some_name">
     <option value="1"> HAWAII </option>
     <option value="2"> ALASKA</option> 
</select>

在例子中,ALASKA在提交和重新加载时被选中,应该是这样的:

<select id=some_id" name="some_name">
     <option value="1"> HAWAII </option>
     <option value="2" **selected="selected"**> ALASKA</option> 
</select>

但这支持html内容:

<select id=some_id" name="some_name">
     <option value="1"> HAWAII </option>
     <option value="2"> ALASKA</option> 
</select>

有人知道解决方案吗?

3 个答案:

答案 0 :(得分:4)

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

views.py

if request.method == "POST":
    form=OtherModelForm(request.POST) 
else:
    form=OtherModelForm() 

forms.py

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

----------或----------

views.py

if request.method == "POST":
    form=OtherModelForm(request.POST) 
else:
    form=OtherModelForm(initial={'name': 'ALASKA'}) 

forms.py

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

答案 1 :(得分:1)

您的视图中应该包含以下内容:

form=OtherModelForm(request.POST, initial={'name': 'ALASKA'}) 

答案 2 :(得分:0)

我有以下代码:

otherModel = OtherModel.objects.all()
otherModelFormSet = otherModel_formset(id)
otherModelList = otherModel.values('id', 'name')
inProgressOtherModel = otherModelFormSet(None, initial=otherModelList, prefix='otherModel')