如何重用 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
这是我用于注册新项目和更新现有项目的表格:
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