Могу ли я использовать одну и ту же форму дважды для django SessionWizard?

Я пытаюсь создать 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 для обоих.

Заранее спасибо!


person anyeone    schedule 23.01.2016    source источник


Ответы (1)


Мастер должен идентифицировать их как отдельные шаги. Может быть, это сработает?

wizard_forms = [
        ("form1", TripCreationForm),
        ("form2", TripCreationForm),
]
person Adam Starrh    schedule 23.01.2016
comment
К сожалению, похоже, что это не работает, в этом сценарии он переходит прямо к form2. - person anyeone; 25.01.2016