2014-11-20 44 views
1

我正在編寫我的應用程序的編輯用戶頁面,我似乎無法弄清楚如何呈現用戶的當前角色,就像我做其他變量(如電子郵件) 。使用Flask-Principal角色填充WTForm MultiCheckboxField

這裏是我的模型,形式和觀點:

#Flask-Principal Role Model 
class Role(db.Model, RoleMixin): 
    id = db.Column(db.Integer(), primary_key=True) 
    name = db.Column(db.String(80), unique=True) 
    description = db.Column(db.String(255)) 

    def __repr__(self): 
     return '<Role %r>' % (self.name) 

#SQLALchemy User Model 
class User(db.Model, UserMixin): 
    id = db.Column(db.Integer, primary_key = True) 
    email = db.Column(db.String(255), unique=True) 
    password = db.Column(db.String(255)) 
    first_name = db.Column(db.String(128)) 
    last_name = db.Column(db.String(128)) 
    business_name = db.Column(db.String(128)) 
    active = db.Column(db.Boolean()) 
    roles = db.relationship('Role', secondary=roles_users, 
          backref=db.backref('users', lazy='dynamic')) 

#WTForms User Form 
class UserForm(Form): 
    first_name = StringField('first name', validators= [Required()]) 
    last_name = StringField('last name', validators= [Required()]) 
    business_name = StringField('business name', validators= [Required()]) 
    email = StringField('email', validators = [Required(), Email()]) 
    active = BooleanField('active') 
    roles = MultiCheckboxField('roles', coerce=int) 

#Edit User View 
@app.route('/admin/users/<id>/edit/', methods = ['GET', 'POST']) 
@roles_required('admin') 
def edit_user(id): 
    user = User.query.filter_by(id = id).first() 
    editform = UserForm() 

# This is how I've assigned choices for other MultiCheckboxField forms, but I haven't 
# needed to populate the MultiCheckboxField from a user model before with role objects. 

    editform.roles.choices = [(x.id,x.name) for x in Role.query.all()] 

    if editform.validate_on_submit(): 
     pass 

    editform.first_name.data = user.first_name 
    editform.last_name.data = user.last_name 
    editform.business_name.data = user.business_name 
    editform.email.data = user.email 
    editform.active.data = user.active 

#The below doesn't show all the available roles, just the current roles assigned. 

    editform.roles.data = user.roles 


    return render_template("user_edit.html", 
     title = "Edit User", 
     user = user, 
     editform = editform) 

那麼,有沒有人知道如何有WTForms顯示所有可用的角色,並檢查這是目前在user.roles列表中的人?

回答

1

data爲多選場是form_data名單已由裹挾後您的coerce調用 - 所以你提供需要匹配什麼可作爲每個元組的第一個條目您提供choices - 在這種情況下, ,一個整數。也就是說,如果你改變你的代碼:

editform.roles.data = [role.id for role in user.roles] 

應該看到所有相應的複選框選中。

+0

這很完美。一旦我按照你的建議格式化了數據,它們就會按照我的意願拼湊起來並工作。謝謝多謝恩! – Chockomonkey 2014-11-20 22:27:44