我对表单向导有疑问。在向导的第 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 (删除了我之前对此的编辑)。我的代码的问题是,当用户从第 4 步返回第 3 步时,get_form 使用的步骤是第 4 步。我试图改变:
“如果步骤 == '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