首页 > 解决方案 > 如何重用 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():
    ...

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

标签: pythonflaskflask-wtformswtforms

解决方案


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, 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


    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', methods=['GET', 'POST'])
def edit_project_route()

    form = ProjDataForm(is_new_project=False)

    if form.validate_on_submit():

        # blah blah
        pass

推荐阅读