0

我正在使用 Django 1.11.2 开发网站。我使用 ModelForms 在我的网站上编辑我的模型实例。表单的每个字段都会在我的视图中通过“初始”获取我想要编辑的实例的拟合值。它适用于除 ManyToManyFields 之外的所有字段。

相关代码如下所示:

模型.py:

class model1(models.Model):
    name = models.CharField(max_length=45, blank=False, null=False)

class model2(models.Model):
    name = models.CharField(max_length=45, blank=False, null=False)
    relation = models.ManyToManyField(model1)

forms.py 中的 ModelForm:

class model2_form(forms.ModelForm):
    class Meta:
        model = model2
        fields = '__all__'

以及我用来编辑model2实例的视图:

def model2_edit(request, objectid):
    link = 'Model2'
    model2_inst = model2.objects.get(id=objectid)
    form = model2_form(initial={'name': model2_inst.name,
                                'relation': ???})
    if request.method == 'POST':
        f = model2_form(request.POST, instance=model2_inst)
        if f.is_valid():
            f.save()
            return HttpResponseRedirect('/model2')
    return render(request, "edit_db.html",
                  {"form": form, "link":link})

每次我通过 ModelForm 编辑 model2 的实例时,都不会预先选择已经存在的实例的“关系”(“初始”不起作用)。如果我保存这样的表单而不再次选择关系,它们会被删除,并且 model2 的实例不再有关系。在'???'的地方 在我的代码中,我尝试了很多方法来获取表单中已经选择的那些关系,但我找不到有效的方法。

我希望我设法描述了我的问题,提前感谢任何帮助或想法。

4

2 回答 2

2
form = model2_form(initial={'name': model2_inst.name,
                            'relation': [i.id for i in model2_inst.relation.all()]})
于 2017-08-03T12:50:10.467 回答
2

您应该提供instanceGET 和 POST 请求。这样,您不需要提供initial数据 - Django 会自动从实例中获取值。

model2_inst = model2.objects.get(id=objectid)
form = model2_form(instance=model2_inst)
于 2017-08-03T13:04:46.863 回答