2016-12-23 28 views
0

То, о чем я прошу, на самом деле довольно просто. Я хочу создать форму с некоторыми полями и отправить и Отменить button. Я хочу использовать функцию шаблона quick_form в Flask-Bootstrap, чтобы сохранить накладные расходы на моем шаблоне. Моя форма выглядит следующим образом:WTForms: Отключить проверку на стороне клиента при отмене

from flask_wtf import FlaskForm 
from wtforms.validators import Required, Length 


class SequenceForm(FlaskForm): 
    name = StringField('Name:', validators=[Required(), Length(1, 128)]) 

    # some other fields here 

    submit = SubmitField('submit') 
    cancel = SubmitField('cancel') 

Шаблон:

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

{% block content %} 
    <div class="container"> 
    <form method="POST"> 
     <div class="row"> 
     <div class="col-xs-12"> 
      {{ wtf.quick_form(form, button_map={'submit': 'primary'}) }} 
     </div> 
     </div> 
    </form> 
    </div> 
{% endblock %} 

Как можно было бы подозревать, я хочу, чтобы проверить и принять входные значения на представить и пропустить проверку на отменить. Таким образом, моя функция просмотра выглядит так, как ожидалось.

@main.route('sequence/', methods=['GET', 'POST']) 
def sequence(): 
    form = SequenceForm() 
    if request.method == 'POST': 
     if 'submit' in request.form: 
      if form.validate_on_submit(): 
       print(form.duration.data) 
     else: 
      return redirect(url_for('main.index')) 
    return render_template('sequence.html', form=form) 

Теперь, если отменить нажимаются не должна быть логически никакой проверки и перенаправление должно иметь место. Однако я столкнулся с проблемой, что моя функция просмотра даже не вызвана, если я нажимаю либо submit, либо отменить из-за проверки на стороне клиента.

<input class="form-control" id="name" name="name" required="" type="text" value=""> 

Есть ли способ отключить проверку на стороне клиента на WTForms?

ответ

1

Required проверки достоверности, а также DataRequired и InputRequired которые заменяют Required начиная с версии 3 WTForms установить заменить флаг области. Этот флаг используется для добавления атрибута атрибута в HTML-представление поля. Мое обходное решение заключается в том, чтобы вручную создать функцию проверки подлинности.

from wtforms.validators import ValidationError 

def _required(form, field): 
    if not field.raw_data or not field.raw_data[0]: 
     raise ValidationError('Field is required') 

class SequenceForm(FlaskForm): 
    name = StringField('Name:', validators=[_required, Length(1, 128)]) 

    # some other fields here 

    submit = SubmitField('submit') 
    cancel = SubmitField('cancel') 

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

Примечание

Еще более простое решение заключается в создании подкласса InputRequired валидатор и перезаписать словарь field_flags.

from wtforms.validators import InputRequired 

class MyInputRequired(InputRequired): 
    field_flags =() 

class SequenceForm(FlaskForm): 
    name = StringField('Name:', validators=[MyInputRequired(), Length(1, 128)]) 
+0

Вы можете просто сбросить кортеж флагов установить: класс 'MyInputRequired (wtforms.validators.InputRequired) : 'next line:' field_flags =() '(не может получить правильное форматирование ....) – VPfB

+0

@VPfB Это отличное решение. Если вы хотите создать для него ответ, я бы принял его. – MrLeeh

+0

Я думаю, что это очень похоже на ваше решение. И сначала вы пришли к идее. – VPfB

1

Вы можете запретить оказание required атр.

class MyTextInput(wtforms.widgets.TextInput): 
    def __call__(self, field, **kwargs): 
     kwargs['required'] = False 
     return super().__call__(field, **kwargs) 

Для python2 добавить арг так: super(MyTextInput, self)

, а затем:

name = StringField('Name:', validators=[Required(), Length(1, 128)], widget=MyTextInput()) 
+0

Это хорошее решение для определенного типа поля. Однако, если у меня есть несколько типов полей в моей форме, мне нужно создать отдельный виджет для каждого из них. – MrLeeh

+0

@MrLeeh Да, это правда. Вам просто нужно изменить один из элементов в цепочке (валидатор, флаги, виджет, quick_form) – VPfB