Django ModelForm ManyToManyField初始值

时间:2017-08-03 12:40:55

标签: python django django-1.11

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

相关代码如下所示:

models.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的实例不再具有关系。 在' ???'在我的代码中,我尝试了许多方法来获取已经在表单中选择的关系,但我找不到工作方式。

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

2 个答案:

答案 0 :(得分:1)

form = model2_form(initial={'name': model2_inst.name,
                            'relation': [i.id for i in model2_inst.relation.all()]})

答案 1 :(得分:1)

您应该为GET和POST请求提供>>> callable(sum) True >>> callable(3) False >>> callable(functools.partial(sum, 1)) True 。这样,您不需要提供instance数据 - Django将自动从实例中获取值。

initial