将自定义验证程序附加到额外字段

时间:2016-05-29 09:55:32

标签: flask wtforms flask-admin

如果输入不是唯一的,我正在寻找检查额外字段的方法。使用纯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不起作用。

1 个答案:

答案 0 :(得分:0)

我找到了两种方法来验证指定模型的字段值unicity。

第一种方式

覆盖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

此方法的此方法的缺点是页面顶部显示错误消息: enter image description here

第二种方式

我还发现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)])
    }

现在显示错误消息,因为它必须: enter image description here

相关问题