Flask-Security-Too 5.3:注册表单添加自定义字段失败求助
Flask-Security-Too注册表单自定义字段不显示的解决方法
你遇到的问题是因为Flask-Security-Too默认的注册模板不会自动渲染新增的表单字段——它通常固定渲染email、password、password_confirm这几个字段,不会遍历所有表单字段,所以你新增的aka字段不会出现在页面上。下面是不用完全重写表单的解决步骤:
1. 修正注册模板
复制Flask-Security-Too默认的register_user.html模板到你项目的templates/security目录下(没有就新建),然后修改模板内容,改为遍历所有非隐藏字段:
{% extends "security/base.html" %} {% block content %} {% include "security/_messages.html" %} <h1>{{ _('注册') }}</h1> <form action="{{ url_for_security('register') }}" method="POST" name="register_user_form"> {{ register_user_form.hidden_tag() }} {% for field in register_user_form if field.widget.input_type != 'hidden' %} <div> {{ field.label }} {{ field() }} {% if field.errors %} {% for error in field.errors %} <span style="color: red;">{{ error }}</span> {% endfor %} {% endif %} </div> {% endfor %} <button type="submit">{{ _('注册') }}</button> </form> {% endblock %}
这样所有非隐藏的表单字段(包括你新增的aka)都会被自动渲染出来。
2. 确保表单字段值被存入数据库
即使表单显示了aka字段,默认情况下Flask-Security不会自动把这个字段的值保存到User模型里,需要通过信号来处理:
from flask_security.signals import user_registered @user_registered.connect_via(app) def save_aka_field(sender, user, confirm_token, **extra): # 从表单中获取aka的值并保存到用户对象 user.aka = extra.get('form').aka.data db.session.commit()
3. 检查表单初始化的正确性
确认你的代码中:
RegistrationForm正确继承自flask_security.forms.RegisterFormSecurity实例初始化时确实传入了register_form=RegistrationForm,并且init_app(app)是在Flask app配置完成后调用的
比如正确的导入和初始化代码:
from flask_security import Security, RegisterForm from flask_security.forms import StringField, Length, Regexp class RegistrationForm(RegisterForm): aka = StringField('昵称(可选)', [ Length(min=4, max=20), Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0, '昵称只能包含字母、数字、点或下划线') ], render_kw={"placeholder": "输入你的常用昵称"}) # 初始化Security security = Security(datastore=user_datastore, register_form=RegistrationForm) security.init_app(app)
完成以上步骤后,你的aka字段应该就能正常显示并被保存到数据库了。
内容的提问来源于stack exchange,提问作者froggomad
相关产品推荐
相关产品推荐

