【问题标题】:How to reuse a wtform for updating and adding records in the database如何重用 wtform 在数据库中更新和添加记录
【发布时间】:2020-08-25 13:38:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: python flask flask-wtforms wtforms


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      相关资源
      最近更新 更多