2013-03-07 99 views
4

我有一个formwizard的问题。在向导的第3步中,我使用了一个筛选查询,这取决于第1步和第2步中的选择。向前移动时,我的向导工作正常,但当用户按下前一个或更改第1步和第2步的选择时,事情出错了验证错误或过滤器将不起作用)。Formwizard自定义查询集

这里是我的forms.py:

class BoekForm3(forms.Form): 
    Activiteit = forms.ModelChoiceField(queryset=Activiteit.objects.all(), empty_label="(Nothing)") 

如果我在向导的步骤3 forms.py正确的字段使用的查询集Activiteit.objects.none()显示正确的,但在第3步总是让验证错误。

如果我在forms.py中使用queryset Activiteit.object.all(),则前进时会在步骤3中显示正确的(已过滤)字段,并且表单将进行验证。然而,当用户在步骤4中按下前一个时,过滤器消失,并且所有选择都可用。

编辑2:确定我发现每次都读取get_form(删除了我之前的关于此的编辑)。我的代码的问题是,当用户从step4返回到step3时,get_form使用的步骤是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

你应该试试这个https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects – masterofdestiny 2013-03-07 10:18:21

+0

不应该'如果step =='step3': '实际上'如果step =='3':'按照文档? – Rohan 2013-03-07 10:41:22

+0

@罗汉好点。我为每一步使用自定义模板,然后将步号更改为定义模板时使用的名称。 – 2013-03-07 11:09:49

回答

0

它看起来越来越多,Formwizard不支持我想要的。因此,我开始使用常规表单工作,并将clean_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我的问题,我会以纪念我自己的答案作为解决方案。

+0

你可以告诉我你在做什么从1到另一个吗?意味着在按钮上单击表单调用相同的视图? – 2013-03-21 16:56:19

+0

在模板中我有一个确认按钮:然后这个信息在请求中。POST:如果request.POST.get('BoekForm2'): 您还可以在如下形式中包含一个字段: 2013-03-22 10:25:51

+0

我在传递价值方面有问题..你可以指出我的错误..如果我显示你我的代码? – 2013-03-22 12:37:32

3

要使用自定义步骤名称,必须与步骤名称和窗体类

FORMS = [("step1", myapp.forms.Step1Form), 
     ("step2", myapp.forms.Step2Form)] 

和urls.py的元组的列表初始化向导类:

urlpatterns = patterns('', 
    (r'^wizard/$', BoekingWizard.as_view(FORMS)), 
) 
+0

我知道,但这不是问题,因为我向前迈进时向导正在工作。 – 2013-03-11 07:14:55