gpt4 book ai didi

python - 使用相同的表单来创建和更新但不同的验证逻辑

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:37 25 4
gpt4 key购买 nike

我有一个 FlaskForm 类,我在其中验证字段值是否已在系统中,并在需要时引发 ValidationError。

def validate_username(self, username_field):
if User.query.filter_by(username=username_field.data).first():
raise ValidationError("This username is already taken.")

对于用户,我最终实际上必须使用不同的验证执行单独的 Form 类才能更新模型。

def validate_username(self, username_field):
if current_user.username != username_field.data:
if User.query.filter_by(username=username_field.data).first():
raise ValidationError("Cannot change username to this as it already is taken.")

但现在我需要使用另一个模型来完成此操作,我无法从 Form 类访问该模型,因为它不与用户绑定(bind)(它取决于正在编辑的记录)。我不确定如何进行此验证,并且如果可能的话,我不希望为这些模型使用两个 FlaskForm 类。

有没有办法将某些验证方法仅应用于某个操作(创建与更新),或者我是否必须为每个具有唯一字段的模型编写多个 FlaskForm 类?

我认为这种设计模式一定会经常出现,但找不到处理它的好例子。

最佳答案

每个模型可以使用一个 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>

您使用 bool 值add_user来区分添加或编辑现有用户。可能不需要为此编写单独的验证器。

希望这有帮助。

关于python - 使用相同的表单来创建和更新但不同的验证逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44703577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com