Flask-WTF-创建一个必须唯一且不能留空的字段

时间:2018-09-29 16:56:50

标签: flask sqlalchemy flask-wtforms

在model.py

github = db.Column(db.String(120), unique=True, nullable=True)

emergency_number = db.Column(db.String(12),unique=True,nullable=True)

form.py

github = StringField('Github')

emergency_number = StringField('Emergency Number',validators=[Length(min=10,max=12)])

我想创建一个数据库,使,用户不能输入此表单并将其留空,但是如果用户输入,则内容应该是唯一的

但是问题是,如果第一个用户将其保留为空白,则其他用户无法将其保留为空

此github帐户为takem。请选择其他帐户

字段必须介于10到12个字符之间。

这些表格的错误

1 个答案:

答案 0 :(得分:0)

一个custom validator就可以了。

class FooForm(FlaskForm):
    emergency_number = StringField('Emergency Number',validators=[Length(min=10,max=12)])
    def validate_emergency_number(form, field):
        if not field.raw_data:
            number = Foo.query.filter_by(emergency_number=form.field.data).first()
            if number:
                raise ValidationError('Emergency number must be unique')
        raise ValidationError('Emergency number cannot be blank')

您还可以创建一个新的验证器。

from wtforms.validators import ValidationError

class Unique(object):
    def __init__(self, model, field, message='Emergency number should be unique'):
        self.model = model
        self.field = field

    def __call__(self, form, field):
        if not field.raw_data:
            check = self.model.query.filter(self.field == field.data).first()
            if check:
                raise ValidationError(self.message)
        raise ValidationError(message='Emergency number cannot be blank')

emergency_number = StringField('Emergency Number',validators=[Length(min=10,max=12), Unique(Foo, Foo.emergency_number)])