2017-05-30 98 views
0

我已經爲工作人員選擇了他們的名字。 我的目標是當用戶不選擇他們的名字,而是在選擇「---」上留下下拉框時,在這種情況下,我希望ValidationError然後打印它的消息。此刻我測試時沒有打印任何內容。WTForms似乎無法驗證SelectField框

這裏是我的forms.py文件:

from flask_wtf import Form 
from wtforms import StringField, BooleanField, SelectField 
from wtforms.validators import DataRequired, Required, ValidationError 

class StaffNames(Form): 
     staff = SelectField(
     'staff', 
     choices=[("", "---"), ('1', 'John Jones'), ('2', 'Chris Hughes'), ('3', 'Lyn Fox')], 
     ) 
     def validate_staff(form, field): 
       if field.data is "---": 
         raise ValidationError("Sorry, you havn't chosen a staff name") 

這裏是我的view.py文件:

from flask import render_template, flash, redirect 
from app import app 
from .forms import StaffNames 

@app.route('/') 
@app.route('/index', methods=['GET', 'POST']) 
def index(): 
    form = StaffNames() 
    if form.validate_on_submit(): 
     return redirect('/results') 
    return render_template('index.html', 
          title='RA Index Search', 
          form=form) 

,這裏是我的index.html它涉及到這種形式:

<!-- extend base layout --> 
{% extends "base.html" %} 

{% block content %} 
<center> 
    <h1>Search</h1> 
    <form action="" method="post" name="login"> 

     <p>{{ form.staff }} Select your name</p> 
     <p><input type="submit" value="Search"></p> 
    </form> 

{% endblock %} 

任何人都可以看到我做錯了什麼或建議一個替代品,不會融化我的大腦!笑 感謝

回答

0

至於我看到有兩個錯誤在你的代碼:

  1. 您需要包括csrc_token in your template form否則你form.validate_on_submit()方法將總是返回False。另外請確保您將app.config['SECRET_KEY']設置爲某個值。

  2. 在您的驗證方法中,您檢查SelectBox的數據屬性是「---」。這將不會發生,因爲data引用您在choices列表中傳遞的元組的第一個值。

更改validate_staff方法通過以下方式和你應該罰款:

def validate_staff(form, field): 
    if field.data == "": 
     raise ValidationError("Sorry, you havn't chosen a staff name") 

class StaffNames(Form): 

    staff = SelectField(
     'staff', 
     choices=[ 
      ("", "---"), ('1', 'John Jones'), ('2', 'Chris Hughes'), ('3', 'Lyn Fox')], 
     validators=[validate_staff], 
    ) 

注意:您需要將validate_staff功能傳遞給StaffNames形式,否則驗證永遠的驗證列表被觸發。我相應地改變了上面的代碼。