我有一個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
你應該試試這個https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects – masterofdestiny 2013-03-07 10:18:21
不應該'如果step =='step3': '實際上'如果step =='3':'按照文檔? – Rohan 2013-03-07 10:41:22
@羅漢好點。我爲每一步使用自定義模板,然後將步號更改爲定義模板時使用的名稱。 – 2013-03-07 11:09:49