2016-09-28 5 views
0

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

{% extends "base.html" %} 
{% import "bootstrap/wtf.html" as wtf %} 

{% block page_content %}             
<div class="page-header">             
    <h1>Edit Profile</h1> 
</div> 

{{ wtf.quick_form(form_profile, form_type='horizontal') }}     

<hr> 

{{ wtf.quick_form(form_reset, form_type='horizontal') }}     

<hr> 
{% endblock %} 

В каждой форме есть кнопка отправки.

В функции маршрута, я пытался отделить две формы, как этот

form_profile = ProfileForm() 
form_reset = ResetForm() 

if form_profile.validate_on_submit() and form_profile.submit.data: 
    .... 
if form_reset.validate_on_submit() and form_reset.submit.data: 
    ..... 

Но это не сработало. Когда я нажимаю кнопку в ResetForm, выполняется логика проверки профиля ProfileForm.

Я подозреваю, что проблема заключается в том, что wtf.quick_form() создает две идентичные кнопки отправки, но не уверен.

Что делать в этом случае? Может bootstrap/wtf.html шаблон дело с этой ситуацией?

ответ

2

Определить это два SubmitField с разными названиями, например:

class Form1(Form): 
    name = StringField('name') 
    submit1 = SubmitField('submit') 

class Form2(Form): 
    name = StringField('name') 
    submit2 = SubmitField('submit') 

Тогда в view.py:

.... 
form1 = Form1() 
form2 = Form2() 

if form1.submit1.data and form1.validate_on_submit(): # notice the order 
.... 
if form2.submit2.data and form2.validate_on_submit(): # notice the order 
.... 

Теперь проблема была решена.

Если вы хотите погрузиться в него, продолжайте читать.

Вот validate_on_submit():

def validate_on_submit(self): 
     """ 
     Checks if form has been submitted and if so runs validate. This is 
     a shortcut, equivalent to ``form.is_submitted() and form.validate()`` 
     """ 
     return self.is_submitted() and self.validate() 

А вот is_submitted():

def is_submitted(self): 
     """ 
     Checks if form has been submitted. The default case is if the HTTP 
     method is **PUT** or **POST**. 
     """ 

     return request and request.method in ("PUT", "POST") 

Когда вы звоните form.validate_on_submit(), это проверить, если форма не была отправлена ​​методом HTTP, независимо от того, который подают кнопка была нажата , Таким образом, маленький трюк выше - это просто добавить фильтр (чтобы проверить, есть ли у источника данные, т. Е. form1.submit1.data).

Кроме того, мы меняем порядок, если, поэтому, когда мы нажимаем кнопку «Отправить», , он вызывает только проверку подлинности() на эту форму, предотвращая ошибку проверки для обеих форм.

История еще не закончена. Вот .data:

@property 
def data(self): 
    return dict((name, f.data) for name, f in iteritems(self._fields)) 

Он возвращает Dict с именем поля (ключ) и поле данных (значение), тем не менее, наша две отправки формы кнопка имеет то же имя submit (ключ)!

Когда мы нажимаем на кнопку первого представить (в Form1), вызов от form1.submit1.data возвратной Dict, как это:

temp = {'submit': True} 

Существует никаких сомнений в том, когда мы называем if form1.submit.data:, это вернуть True.

Когда мы нажимаем вторую кнопку отправки (в form2), вызов .data в if form1.submit.data: добавить ключ-значение в Словаре первый, то вызов из if form2.submit.data: добавить еще один ключ-значение, в конце концов, в Dict понравится:

temp = {'submit': False, 'submit': True} 

Теперь мы называем if form1.submit.data:, он вернется True, даже если кнопка отправить мы нажали был в form2.

Вот почему нам нужно определить эти два SubmitField с разными названиями. Кстати, спасибо за чтение (здесь)!

Спасибо за уведомление nos, он добавляет вопрос о validate(), ознакомьтесь с комментариями ниже!

+0

Спасибо за подсказку. Я также заметил, что 'и form1.submit1.data' больше не нужны. – nos

+0

Добро пожаловать, но я хочу, чтобы 'и form1.submit1.data' был необходим, вместо этого можно удалить второй фильтр' form2.submit2.data'. Я обновляю ответ. –

+0

Еще раз спасибо за расширенное объяснение. Я заметил, что есть еще одна проблема: когда валидация первой формы выходит из строя, появляется сообщение об ошибке из обеих форм, что запутывает пользователей, поскольку они могут подумать, что обе формы должны быть заполнены. Проблема в том, что валидация формы всегда вызывается для 2-й формы. Его можно решить, изменив логику в 'if', то есть' if form2.submit2.data и form2.validate_on_submit(): '. Затем, если форма не отправлена, она не проверяется. – nos

Смежные вопросы