2

m2m 中間テーブルを使用してフォームを保存しようとしています。multiplechoicefield フォームを実装すると、次のエラーが発生します。

Cannot assign "[Option: Option1]": "StateOption.partoption" must be a "Option" instance.

ただし、コメントアウトすると、フォームは保存されますが、一度に 1 つのオプションしか保存できません。チェックリストを用意して、ユーザーに複数のオプションを選択してもらいたいです。

私はこれを使用しています:Django m2m form save " through " table as a reference ですが、特に for ループ部分について、あまりよく理解していないことを認めなければなりません。

私の質問は次のとおりです。フォームを保存するにはどうすればよいですか? インスタンス エラーが発生する理由は理解していますが、解決方法がわかりません。また、以下の for ループはおそらく間違っています。for ループを修正する方法についてのアドバイスをいただければ幸いです。複数選択の選択を保存できるようです。

models.py

class Disease(models.Model):
    disease = models.CharField(max_length=300, verbose_name="disease")

class Option(models.Model):
    relevantdisease = models.ForeignKey(Disease, verbose_name="disease")
    option = models.CharField(max_length=300, verbose_name="treatment Options")

class State(models.Model):
   state = models.CharField(max_length=300, verbose_name='state')
   relevantdisease = models.ForeignKey(Disease, verbose_name="disease")
   relevantoption = models.ManyToManyField(Option, through='StateOption')

class StateOption(models.Model):
   parttstate = models.ForeignKey(State)
   partoption = models.ForeignKey(Option)
   relevantoutcome = models.ManyToManyField(Outcome, through='StateOptionOutcome')

フォーム.py

class StateOptionForm(forms.ModelForm):
    partoption = forms.ModelMultipleChoiceField(queryset=Option.objects.all(), required=True, widget=forms.CheckboxSelectMultiple) 
    #if I comment the line above out, then my selection will save but only 1 at at time. There are multiple options for a 'state' and I'd like to capture it all at once

    class Meta:
       model = StateOption
       exclude = ['parttstate', 'relevantoutcome']

ビュー.py

def diseasestateoption(request, disease_id, state_id):

    state = get_object_or_404(State, pk=state_id)
    disease = get_object_or_404(Disease, pk=disease_id)  

    if request.method == "POST":
        form = StateOptionForm(request.POST, request.FILES)

        if form.is_valid(): 
           profile = form.save(commit=False)
           profile.user = request.user
           profile.save()

           for state in request.POST.getlist('relevantoption'): #don't really understand this part and I'm probably not implementing this right
               option = StateOption.objects.create(partstate=state, partoption=profile)

       return HttpResponseRedirect(reverse('state', kwargs={'disease_id':disease_id}))

else:
    form = StateOptionForm()

テンプレート

 <form class="option_form" action="{% url "diseasestateoption" disease.pk state.pk %}" method="post">{% csrf_token %}

    {{ disease }}
    {{ state }}
    {{option}}

以前に同様の質問をここに投稿しましたが、回答が得られませんでした。私はdjangoとstackoverflowが初めてなので、助けていただければ幸いです。

編集

中間テーブルなしで save_m2m() を使用してこれを実装できますが、プログラムの次の部分で中間テーブルが必要になります...最初にこの部分を解決できれば。

4

1 に答える 1