<!-- 需要传入2个参数:要渲染的 form 和点击提交请求的 url -->
{% macro render_form(form, url) %}
<form method="POST" action="{{ url }}">
<!-- 将 csrf_token 渲染在表单开始的位置 -->
{{ form.csrf_token }}
<!-- 迭代每个表单 field -->
{% for field in form %}
<!-- 如果是 csrf_token 就不再渲染了 -->
{% if field.type == 'CSRFTokenField' %}
{{ '' }}
<!-- SubmitField 单独特殊处理 -->
{% elif field.type == 'SubmitField' %}
{{ form.submit(class='btn btn-primary', type='submit') }}
<!-- BooleanField 单独特殊处理 -->
{% elif field.type == 'BooleanField' %}
<div>
<label>{{ field() }} {{ field.label.text }}</label>
</div>
{% else %}
<div>
{{ field.label }} {{ field(class='form-control') }}
</div>
{% endif %}
{% endfor %}
</form>
{% endmacro %}
将login.html使用render_form渲染:
{% extends "base.html" %}
{% from "macros.html" import render_form %}
{% block title %}Login{% endblock %}
{% block body %}
<div>
<h2>登录</h2>
{{ render_form(form, url_for('front.login')) }}
</div>
{% endblock %}
然后在RegisterForm下实现根据表单提交的数据创建用户
from simpledu.models import db, User
class RegisterForm(FlaskForm):
...
def create_user(self):
user = User()
user.username = self.username.data
user.email = self.email.data
user.password=self.password.data
db.session.add(user)
db.session.commit()
return user
在front.py中实现注册功能的路由处理函数:
from flask import flash
from flask import redirect,url_for
@front.route('/register', methods=['GET', 'POST'])
def register():
form = RegisterForm()
if form.validate_on_submit():
form.create_user()
flash('注册成功,请登录!', 'success')
return redirect(url_for('.login'))
return render_template('register.html', form=form)
validate_on_submit是flask-wtf提供的FlaskForm中封装的一个方法,返回值是一个布尔值。如果表单提交了并且我们在对应的form中声明的表单数据验证器对用户提交的表单数据验证通过,那么该方法返回True,否则返回False。
上面的代码中,表单提交并且数据验证成功后,条用我们之前实现的方法创建用户。有时候,网站需要对用户的一些操作给出成功、失败、警告等一系列反馈,我们调用了flash函数,该函数的功能是向模板页面发送一消息,它接受两个参数,消息的内容和分类,最后重定向到登陆页面。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx