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