以下是我在做实战时遇到的问题,两个类因为标红的语句的写法不一致而导致form.validate_on_submit()=False,以致于数据库操作没有执行。引以为戒。
此外,当出现这种情况的时候建议debug。
除此之外,还有别的情况:
1.忘了在表单中加入{{ form.csrf_token }}, 导致validate_on_submit验证不通过。
也有可能是flask官网更新了csrf_token的用法,详情见flask官网:https://flask.palletsprojects.com/en/1.1.x/
2.表单里StringField和PasswordField没有validators,如果表单里没有写validators的话,相当于提交的表单内容是空,后端的form.validate_on_submit()就会一直是false。或者是有validators,但是没有写DataRequired。
class MovieForm(FlaskForm): title = StringField( label='片名', validators=[ DataRequired('请输入片名!') ], description='片名', render_kw={ 'class': "form-control", 'placeholder': "请输入标签名称!" } ) url = FileField( label='电影文件', validators=[ DataRequired('请上传电影文件!') ], description='电影文件', ) info = TextAreaField( label='简介', validators=[ DataRequired('请输入简介!') ], description='简介', render_kw={ 'class': "form-control", 'rows': "10", } ) logo = FileField( label='封面', validators=[ DataRequired('请上传封面!') ], description='封面', ) star = SelectField( label='星级', validators=[ DataRequired('请选择星级!') ], description='星级', coerce=int, choices=[(1, '1星'), (2, '2星'), (3, '3星'), (4, '4星'), (5, '5星')], render_kw={ 'class': "form-control" } ) tag_id = SelectField( label='标签', validators=[ DataRequired('请选择标签!') ], coerce=int, # choices=[(tag.id, tag.name) for tag in Tag.query.all()], description='标签', render_kw={ 'class': "form-control" } ) def __init__(self, *args, **kwargs): super(MovieForm, self).__init__(*args, **kwargs) self.tag_id.choices = [(v.id, v.name) for v in Tag.query.all()] area = StringField( label='上映地区', validators=[ DataRequired('请输入上映地区!') ], description='上映地区', render_kw={ 'class': "form-control", 'placeholder': "请输入上映地区!" } ) length = StringField( label='播放时长(分钟)', validators=[ DataRequired('请输入播放时长!') ], description='播放时长', render_kw={ 'class': "form-control", 'placeholder': "请输入播放时长!", } ) release_time = StringField( label='上映时间', validators=[ DataRequired('请选择上映时间!') ], description='上映时间', render_kw={ 'class': "form-control", 'placeholder': "请选择上映时间!", 'id': "input_release_time" # 由于使用了时间控件,需要指定id } ) submit = SubmitField( label='提交', render_kw={ 'class': "btn btn-primary" } )
class MovieForm1(FlaskForm): title = StringField( label="片名", validators=[ DataRequired("请输入片名!") ], description="片名", render_kw={ "class": "form-control", "placeholder": "请输入片名!" } ) name = StringField( label="名称", validators=[ DataRequired("请输入标签!") ], description="标签", render_kw={ "class": "form-control", "id": "input_name", "placeholder": "请输入标签名称!" } ) url = FileField( label="文件", validators=[ DataRequired("请上传文件!") ], description="文件", ) info = TextAreaField( label="简介", validators=[ DataRequired("请输入简介!") ], description="简介", render_kw={ "class": "form-control", "row": "10" } ) logo = FileField( label="封面", validators=[ DataRequired("请上传封面!") ], description="封面", ) star = SelectField( label="星级", validators=[ DataRequired("请选择星级!") ], coerce=int, choices=[(1, "1星"), (2, "2星"), (3, "3星"), (4, "4星"), (5, "5星")], render_kw={ "class": "form-control" } ) tag_id = SelectField( label="标签", validators=[ DataRequired("请选择标签!") ], coerce=int, choices=[(v.id, v.name) for v in tags], render_kw={ "class": "form-control" } ) area = StringField( label="地区", validators=[ DataRequired("请输入地区!") ], description="地区", render_kw={ "class": "form-control", "placeholder": "请输入地区!" } ) length = StringField( label="片长", validators=[ DataRequired("请输入片长!") ], description="片长", render_kw={ "class": "form-control", "placeholder": "请输入片长!" } ) release_time = StringField( label="上映时间", validators=[ DataRequired("请选择上映时间!") ], description="上映时间", render_kw={ "class": "form-control", "placeholder": "请选择上映时间!", "id": "input_release_time" } ) submit = SubmitField( '提交', render_kw={ "class": "btn btn-primary" } )