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

2024-09-30 19:30:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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_密钥”来注册一个新项目

我所做的和仍然不起作用的事情(尽管我很可能犯了错误):

#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():
    ...

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


Tags: 项目keyformprojectfalsetruenewdb
1条回答
网友
1楼 · 发布于 2024-09-30 19:30:52

new_pro变量需要是类实例变量。这将允许您在创建ProjDataForm实例时设置其状态,并可在validate_proj_key方法中访问

例如:

重写ProjDataForm{}方法,添加参数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

相关问题 更多 >