在 flask-security 中扩展 RegisterForm 时出错

Error extending RegisterForm in flask-security

我在扩展 flask-security 的注册设备时遇到困难。

我已经扩展了RegisterForm:

class ExtendedRegisterForm(RegisterForm):
    payroll_no = IntegerField('Payroll Number', validators=[DataRequired(message=(u'Please include a payroll number'))])
    firstname = TextField('First Name')
    surname = TextField('Surname')
    position = QuerySelectField(u'Position', query_factory=getPosition, get_label='name', allow_blank=False)
    mobile = TextField('Mobile', [InputRequired(), is_10])

我正在尝试从视图调用 register_user()(我已禁用 SECURITY_REGISTERABLE)并直接转到我自己的注册页面。

虽然验证正常,但出现以下错误:

TypeError: "register_user() got an unexpected keyword argument 'surname'"

我的用户模型与我的表单匹配:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(80), unique=True)
    password = db.Column(db.String)
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    firstname = db.Column(db.String(20))
    surname = db.Column(db.String(30))
    position_id = db.Column(db.Integer, db.ForeignKey('position.id'))
    mobile = db.Column(db.String)
    payroll_no = db.Column(db.Integer)

非常感谢帮助。

不幸的是,答案(我相当确定)不会在于转向上下文处理器或其他解决方案:我的项目有多个 'splash' 页面,我需要一种方法来为该用户设置特定角色基于他们到达注册页面的方式; IE。找到站点 A 的用户需要角色 A,找到站点 B 的用户需要角色 B。

解决方案非常简单。 我导入了所有必要的注册组件并调用了以下函数,将表单传递给它。 由于我有多个帐户(因为应用程序充当多个站点的后端),我还向它传递了一个 account_id 整数,以便用户与正确的帐户相关联。

from project import app, db, security, user_datastore
from project.models import User
from flask.ext.security.confirmable import generate_confirmation_link
from flask.ext.security.utils import do_flash, get_message, config_value, send_mail, encrypt_password
from flask.ext.security.signals import user_registered
from flask import current_app


def register_my_user(form, account_id):
    form_data = form.to_dict()
    form_data['password']=encrypt_password(form_data['password'])
    user = user_datastore.create_user(**form_data)
    user.account_id = account_id
    db.session.commit()
    confirmation_link, token = generate_confirmation_link(user)
    do_flash(*get_message('CONFIRM_REGISTRATION', email=user.email))
    user_registered.send(current_app._get_current_object(),
                     user=user, confirm_token=token)
    if config_value('SEND_REGISTER_EMAIL'):
        send_mail(config_value('EMAIL_SUBJECT_REGISTER'), user.email, 'welcome',
              user=user, confirmation_link=confirmation_link)  

贴在这里希望对解构flask-security的用户注册组件的人有用