Как лучше всего обрабатывать различные формы с одной страницы в Django? - PullRequest
3 голосов
/ 25 августа 2010

Скажем, у меня есть 3 различные формы, определенные в моем представлении:

# views.py
form_one = FormOne()
form_two = FormTwo()
form_three = FormThree()

В моем шаблоне:

<form action="" method="post" id="form-one">
  {{ form_one.as_table }}
  <input type="submit" value="Submit Form One" name="form-one" />
</form>

<form action="" method="post" id="form-two">
  {{ form_two.as_table }}
  <input type="submit" value="Submit Form Two" name="form-two" />
</form>

<form action="" method="post" id="form-three">
  {{ form_three.as_table }}
  <input type="submit" value="Submit Form Three" name="form-three" />
</form>

Предполагая, что каждая форма имеет свои уникальные имена полей, какЯ обрабатываю все 3 формы из одного вида?Я думал о следующем методе, но я не уверен, что это лучший способ решить эту проблему:

# views.py

if request.method == 'POST':
    request_post = request.POST
    if 'form-one' in request_post:
        form_one = FormOne(request.POST)
    elif 'form-two' in request_post:
        form_two = FormTwo(request.POST)
    else:
        form_three = FormThree(request.POST)
else:
    form_one = FormOne()
    form_two = FormTwo()
    form_three = FormThree()

Есть комментарии или предложения?

Ответы [ 3 ]

4 голосов
/ 25 августа 2010

Правильный способ обработки нескольких форм - использование атрибута «prefix» при создании форм.Вот как должен выглядеть ваш вид:

if request.method == 'POST':
    form1 = Form1(request.POST, prefix='form1')
    form2 = Form2(request.POST, prefix='form2')
    form3 = Form3(request.POST, prefix='form3')

    if form1.is_valid() and form2.is_valid() and form3.is_valid():
        # Do whatever you have to do
        pass

else:
    form1 = Form1(prefix='form1')
    form2 = Form2(prefix='form2')
    form3 = Form3(prefix='form3')

Шаблон остается прежним, никакой дополнительной логики там не требуется:

<form ...>
    {{ form1.as_table }}
    {{ form2.as_table }}
    {{ form3.as_table }}

    <input type="submit" ... />
</form>
3 голосов
/ 25 августа 2010
  1. Моя первая мысль - вы можете добавить '? Form_id = 1' к каждому атрибуту действия формы.

    <form action="?form_id=1" method="post" id="form-one">
    

    По виду:

    form_id = request.GET.get('form_id', None)
    if form_id == '1':
        form_one = FormOne(request.POST)
    
  2. Другой вариант - создать отдельные URL для публикации.

    в urls.py

    url(r'^form1/$', 'someapp.views.process_forms', {'form_class': FormOne}, name='form_one_page'),
    url(r'^form2/$', 'someapp.views.process_forms', {'form_class': FormTwo}, name='form_one_page'),
    url(r'^form3/$', 'someapp.views.process_forms', {'form_class': FormThree}, name='form_one_page'),
    

    в views.py:

    def process_forms(request, form_class=None):
        ...
        form = form_class(data=request.POST)
        ...
    
  3. Вы можете проверить имя кнопки отправки, так как вы используете их в кнопке отправки.

    if request.POST.has_key('form-one'):
        ...
    elif request.POST.has_key('form-two'):
        ...
    elif request.POST.has_key('form-three'):
        ...
    else:
        ...
    

0 голосов
/ 25 августа 2010

У меня была похожая проблема на сайте, над которым я работаю.У меня сейчас нет кода, но я думаю, что сделал что-то вроде этого:

if request.method == 'POST': 
    valid = False
    form = FormOne(request.POST) 
    if form.is_valid():
        #handle case where use submitted FormOne
        valid = True

    form = FormTwo(request.POST) 
    if form.is_valid():
        #handle case where use submitted FormTwo
        valid = True

    form = FormThree(request.POST) 
    if form.is_valid():
        #handle case where use submitted FormThree
        valid = True

    if not valid:
        #handle case where none of the forms were valid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...