我有一个简单的网页,可以从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 %}