【问题标题】:Validators not catching errors验证器没有捕捉到错误
【发布时间】:2015-11-25 10:22:00
【问题描述】:

我的验证器似乎没有发现错误。我可以在 State 字段中输入一个 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>

【问题讨论】:

    标签: python validation flask-wtforms


    【解决方案1】:

    我找到了我的解决方案。我忘记将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)
    

    【讨论】:

      猜你喜欢
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 2019-05-16
      • 1970-01-01
      • 2022-01-19
      • 2017-06-16
      • 2016-01-26
      相关资源
      最近更新 更多