Мастер django 1.3 изменяет список форм, чтобы изменить следующие шаги - PullRequest
2 голосов
/ 18 сентября 2011

У меня есть мастер, который содержит formA, formB, formC и formD.Я хочу пропустить FormB, если имя атрибута FormA не является нулевым.Как я мог сделать такую ​​вещь?

привет,

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

Создайте представление, которое будет условно проверять, какой шаг процесса в настоящее время отправляется, затем проверяет форму, а также выбирает, какая форма будет следующей.

forms.py

class BaseForm(forms.Form)
    # All our forms will have a hidden field identifying them as either A, B or C
    type = forms.HiddenField(...)

class formA(BaseForm)
    # These are the rest of your attibutes (such as 'name' etc.)
    a_1 = forms.TextField(...)
    a_2 = forms.TextField(...)

class formB(BaseForm)
    b_1 = forms.TextField(...)
    b_2 = forms.TextField(...)
    ....

class formC(BaseForm)
    c_1 = forms.TextField(...)
    c_1 = forms.TextField(...)

views.py

Это представление может быть вызвано из URL / form-wizard / и выяснит, какую из трех форм оно получает и какую форму оно предоставит для следующего шага. Когда все данные собраны, можно выполнить некоторую переадресацию или дальнейшую логику.

def form_wizard(self, request):
    next_form = None
    curr_form = None
    if request.method=='POST':
        # Find out if we have received a form in our chain
        type = request.POST.get("type", None)
        if type == 'a':
            # We are now processing Form A
            curr_form = FormA(request.POST)
            if curr_form.is_valid():
                # Do a check on the attributes (i.e. name==None)
                if curr_form.cleaned_data.get('a_1',None):
                    next_form = FormB()
                    # Now set the value of type to 'b' for the next form
                    next_form.fields['type'].initial = 'b'
                else:
                    next_form = FormC()
                    next_form.fields['type'].initial = 'c'
        elif type == 'b':
            # Processing B
            curr_form = FormB(request.POST)
            if form.is_valid():
                # Do something with this form
                .... 
                next_form = FormC()
                next_form.fields['type'].initial = 'c'
        elif type == 'c':
             # Processing C
             curr_form = FormC(request.POST)
             if curr_form.is_valid():
             # Last form in chain; either redirect or do something else
             return HttpResponseRedirect(...)
        else:
            # First visit to the wizard, give them the first form
            curr_form = FormA()
            curr_form.fields['type'].initial = 'b'

    return .... {'form':curr_form}

Наконец, в вашем шаблоне:

template.html

Будет отображаться любая форма, которую мы передали шаблону (A, B или C)

...
<form action="/form-wizard/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
...

Единственная другая проблема, с которой вы можете столкнуться, это как сохранить данные из первой формы до тех пор, пока вы успешно не заполните третью форму. Эту проблему можно легко решить, сохранив любые допустимые поля формы из первой формы в сеансе пользователя, используя встроенную в Django обработку сеанса:

https://docs.djangoproject.com/en/dev/topics/http/sessions/#examples

2 голосов
/ 06 октября 2011

Если вы придерживаетесь 1,3, FormWizard.process_step - это тот крюк, который вы ищете.

Из документов вы используете этот метод для:

динамически изменять список self.form_list на основе ранее отправленных форм.

Простая реализация будет:

def process_step(self, request, form, step):
  if step == 1 && form.cleaned_data['name'] is not None:
    self.form_list.pop(2)
2 голосов
/ 04 октября 2011

Приложение django.contrib.formtools.wizard было переписано для Django 1.4. Новое приложение было перенесено как django-formwizard , которое доступно для Django 1.3.

Если вы пишете новые представления мастера форм, я рекомендую использовать приложение django-formwizard . Это упростит миграцию на будущие версии Django, если устаревший код FormWizard устарел.

В документации Django есть раздел для версии Django для разработчиков, описывающий, как пропустить определенные шаги мастера форм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...