2015-11-24 42 views
0

我的验证器似乎没有捕获错误。我可以在状态字段中输入20个字符的名称,或者不输入任何内容,并且适用的WTForm验证程序将其忽略并将其发送给ORM。我希望它在发送到数据库之前捕获验证错误,并在其中引发NOT NULL错误等。我需要强制用户在将错误输入发送到数据库之前进行纠正。我究竟做错了什么?验证器没有捕获错误

forms.py:

class ShelterForm(Form): 
    name = StringField('Name', 
     [validators.InputRequired(), 
     validators.Length(
      max=50, 
      message="Limit 50 characters, please try again.")]) 
    address = StringField('Address', 
     [validators.InputRequired(), 
     validators.Length(
      max=30, 
      message="Limit 30 characters, please try again.")]) 
    city = StringField('City', 
     [validators.InputRequired(), 
     validators.Length(
      max=20, 
      message="Limit 20 characters, please try again.")]) 
    state = StringField('State', 
     [validators.InputRequired(), 
     validators.Length(
      max=13, 
      message="Limit 13 characters, please try again.")]) 
    zipCode = IntegerField('zipCode', 
     [validators.InputRequired(), 
     validators.Length(
      max=10, 
      message="xxxxx or xxxxx-xxxx")]) 
    website = StringField('Website', 
     [validators.InputRequired()]) 
    maximum_capacity = IntegerField('maximum_capacity', 
     [validators.InputRequired()]) 

views.py

from PuppyShelter import app 
from PuppyShelter import models 
from PuppyShelter import forms 
from flask import render_template, url_for, request, redirect, flash, jsonify 

@app.route('/shelters/shelternew', methods = ['GET','POST']) 
    def shelterNew(): 
     form = forms.ShelterForm() 
     if request.method == "POST": 
      new_shelter = { 
       'name': form.name.data, 
       'address': form.address.data, 
       'city': form.city.data, 
       'state': form.state.data, 
       'zipCode': form.zipCode.data, 
       'website': form.website.data, 
       'maximum_capacity': form.maximum_capacity.data} 
      models.createShelter(new_shelter) 
      flash('A new shelter has been opened!') 
      return redirect(url_for('shelters')) 
     else: 
      return render_template('shelterNew.html', form = form) 

shelterNew.py

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <link rel=stylesheet type=text/css href="{{url_for('static', filename='bootstrap.css') }}" 
</head> 
    <body> 
     <div> 
     <legend>New Shelter</legend> 
     <form method ='POST' actions='/shelterNew' enctype="multipart/form-data"> 
      {{ form.csrf_token }} 
     <div class="form-group col-xs-4"> 
      <label for="shelter-name">Name</label> 
      {{ form.name(class="form-control", placeholder="Name") }} 
      {% if form.name.errors %} 
       <div class="alert alert-info" role="alert"> 
        {% for error in form.name.errors %} 
        {{ error }} 
        {% endfor %} 
       </div> 
      {% endif %} 
     </div> 
     <div class="form-group col-xs-6"> 
      <label for="shelter-address">Address</label> 
      {{ form.address(class="form-control", placeholder="Address") }} 
      {% if form.address.errors %} 
       <div class="alert alert-info" role="alert"> 
        {% for error in form.address.errors %} 
        {{ error }} 
        {% endfor %} 
       </div> 
      {% endif %} 
     </div> 
     <div class="form-group col-xs-4"> 
      <label for="shelter-city">City</label> 
      {{ form.city(class="form-control", placeholder="City") }} 
      {% if form.city.errors %} 
       <div class="alert alert-info" role="alert"> 
        {% for error in form.city.errors %} 
        {{ error }} 
        {% endfor %} 
       </div> 
      {% endif %} 
     </div> 
     <div class="form-group col-xs-4"> 
      <label for="shelter-state">State</label> 
      {{ form.state(class="form-control", placeholder="State") }} 
      {% if form.state.errors %} 
       <div class="alert alert-info" role="alert"> 
        {% for error in form.state.errors %} 
        {{ error }} 
        {% endfor %} 
       </div> 
      {% endif %} 
     </div> 
     <div class="form-group col-xs-3"> 
      <label for="shelter-zipCode"></label> 
      {{ form.zipCode(class="form-control", placeholder="Zip") }} 
      {% if form.zipCode.errors %} 
       <div class="alert alert-info" role="alert"> 
        {% for error in form.zipCode.errors %} 
        {{ error }} 
        {% endfor %} 
       </div> 
      {% endif %} 
     </div> 
     <div class="form-group col-xs-12"> 
      <label for="shelter-website">Website</label> 
      {{ form.website(class="form-control", placeholder="enter url here") }} 
      {% if form.website.errors %} 
       <div class="alert alert-info" role="alert"> 
        {% for error in form.website.errors %} 
        {{ error }} 
        {% endfor %} 
       </div> 
      {% endif %} 
     </div> 
     <div class="form-group col-xs-4"> 
      <label for="shelter-maximum_capacity">Maximum Capacity</label> 
      {{ form.maximum_capacity(class="form-control", placeholder="Maximum Capacity") }} 
      {% if form.maximum_capacity.errors %} 
       <div class="alert alert-info" role="alert"> 
        {% for error in form.maximum_capacity.errors %} 
        {{ error }} 
        {% endfor %} 
       </div> 
      {% endif %} 
     </div> 
     </br> 
     <div> 
     <input class="btn btn-success" type='submit' value='Create'> 
     <input class="btn btn-warning" type='reset' value='Reset'> 
     </div></br> 
     </form> 
     </br></br> 
     <a href='{{url_for('shelters')}}'class="btn btn-success btn-lg active" role="button"> Shelters.</a> 
     <a href='{{url_for('puppies')}}'class="btn btn-success btn-lg active" role="button"> Puppies.</a> 
     <a href='{{url_for('owners')}}'class="btn btn-success btn-lg active" role="button"> Owners.</a> 

     </div> 
    </body> 
</html> 

回答

0

,我发现我的解决方案。我忘了将and form.validate()添加到我的if request.method == "POST": 所以错误发生在view.py中。这里是工作代码:

def shelterNew(): 
    form = forms.ShelterForm(request.form) 
    if request.method == "POST" and form.validate(): 
     new_shelter = { 
      'name': form.name.data, 
      'address': form.address.data, 
      'city': form.city.data, 
      'state': form.state.data, 
      'zipCode': form.zipCode.data, 
      'website': form.website.data, 
      'maximum_capacity': form.maximum_capacity.data} 
     models.createShelter(new_shelter) 
     flash('A new shelter has been opened!') 
     return redirect(url_for('shelters')) 
    else: 
     return render_template('shelterNew.html', form = form)