我想知道应该在哪里放置访问数据库的验证表单。
基本上,我将需要用户输入item_type,我想先检查数据库中是否存在item_type

有3个选项:


在数据库模型中,我具有ItemType类,并放置了函数add(),该函数将检查现有项目是否存在
鉴于此,因此在页面的路由中,我从wtforms form.validate_on_submit()进行了检查以从数据库中获取数据,如果存在,我将在此处放入错误
在wtforms validate()中,在默认验证Form类之后添加额外的验证


我见过人们使用数字2和3,但是不确定哪个是最好的。我想要的错误消息也将需要在表单的特定字段上显示(这是通过方法2和3可以实现的,因为它们已经引用了表单字段),但由于与访问数据库有关,因此又可能再次出现。最好将有关数据库访问的所有内容放到模型函数中?

最佳答案

我认为,如果它来自表单,则应在该表单上对其进行验证,然后在无效时针对该特定字段引发错误。参见下面的示例:

class SigninForm(Form):
    """Form for signin"""
    email = StringField('Email',
                        validators=[
                            DataRequired("Email shouldn't be empty."),
                            Email('Email format is not correct.')
                        ])

    password = PasswordField('Password',
                             validators=[DataRequired("Password shouldn't be empty.")])

    def validate_email(self, field):
        """
            verify if account exists and if not raise an error in
            that field.
        """
        user = User.query.filter(User.email == self.email.data).first()
        if not user:
            raise ValueError("Account doesn't exist.")

    def validate_password(self, field):
        """
            Verify if password is valid and if not raise an error in
            that field.
        """
        if self.email.data:
            user = User.query.filter(User.email == self.email.data).first()
            if not user or not user.check_password(self.password.data):
                raise ValueError('Password is not correct.')
            else:
                self.user = user


此示例的视图功能:

@app.route('/signin', methods=['GET', 'POST'])
def signin():
    """Signin"""
    form = SigninForm()
    if form.validate_on_submit():
        # sign in function to register user into a session
        signin_user(form.user)
        return redirect(url_for('site.index'))
    return render_template('account/signin/signin.html', form=form)

10-06 14:05
查看更多