如何解决如何为Flask应用制作自定义WTforms验证器,以将表单限制为每个用户只能提交一次
我有一个Flask应用,该应用具有如下所示的提交表单,但是我想限制用户只能提交一次表单。以下是我的代码不起作用:验证错误不会发生,并且用户可以无限次提交。
class WorkScoreForm(FlaskForm):
wq1= RadioField('blah blah',choices=[(1,'Not important at all'),(2,'Somewhat unimportant'),(3,'Neutral'),(4,'Somewhat important'),(5,'Very important')],validators=[DataRequired()])
wq2= RadioField('blah blah','I strongly disagree'),'I disagree somewhat'),'I agree somewhat'),'I strongly agree')],validators=[DataRequired()])
def validate_workscore(self,form):
submit_id = current_user.id
sub = Workscore.query.filter_by(user_id=submit_id).first()
if sub:
raise ValidationError('You have already submitted this form once!.')
这是路线python代码:
@app.route("/quiz",methods=["GET","POST"])
@login_required
def quiz():
form = WorkScoreForm()
if form.validate_on_submit():
workscore = Workscore(wq1=form.wq1.data,wq2=form.wq2.data,wq3=form.wq3.data,wq4=form.wq4.data,wq5=form.wq5.data,wq6=form.wq6.data,ss1=form.ss1.data,ss2=form.ss2.data,ss3=form.ss3.data,ss4=form.ss4.data,ss5=form.ss5.data,ss6=form.ss6.data,fam1=form.fam1.data,fam2=form.fam2.data,fam3=form.fam3.data,fam4=form.fam4.data,fam5=form.fam5.data,fam6=form.fam6.data,fr1=form.fr1.data,fr2=form.fr2.data,fr3=form.fr3.data,fr4=form.fr4.data,fr5=form.fr5.data,fr6=form.fr6.data,hf1=form.hf1.data,hf2=form.hf2.data,hf3=form.hf3.data,hf4=form.hf4.data,hf5=form.hf5.data,hf6=form.hf6.data,gb1=form.gb1.data,gb2=form.gb2.data,gb3=form.gb3.data,gb4=form.gb4.data,gb5=form.gb5.data,gb6=form.gb6.data,spi1=form.spi1.data,spi2=form.spi2.data,spi3=form.spi3.data,spi4=form.spi4.data,spi5=form.spi5.data,spi6=form.spi6.data,ws1=form.ws1.data,ws2=form.ws2.data,ws3=form.ws3.data,ws4=form.ws4.data,rl1=form.rl1.data,rl2=form.rl2.data,rl3=form.rl3.data,rl4=form.rl4.data,rl5=form.rl5.data,rl6=form.rl6.data,author=current_user)
db.session.add(workscore)
db.session.commit()
flash('Your quiz has been submitted!','success')
return redirect(url_for('results'))
return render_template("quiz.html",title="Quiz",form=form)
解决方法
首先,validate_workscore()
需要返回一些内容。与其引发错误,不如返回True
和False
:
def validate_workscore(self):
submit_id = current_user.id
sub = Workscore.query.filter_by(user_id=submit_id).first()
if sub:
return False
else:
return True
此功能也不需要参数form
。
第二,您在任何时候都不会调用函数validate_workscore
,这意味着它不会运行。您的视图函数可能看起来像这样:
@app.route("/quiz",methods=["GET","POST"])
@login_required
def quiz():
form = WorkScoreForm()
if form.validate_workscore():
if form.validate_on_submit():
workscore = Workscore(#all your arguments)
db.session.add(workscore)
db.session.commit()
flash('Your quiz has been submitted!','success')
return redirect(url_for('results'))
return render_template("quiz.html",title="Quiz",form=form)
else:
return render_template("formerror.html")
我看不到在表单验证时将user_id参数传递给数据库,只有author=current_user
,这不是您在WorkScoreForm中查询的参数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。