【问题标题】:Append custom validator to an extra field将自定义验证器附加到额外字段
【发布时间】:2016-05-29 09:55:31
【问题描述】:

如果输入不是唯一的,我正在寻找一种检查额外字段的方法。使用纯 Flask+WTForms 我可以创建这样的表单类:

class EditProfileAdminForm(Form):
    nickname = StringField('Nickname (login)', validators=[DataRequired()])
    email = StringField('Email', validators=[DataRequired(), Email()])

    def __init__(self, user, *args, **kwargs):
        super(EditProfileAdminForm, self).__init__(*args, **kwargs)
        self.user = user

    def validate_email(self, field):
        if field.data != self.user.email and \
                User.query.filter_by(email=field.data).first():
            raise ValidationError('Email is already registered.')

但是当我实现自定义 ModelView 时如何创建/修改表单类?向 ModelView 添加额外字段如下所示:

class UserModelView(ModelView):
    form_columns = ('f_email', 'nickname')

    form_extra_fields = {
        'f_email': StringField('Email')
    }

简单定义 validate_f_email 不起作用。

【问题讨论】:

    标签: flask wtforms flask-admin


    【解决方案1】:

    我找到了两种方法来针对指定模型验证字段值的唯一性。

    第一种方式

    覆盖 on_model_change() 函数。此函数在创建或更新模型之前执行一些操作

    def on_model_change(self, form, model, is_created):
            if form.f_email.data != model.email and \
                    User.query.filter_by(email=form.f_email.data).first():
                raise ValidationError('Email is already registered.')
            model.email = form.f_email.data
    

    这种方法的缺点是页面顶部会显示错误信息:

    第二种方式

    我还发现 flask-admin 提供了唯一验证器。您需要做的就是将其附加到验证器列表中:

    class UserModelView(ModelView):
        form_columns = ('f_email', 'nickname')
    
        form_extra_fields = {
            'f_email': StringField('Email', validators=[Email(), Unique(db.session,
                                                                        models.User,
                                                                        models.User.email)])
        }
    

    现在显示错误消息,因为它必须:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 2014-03-04
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2019-03-17
      相关资源
      最近更新 更多