Я пытаюсь создать SessionWizardView для процесса создания поездки. Поездка может состоять из одного этапа (в одну сторону) или двух этапов (туда и обратно). Каждый этап имеет аналогичную схему, поэтому я хотел бы использовать одну и ту же форму как для шага 0, так и для шага 1, с условием, говорящим только об использовании шага 1, когда рейс туда и обратно.
Проблема, с которой я сталкиваюсь, заключается в том, что моя кнопка «Отправить» продолжает загружать шаг 0 снова и снова вместо перехода к шагу 1, как это должно быть для полета туда и обратно. (Я предварительно заполняю каждую из форм на основе ранее запрошенной информации о поездке для каждого этапа в переопределении get_form_initial()). Моя форма правильно заполняется для первого этапа, она просто заполняет данные первого этапа при каждой отправке до бесконечности.
Я мог бы создать две одинаковые формы, но это кажется плохой практикой. Немного лучше, я мог бы просто наследовать форму обратной поездки от формы исходящей поездки и не вносить в нее никаких изменений - это то, что я попробую дальше, за исключением лучшего решения.
Но мне действительно интересно, есть ли способ использовать одну и ту же форму дважды?
В моем urls.py:
wizard_forms = [TripCreationForm,TripCreationForm]
urlpatterns = patterns('',
url(r'^trip/wizard/(?P<pk>\d+)$',
views.CreateTripSetView.as_view(wizard_forms,
condition_dict= {'1':show_return_trip_form}), name='admin_add_tripset')
)
в представлениях.py:
def show_return_trip_form(wizard):
"""
Tells the CreateTripSetView wizard whether to show the return trip form
Args:
wizard:
Returns: True if this is a round trip, false if one-way
"""
cleaned_data = wizard.get_cleaned_data_for_step('0') or {}
if cleaned_data.get('total_legs') == 2:
return True
return False
class CreateTripSetView(SessionWizardView):
def get_form_initial(self, step):
"""
Populates the initial form data based on the request, route etc.
THIS IS ALWAYS FIRING FOR STEP=0 WHEN I HIT SUBMIT.
Args:
step:
Returns:
"""
initial = self.initial_dict.get(step, {})
triprequest = TripRequest.objects.filter(id=self.kwargs['pk']).first()
if triprequest is None:
return initial
initial.update({
'request_id': flight_request.id,
#other fields set on initial here
})
return initial
в формах.py:
class TripCreationForm
#field defs ex.
request_id = forms.IntegerField()
#etc.
def __init__(self, initial, *args, **kwargs):
object_data = {}
object_data['request_id'] = initial['request_id']
#etc.
super(AnywhereFlightCreationForm, self).__init__(initial=object_data, *args, **kwargs)
Отредактировано: до сих пор мне удавалось выполнять эту работу, используя два подкласса TripCreationForm, но не используя TripCreationForm для обоих.
Заранее спасибо!