WTForms验证不起作用(Flask + mongodb)

时间:2017-10-07 22:12:15

标签: mongodb flask wtforms

我有一个简单的网页,可以从mongo中检索和编辑json数据。 将文章添加到mongo工作正常以及验证。 名称字段的验证设置在4到20之间,upc在4到12之间。 但是当我尝试使用编辑块获取相同的先前创建的文章(项目)并且如果我想要更改某些内容时,它将保存它而不进行任何验证(即使,如果我为upc输入15位数字),那么如果我第二次打开同一个文件,再次进行一些更改并尝试保存,验证失败。它只是继续抛出一个错误,如“字段长度必须在4到20个字符之间”,即使它已经在限制范围内。我怀疑这与从json文件渲染这些字段到视图有关,但我不确定。我已经尝试过实现csrf保护,但它没有帮助。

所以这是app.py

class ArticleForm(Form):
class Meta:
    csrf = True
    csrf_class = SessionCSRF
    csrf_secret = b'EPj00jpfj8Gx1SjnyLxwBBSQfnQ9DJYe0Ym'

    @property
    def csrf_context(self):
        return session

name = StringField('Name', [validators.length(min=4, max=200)])
upc = StringField('UPC', [validators.length(min=4, max=12)])


#Edit Item
@app.route('/edit_item/<string:id>', methods=['GET','POST'])
@is_logged_in
def edit_item(id):
coll = mongo.db.items
item = coll.find_one({'_id': ObjectId(id)})

form = ArticleForm(request.form)

form.name.data = item['name']
form.upc.data = item['upc']

if request.method == 'POST' and form.validate():
    name = request.form['name']
    upc = request.form['upc']
    author = session['username']

#Update fields in database
    coll.update({'_id':ObjectId(id)}, {'$set': {'name': name, 'upc': upc}})

    flash('You have successfully added the item!', 'success')

    return redirect(url_for('dashboard'))
return render_template('edit_item.html', form=form)    

这是render_field块:

{% macro render_field(field) %}
  {{ field.label }}
  {{ field(**kwargs)|safe }}
  {% if field.errors %}
    {% for error in field.errors %}
      <span class="help-inline">{{ error }}</span>
    {% endfor %}
  {% endif %}
{% endmacro %}    

观看:

{% extends 'layout.html' %}

{% block body %}
  <h1>Edit Item</h1>
  {% from "includes/_formhelpers.html" import render_field %}
  <form method="POST" action="">
  {{ form.csrf_token }}
    <div class="form-group">
      {{ render_field(form.name, class="form-control") }}
    </div>
    <div class="form-group">
      {{ render_field(form.upc, class="form-control") }}
    </div>
    <p><input class="btn btn-primary" type="submit" value="Submit">
  </form>
{% endblock %}

0 个答案:

没有答案