4

wtforms.ext.sqlalchemy QuerySelectMultipleField を使用してチェックボックスのリストを表示しようとしていますが、GET でフォームに表示するモデル データを取得できません。

これが私のmodels.pyです

user_permissions = db.Table('user_permissions',
    db.Column('permission_id', db.Integer, db.ForeignKey('permission.id')),
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'))
)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), nullable=False, unique=True)
    email = db.Column(db.String(120), nullable=False, unique=True)
    password = db.Column(db.String(80), nullable=False)

    permissions = db.relationship('Permission', secondary=user_permissions, 
            backref=db.backref('permissions', lazy='dynamic'))

    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.password = password

    def __repr__(self):
        return '<User %r>' % self.username


class Permission(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    desc = db.Column(db.String(80), nullable=False)

    def __init__(self, desc):
        self.desc = desc

    def __repr__(self):
        return '<Permission %r>' % self.desc

これが私のforms.pyです

class EditUserForm(Form):
    username = TextField('Name', validators=[DataRequired()])
    email = TextField('Email', validators=[DataRequired()])
    permissions = QuerySelectMultipleField(
            query_factory=Permission.query.all,
            get_label=lambda a: a.desc,
            widget=widgets.ListWidget(prefix_label=False),
            option_widget=widgets.CheckboxInput()
    )

これが私のviews.pyです

@app.endpoint('edit_user')
@require_login()
@require_permission('edit_user')
def edit_user(user_id):
    user = User.query.filter_by(id=user_id).first()
    if not user:
        abort(404)
    data = {
        "username": user.username,
        "email": user.email,
        "permissions": user.permissions
    }
    form = EditUserForm(**data)

問題は、パーミッション モデルのリストである user.permissions から選択された値が WTForm に表示されないことです。空のチェックボックスのリストが表示されます。

(Pdb) print user.permissions
[<Permission u'admin'>, <Permission u'create_user'>, <Permission u'edit_user'>]

問題は「権限」データ値の構造にあると確信していますが、考えられるあらゆる可能性を試しました。どんな助けでも大歓迎です。

私が試したいくつかのこと...

"permissions": [1, 2]
"permissions": ['1', '2']
"permissions": ['permissions-1', 'permissions-2']
"permissions": [('permissions', 1), ('permissions', 2)]
"permissions": [('permissions', '1'), ('permissions', '2')]
4

1 に答える 1