2016-02-26 29 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