我有一个FlaskForm类,我可以验证字段值是否已经在系统中,并在需要时引发ValidationError。
re.findall(r'\d+\.?\d*',str)
对于User,我最终实际上不得不使用不同的验证来执行单独的Form类来启用更新模型。
['8', '52', '30', '52', '2', '0.5']
但是现在我需要使用另一个我无法从Form类访问的模型,因为它不依赖于用户(它取决于正在编辑的记录)。我不确定如何进行此验证,如果可能的话,我不希望这些模型有两个FlaskForm类。
有没有办法将某些验证方法仅应用于某个操作(创建与更新),还是我必须为每个具有必须唯一的字段的模型编写多个FlaskForm类?
我认为这种设计模式必须经常出现,但无法找到处理它的好例子。
答案 0 :(得分:1)
每个型号可以使用一个FlaskForm。这是用户模型的表单类:
class UserForm(FlaskForm):
"""
Form to add or edit a user
"""
username = StringField('username', validators=[DataRequired()])
password = StringField('password', validators=[DataRequired()])
...
然后在views.py中执行此操作:
@app.route('/user/add', methods=['GET', 'POST'])
@login_required
def add_user():
"""
Add a user to the database
"""
add_user = True
form = UserForm()
if form.validate_on_submit():
user = User(...)
...
# store the user in the db
return render_template('/.../user.html', action="Add",
add_user=add_user, form=form,
title="Add User")
@app.route('/user/edit/<int:id>', methods=['GET', 'POST'])
@login_required
def edit_user(id):
"""
Edit a user
"""
add_user = False
user = User.query.get_or_404(id)
form = UserForm(obj=user)
if form.validate_on_submit():
user.username = form.username.data
...
# Here you can check whether new name of the user corresponds
# already existing user
...
return render_template('/.../user.html', action="Edit",
add_user=add_user, form=form,
user=user, title="Edit User")
这就是您的user.html模板的外观:
<div class="...">
{% if add_user %}
<h1>Add User</h1>
{% else %}
<h1>Edit User</h1>
{% endif %}
<br/>
<form action="" method="post" class="form">
{{ form.hidden_tag() }}
{{ wtf.form_errors(form, hiddens="only") }}
{{ wtf.form_field(form.username) }}
{{ wtf.form_field(form.password) }}
...
<div class="form-group">
<input type="submit" value="Submit" class="btn btn-default">
<a href="{{ url_for('app.list_users') }}" class="btn btn-default">
Back
</a>
</div>
</form>
</div>
您使用布尔值add_user
来区分添加或编辑现有用户。可能没有必要为此编写单独的验证器。
希望这有帮助。