Flask中的表单实现页面注册(2)

<!-- 需要传入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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12608.html