2017-08-03 91 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

相關問題