1

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

有 3 个选项:

  1. 在数据库模型中,我有一个ItemType类,我放了一个函数add()来检查现有项目是否存在

  2. 在视图中,因此在页面的路由中form.validate_on_submit(),我从 wtforms 进行检查以从数据库中获取数据,如果存在,我将在此处输入错误

  3. 在 wtforms中,在类validate()的默认验证之后添加额外的验证Form

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

4

1 回答 1

2

在我看来,如果它来自一个表单,那么它应该在该表单上进行验证,然后在该特定字段无效时引发错误。请参见下面的示例:

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)
于 2016-05-14T15:29:50.367 回答