2017-08-03 18 views
0

私はDjango 1.11.2を使ってウェブサイトを開発しています。 ModelFormsを使用して、自分のWebサイトでモデルインスタンスを編集します。フォームの各フィールドは、自分のビューで「初期」を使って編集したいインスタンスのフィッティング値を取得します。 ManyToManyFieldsを除くすべてのフィールドで正常に動作します。Django ModelForm ManyToManyField初期値

models.py:forms.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:

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}) 

モデルフォームを介して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