如何重用wtform来更新和添加数据库中的记录

问题描述

这是我用来注册新项目和更新现有项目的表格:

class ProjDataForm(FlaskForm):
    proj_key = StringField("Project Key",validators=[Datarequired()])
    ...
    def validate_proj_key(self,proj_key):
            raise ValidationError("That Project Key already exists.")

这是我的模特

class ProjectData(db.Model):
    proj_key = db.Column(db.String(20),unique=True,nullable=False)

添加自定义验证,因此我可以使用唯一的“ proj_key”来注册新项目。

我做了什么但仍然没有奏效(尽管我很可能犯了错误):

#forms
class ProjDataForm(FlaskForm):
    ...
    new_proj = True
    if new_proj == True:
        def validate_proj_key(self,proj_key)
            raise ValidationError("That Project Key already exists.")

#routes
form = ProjDataForm()
form.new_proj = False
if form.new_proj == False and form.validate_on_submit():
    ...

我知道我的设计不好,应该重新设计,但我只是想知道是否有可能忽略自定义验证。

解决方法

new_pro变量必须是类实例变量。这样,您可以在创建ProjDataForm实例时设置其状态,并可以通过validate_proj_key方法进行访问。

例如:

覆盖ProjDataForm __init__方法,添加参数is_new_project,如下所示:

class ProjDataForm(FlaskForm):

    def __init__(self,is_new_project,*args,**kwargs):
        super(ProjDataForm,self).__init__(*args,**kwargs)
        # super().__init__(*args,**kwargs) for Python 3
        self.is_new_project = is_new_project

现在,您可以在自定义验证器中访问is_new_project实例变量:

class ProjDataForm(FlaskForm):

    def __init__(self,**kwargs) for Python 3
        self.is_new_project = is_new_project


    def validate_proj_key(self,proj_key)
        # Do we need to validate the project key? Check if the is_new_project instance variable is true
        if self.is_new_project:
            # Check if project_key exists or not
            # blah blah
            raise ValidationError("That Project Key already exists.")

在您的路线中,使用适当的is_new_project值构造表格:

@app.route('/new_project',methods=['GET','POST'])
def new_project_route()

    form = ProjDataForm(is_new_project=True)

    if form.validate_on_submit():

        # blah blah
        pass


@app.route('/edit_project','POST'])
def edit_project_route()

    form = ProjDataForm(is_new_project=False)

    if form.validate_on_submit():

        # blah blah
        pass