フォームウィザードに問題があります。ウィザードの手順 3 では、手順 1 と 2 の選択に応じてフィルター処理されたクエリを使用します。先に進むときはウィザードが正常に機能しますが、ユーザーが [前へ] を押すか、手順 1 と 2 の選択を変更すると、問題が発生します (検証エラーまたはフィルターは機能しません)。
ここに私のforms.pyがあります:
class BoekForm3(forms.Form):
Activiteit = forms.ModelChoiceField(queryset=Activiteit.objects.all(), empty_label="(Nothing)")
forms.py で queryset Activiteit.objects.none() を使用すると、ウィザードのステップ 3 の正しいフィールドが正しく表示されますが、ステップ 3 では常に検証エラーが発生します。
forms.py で queryset Activiteit.object.all() を使用すると、ステップ 3 で正しい (フィルター処理された) フィールドが表示され、フォームが検証されます。ただし、ユーザーが手順 4 で [前へ] を押すと、フィルターがなくなり、すべての選択肢が利用可能になります。
Edit2:わかりました get_form が毎回読み取られることがわかりました(これに関する以前の編集を削除しました)。私のコードの問題は、ユーザーが step4 から step3 に戻ったときに、get_form が使用しているステップが step4 であることです。私は変更しようとしました:
「ステップ == 'step3' の場合」
の中へ:
「ステップ == 'step3' またはステップ == 'step4' の場合:」
私の見解では、これはActiviteitで重要なエラーになります
ステップ3に移動してフィールドが更新されたと思いますが、フォームは更新されていません。以下にviews.pyを含めました。
class BoekingWizard(SessionWizardView):
def get_template_names(self):
return [TEMPLATES[self.steps.current]]
def get_context_data(self, form, **kwargs):
plaatjes = Activiteitsgroepen.objects.all()
context = super(BoekingWizard, self).get_context_data(form=form, **kwargs)
if self.steps.current == 'step1':
context.update({'plaatjes': plaatjes})
return context
def get_form(self, step=None, data=None, files=None):
form = super(BoekingWizard, self).get_form(step, data, files)
if step == 'step3':
x = self.get_cleaned_data_for_step('step1') or {}
filter1 = x['Type_activiteit'].Groep
y = self.get_cleaned_data_for_step('step2') or {}
if y['Aantal_personen'] < 76:
filter2 = 'kleinere groepen'
elif y['Aantal_personen'] > 76:
filter2 = 'grotere groepen'
else:
filter2 = 'geen selectie'
reeks = ['1','2','3']
if y['Dagdeel'] in reeks:
filter3 = 'Dagdeel'
elif y['Dagdeel'] == '4':
filter3 = 'Hele dag'
elif y['Dagdeel'] == '5':
filter3 = 'Middag + Avond'
elif y['Dagdeel'] == '6':
filter3 = 'Dag + Avond'
form.fields['Activiteit'].queryset = Activiteit.objects.filter(Soort__Groep = filter1).filter(Grootte__Naam = filter2).filter(Dag__Omschrijving = filter3)
return form