5

次のように、FormWizard を使用して 2 ステップのフォームを作成しました。

  • 第 1 ステップ: ユーザーに場所を尋ねる
  • 2 番目のステップ: ユーザーの場所に応じていくつかの検索結果 を表示し、radioButtons として表示します。

これで、2 番目のフォームは最初のフォームの入力に依存します。いくつかのブログまたはスタックオーバーフローの投稿で同様のトピックが取り上げられており、私はその指示に従いました。 ただし、process_step 中に保存されるはずの変数は、次の_init_では使用できませ

process_step から _ init _ に変数の場所を伝えるにはどうすればよいですか?

class reMapStart(forms.Form):
    location = forms.CharField()
    CHOICES = [(x, x) for x in ("cars", "bikes")]
    technology = forms.ChoiceField(choices=CHOICES)

class reMapLocationConfirmation(forms.Form):

   def __init__(self, user, *args, **kwargs):
       super(reMapLocationConfirmation, self).__init__(*args, **kwargs)
       self.fields['locations'] = forms.ChoiceField(widget=RadioSelect(), choices=[(x, x)  for x in location])

class reMapData(forms.Form):
   capacity = forms.IntegerField()

class reMapWizard(FormWizard):
   def process_step(self, request, form, step):
       if step == 1:
          self.extra_context['location'] = form.cleaned_data['location']

   def done(self, request, form_list):
       # Send an email or save to the database, or whatever you want with
       # form parameters in form_list
       return HttpResponseRedirect('/contact/thanks/')

どんな助けでも大歓迎です。

ありがとう、H

PS: 投稿は新しいコードで更新されました。

4

3 に答える 3

10

ウィザードがを介して各フォーム インスタンスに渡されるように見えるためPOST、メソッドで辞書に直接アクセスできると考えましたが、何らかの理由でデータが表示されません。__init__POSTget_form

私が思いついた代替案は、あまりにも長い間そのことにこだわる代わりに、render_templateフックを使用することです。

class ContactWizard(FormWizard):
    def done(selef, request, form_list):
        return http.HttpResponse([form.cleaned_data for form in form_list])

    def render_template(self, request, form, previous_fields, step, context=None):
        """
        The class itself is using hidden fields to pass its state, so
        manually grab the location from the hidden fields (step-fieldname)
        """
        if step == 2: 
            locations = Location.objects.filter(location=request.POST.get('1-location'))
            form.fields['locations'].choices = [(x, x) for x in locations]
        return super(ContactWizard, self).render_template(request, form, previous_fields, step, context)
于 2011-02-19T15:28:00.503 に答える
6

ストレージ オブジェクトを使用して、任意のステップからデータを取得できます。

self.storage.get_step_data('0')

これにより、その特定のステップのストレージ バックエンドに保存されたデータ dict が返されます。

以下の例では、最初のフォームに「Activity」ドロップダウン選択が含まれています。次に、2 番目のフォームには、そのアクティビティに使用できる場所のみを表示する場所選択ウィジェットが含まれています。

これは、ウィザードを前後に移動するときに機能します - 上記の回答は、ウィザードの進行のみに依存しているため、「前」を押すと機能しません (つまり、「前」を押すと、POST dict にはステップ 0 のデータが含まれません)。ステップ3で!)

def get_form(self, step=None, data=None, files=None):

    form = super(EnquiryWizard, self).get_form(step, data, files)
    #print self['forms']['0'].cleaned_data

    step = step or self.steps.current

    if step == '1':
        step_0_data = self.storage.get_step_data('0')
        activity = Activity.objects.get(pk=step_0_data.get('0-activity'))
        locations = Location.objects.filter(activities=activity)
        form.fields['locations'].widget = forms.CheckboxSelectMultiple(choices=[(x.pk,x.name) for x in locations])

    return form
于 2012-07-22T12:08:09.390 に答える
1

Yujiの助けを借りて問題を解決した後の作業コード(ありがとう)は次のとおりです。

class reMapWizard(FormWizard):

    def render_template(self, request, form, previous_fields, step, context=None):
        if step == 1:
            location = request.POST.get('0-location')
            address, lat, lng, country = getLocation(location)
            form.fields['locations'] = forms.ChoiceField(widget=RadioSelect(), choices = [])
            form.fields['locations'].choices = [(x, x) for x in address]
        return super(reMapWizard, self).render_template(request, form, previous_fields, step, context)
于 2011-02-19T19:49:46.170 に答える