我遇到了formwizard的问题。在向导的第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(),向导的step3中的正确字段会显示正确,但step3总是会给出验证错误。
如果我在forms.py中使用queryset Activiteit.object.all(),则在前进时将在步骤3中显示正确的(已过滤的)字段,并且表单将进行验证。但是,当用户在步骤4中按下之前,过滤器将消失,并且所有选项都可用。
编辑2:确定我发现每次都会读取get_form(删除了我以前的编辑内容)。我的代码的问题是,当用户从步骤4返回到步骤3时,步骤get_form正在使用,是步骤4。我试图改变:
“if step =='step3'”
进入:
“if step =='step3'或step =='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
答案 0 :(得分:3)
要使用自定义步骤名称,必须使用步骤名称和表单类的元组列表初始化向导类
FORMS = [("step1", myapp.forms.Step1Form),
("step2", myapp.forms.Step2Form)]
并在urls.py中:
urlpatterns = patterns('',
(r'^wizard/$', BoekingWizard.as_view(FORMS)),
)
答案 1 :(得分:0)
看起来Formwizard不支持我想要的东西越来越多。因此,我开始使用普通表单,并将cleaning_data存储在会话中。优点是我有更多的控制权,而且我知道发生了什么。这里的想法是:
def BoekingForm(request):
if request.method == 'POST':
if request.POST.get('BoekForm2'):
form1 = BoekForm1(request.POST)
if form1.is_valid():
request.session['Data_BoekForm1'] = form1.cleaned_data
if 'Data_BoekForm2' in request.session:
x = request.session['Data_BoekForm2']
else:
x = None
form2 = BoekForm2(initial = x)
return render_to_response('boeking/form2', {
'form2': form2,
}, context_instance = RequestContext(request))
else:
return render_to_response('boeking/form1', {
'form1': form1,
}, context_instance = RequestContext(request))
if request.POST.get('BoekForm3'):
form2 = BoekForm2(request.POST)
除非有人在Formwizard中解决我的问题,否则我必须将自己的答案标记为解决方案。