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

How to reuse a wtform for updating and adding records in the database

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

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 变量需要是一个 class 实例变量。这将允许您在创建 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