2017-08-03 92 views
0

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

相关的代码如下所示:

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) 

中的ModelForm在forms.py:

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

,我用它来编辑MODEL2 intances的观点:

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的实例时,已经存在的实例的'关系'没有被预先选择('initial'不工作)。如果我不保存表单而没有再次选择关系,它们会被删除,并且model2的实例已经不再关系。 在'???'在我的代码中,我尝试了很多方法来获得已经在表单中选择的关系,但是我找不到一种工作方式。

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

回答

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

非常感谢你,我以为我试过这个,我一定是犯了一个错误。现在它工作正常。 – Nkls155

1

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

model2_inst = model2.objects.get(id=objectid) 
form = model2_form(instance=model2_inst) 
+0

谢谢,这使得它变得更加简单。 – Nkls155

相关问题