4

フォームウィザードに問題があります。ウィザードの手順 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
4

2 に答える 2

3

カスタム ステップ名を使用するには、ウィザード クラスをステップ名とフォーム クラスのタプルのリストで初期化する必要があります。

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

そしてurls.pyで:

urlpatterns = patterns('',
    (r'^wizard/$', BoekingWizard.as_view(FORMS)),
)
于 2013-03-10T20:53:11.250 に答える
0

Formwizard が私が望んでいるものをサポートしていないように見えることがますます増えています。したがって、私は通常のフォームで作業を開始し、cleaned_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 内で私の質問を解決する解決策を提示しない限り、私自身の回答を解決策としてマークする必要があります。

于 2013-03-14T13:27:06.403 に答える