1

FormWizard を組み込み、長いフォームを処理したいと考えています。調査の結果、セッションを介してフォームウィザードを管理するため、django- merlin が最適なオプションのようです。ただし、 ( djangoウィザードのドキュメントに記載されているように)それを取り込もうとすると、 AttributeError: type object 'CreateWizard' has no attribute 'as_view'.

これは次のようになります。

from merlin.wizards.session import SessionWizard

class StepOneForm(forms.Form):
    year = forms.ChoiceField(choices=YEAR_CHOICES)
    ...

class StepTwoForm(forms.Form):
    main_image = forms.ImageField()
    ...

class StepThreeForm(forms.Form):
    condition = forms.ChoiceField(choices=CONDITION)
    ...

class CreateWizard(SessionWizard):
    def done(self, form_list, **kwargs):
        return HttpResponseRedirect(reverse('wizard-done'))

URL:

url(r'^wizard/(?P<slug>[A-Za-z0-9_-]+)/$', CreateWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm])),

マーリンのドキュメントは少しまばらなのでas_view()、元の django フォーム ウィザードのドキュメントで説明されている方法を使用することにしましたが、AttributeError. urlconf に merlin ウィザードを組み込むにはどうすればよいですか? アイデアをありがとう!


これは、@mVChr の回答に基づいて更新し、次のような手順を定義した後に得られるエラーとトレースバックです。

step_one = Step('step_one', StepOneForm())

エラーとトレースバック:

TypeError at / issubclass() arg 1 must be a class

Traceback:
File /lib/python2.7/django/core/handlers/base.py" in get_response
  89.                     response = middleware_method(request)
File "/lib/python2.7/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/myproject/myproject/urls.py" in <module>
  7. from myapp.forms import step_one, step_two, step_three, CreateWizard
File "/myproject/myapp/forms.py" in <module>
  16. step_one = Step('step_one', StepOneForm())
File "/lib/python2.7/merlin/wizards/utils.py" in __init__
  36.         if not issubclass(form, (forms.Form, forms.ModelForm,)):

Exception Type: TypeError at /
Exception Value: issubclass() arg 1 must be a class

まだエラーが発生していますが、@mVChr のおかげで解決に近づいたと感じています。このエラーを解決する方法についてのアイデアは大歓迎です! アイデアをありがとう!

4

2 に答える 2

0

注:これが機能するかどうかはわかりません。ニックBが特定の例を使用してドキュメントを翻訳し、適切なソリューションに近づけるように支援しようとしています。これがそのまま機能するかどうかをお知らせください。このコメントを削除します。

ドキュメントを読むと、次のように、オブジェクトのリストをサブクラスのインスタンス化にStep直接渡す必要があるようです。SessionWizard

from merlin.wizards.session import SessionWizard
from merlin.wizards.utils import Step

class StepOneForm(forms.Form):
    year = forms.ChoiceField(choices=YEAR_CHOICES)
    ...
step_one = Step('step-one', StepOneForm())

class StepTwoForm(forms.Form):
    main_image = forms.ImageField()
    ...
step_two = Step('step-two', StepTwoForm())

class StepThreeForm(forms.Form):
    condition = forms.ChoiceField(choices=CONDITION)
    ...
step_three = Step('step-three', StepThreeForm())

class CreateWizard(SessionWizard):
    def done(self, form_list, **kwargs):
        return HttpResponseRedirect(reverse('wizard-done'))

そして、あなたのurls.py

url(r'^wizard/(?P<slug>[A-Za-z0-9_-]+)/$',
    CreateWizard([step_one, step_two, step_three]))
于 2013-02-04T19:53:43.367 に答える
0

Step のオブジェクトを作成する際に間違った構文を使用していることに注意してください。これ

step_one = Step('step-one', StepOneForm())

のようにする必要があります

step_one = Step('step-one', StepOneForm)

すべてのステップ オブジェクトで修正する必要があります。

于 2015-11-18T08:29:35.010 に答える