python - 如何重用 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():
...
我知道我的设计不好,我应该重新设计它,但我只是想知道是否可以忽略自定义验证。
解决方案
该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
推荐阅读
- python - 如何在 html 文件中使用 Jinja 标签自动包装语句
- c++ - 如何在 C++ 中将另一个类引用到另一个类中?
- compiler-errors - 尝试在我的 shopify 商店上安装应用程序时出错
- javascript - JavaScript 中的录音问题,一些录音丢失
- c# - ImageSource 已在 Collection View 中加载闪烁
- c - 每当我使用扩展 ascii(unsigned char) 时,Printf 都会显示这个
- python - Heroku 芹菜工人坠毁
- html - 如何移动
- node.js - 如何通过 kubernetes 将变量传递给 Reactjs
- influxdb-2 - 在 influxdb2 上使用 CLI 配置 Scraper