私はDjango 1.4.8を使用しています
前のステップで行った選択からフォームを動的に変更できますが、ここではより正確にする必要があります。
事実上、私のフォーム「ステップ 0」には、値を選択するドロップダウンがあり、ステップ 2 では、ステップ 0 で選択した値なしで「ステップ 0」と同じデータをロードする必要があります。
私はこのようにしました:
urls.py :
# wizard
url(r'^service/create/$',
UserServiceWizard.as_view([ProviderForm,
DummyForm,
ConsummerForm,
DummyForm,
ServicesDescriptionForm]),
ビュー.py
def get_form(self, step=None, data=None, files=None):
"""
change the form instance dynamically from the data we entered
at the previous step
"""
#
if step is None:
step = self.steps.current
if step == '1':
prev_data = self.get_cleaned_data_for_step('0')
service_name = str(prev_data['provider']).split('Service')[1]
class_name = 'th_' + service_name.lower() + '.forms'
form_name = service_name + 'ProviderForm'
form_class = class_for_name(class_name, form_name)
form = form_class(data)
elif step == '2':
data = self.get_cleaned_data_for_step('0')
form = ConsummerForm(initial={'provider': data['provider']})
# EDIT 10/16 @ 10:00
# to track what's wrong I added
print form['consummer'].errors #return nothing
print form.is_valid() #return false
print "form.non_field_errors ", form.non_field_errors() #return nothing
elif step == '3':
prev_data = self.get_cleaned_data_for_step('2')
service_name = str(prev_data['consummer']).split('Service')[1]
class_name = 'th_' + service_name.lower() + '.forms'
form_name = service_name + 'ConsummerForm'
form_class = class_for_name(class_name, form_name)
form = form_class(data)
else:
form = super(UserServiceWizard, self).get_form(step, data, files)
return form
私のフォームは次のとおりです。
class ServiceChoiceForm(forms.Form):
def activated_services(self, provider=None):
"""
get the activated services added from the administrator
"""
services = ServicesActivated.objects.filter(status=1)
choices = []
datas = ()
if provider is not None:
services = services.exclude(name__exact=provider)
for class_name in services:
datas = (class_name, class_name.name.rsplit('Service', 1)[1])
choices.append(datas)
return choices
class ProviderForm(ServiceChoiceForm):
provider = forms.ChoiceField()
def __init__(self, *args, **kwargs):
super(ProviderForm, self).__init__(*args, **kwargs)
self.fields['provider'].choices = self.activated_services()
class ConsummerForm(ServiceChoiceForm):
consummer = forms.ChoiceField()
def __init__(self, *args, **kwargs):
super(ConsummerForm, self).__init__(*args, **kwargs)
# get the list of service without the one selected in
# the provider form
self.fields['consummer'].choices = self.activated_services(
self.initial['provider'])
今何が起こったのですか:
「ステップ 2」のフォームでデータを送信すると、無期限に「ステップ 2」に戻ります
の部分をelif step == '2'
入れget_form()
ず、同じコードをフォームフォームの ConsummerForm に入れない場合:
self.fields['consummer'].choices = self.activated_services()
その後、プロセスは続行しますが、それは私が望むものではありません:(
last thingsget_form()
"= "step 0" の後に が呼び出される回数が多すぎる
ことに気付きました: 実際には 4 回 . print form,step
in で追跡しましたget_form()
が、フォームは決して期待されたものではありません.
ウィザードで無限ループの動作を修正する方法を誰かが説明できる場合; 私は大いに感謝します;)