Я использую Django 1.4.8Джанго бесконечный цикл Мастер форм
I am able to dynamically change the form from a choice made on the previous step, но теперь мне нужно, чтобы быть более точным.
Фактически, в моей форме «шаг 0» у меня есть выпадающее меню, откуда я выбираю значение, а затем на шаге 2 мне нужно загрузить те же данные, что и «шаг 0», без выбранного значения на шаге 0.
Я сделал это так:
urls.py:
# wizard
url(r'^service/create/$',
UserServiceWizard.as_view([ProviderForm,
DummyForm,
ConsummerForm,
DummyForm,
ServicesDescriptionForm]),
views.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()
тогда процесс продолжается, но это не то, что я хочу :(
последние вещи «= Я заметил, что get_form()
называется слишком много раз после того, как„шаг 0“: на самом деле в 4 раза , Я отслеживал это с print form,step
в get_form()
, но форма никогда не была ожидаемой.
Если кто-нибудь может объяснить мне, как я могу исправить поведение цикла infite в мастере; я был бы признателен за много;)
То, что вы делаете с волшебником формы джанго, никогда не перестает удивлять меня. –
Представьте себе, как только он сработает :-) –
Этот вопрос не соответствует теме, потому что речь идет о очень локализованной проблеме. – Rohan