2016-02-26 39 views
0

我在扩展flask-security的注册设备时遇到了困难。在flask-security中扩展RegisterForm的错误

我已经扩展了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) 

援助最赞赏。

不幸的是,答案(我相当肯定)不会转移到上下文处理器或其他解决方案:我的项目有多个“闪屏”页面,我需要一种方法来为该用户设置特定角色他们进入注册页面的方式; IE浏览器。发现网站A的用户需要角色A,发现网站B的用户需要角色B.

回答

2

解决方案非常简单。 我导入了所有必要的注册组件,并调用以下函数,将它传递给表单。 由于我有多个帐户(因为该应用充当多个站点的后端),我还将它传递给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) 

粘贴在这里,希望它可以运用到人们试图解构烧瓶安全

+0

所以这将覆盖主终端的用户注册组件? –

+0

对我来说,我不得不通过在我的数据库中的属性'form_data' –

+0

如何在register_my_user中添加角色? – JPro