我有一个由类(class)创建的注册表:
class RegistrationForm (Form):
username = StringField('username', validators = [DataRequired()])
和模型:
class User (db.Model):
UserName = db.Column(db.String(25),nullable=False, unique=True)
我想检查服务器中的用户名字段是否重复,然后返回该字段的错误...是否可以不使用闪存消息?
因为我使用宏 formhelper 在包含错误的字段旁边显示字段错误..
或者有没有办法指定该字段在验证器中是唯一的?
谢谢:
宏:
{% macro render_field(field) %}
{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul>
{% for error in field.errors %}
<li style="color:red">{{ error }}</li>
{% endfor %}
<li style="color:red">{{ error_message }}</li>
</ul>
{% endif %}
{% endmacro %}
最佳答案
在表单上定义方法“validate_<字段名称>”。这将运行您想要的任何自定义验证。在这种情况下,检查用户名是否已被使用,如果是则引发错误。
from flask_wtf import Form
from wtforms.fields import StringField
from wtforms.validators import ValidationError, InputRequired
class RegistrationForm(Form):
username = StringField('username', validators=[InputRequired()])
def validate_username(self, field):
# count the number of user ids for that username
# if it's not 0, there's a user with that username already
if db.session.query(db.func.count(User.id)).filter_by(username=field.data).scalar():
raise ValidationError('this username is already taken')
作为一种优化,这会计算 id 字段,而不是实际获取或计算整个模型。
请参阅WTForms docs了解更多信息。
<小时/>请注意,有些人认为这是一个安全问题,因为攻击者可以通过在此处尝试并查看是否失败来确定名称是否已注册。
关于python - 如何从 FlaskWTF 的 View 中以自定义方式引发字段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27556449/