问题描述
这是我用来注册新项目和更新现有项目的表格:
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,**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','POST'])
def edit_project_route()
form = ProjDataForm(is_new_project=False)
if form.validate_on_submit():
# blah blah
pass