gpt4 book ai didi

sqlalchemy - 如何使用 SQLAlchemy 多对多关系实例化 wtforms.ext.sqlalchemy.fields.QuerySelectMultipleField

转载 作者:行者123 更新时间:2023-12-03 15:52:51 29 4
gpt4 key购买 nike

我正在尝试使用 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)

问题是 WTForm 不显示 user.permissions 中的选定值,这是一个权限模型列表。它显示空复选框列表。
(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')]

最佳答案

几个问题。

1) 您执行 query_factory 的方式可能会导致问题,因为它可能与单个 session /查询工厂相关联。这意味着您要比较的对象与查询工厂中的对象不在同一个 session 中。

更安全的方法是这样做:

    query_factory=lambda: Permission.query.all()

2)我假设您正在使用 Flask-WTF,因为您没有传递 formdata 部分,但如果您没有(您正在使用 wtforms.Form),那么请执行以下操作:
form = EditUserForm(request.form)

3)您将一次性迭代器作为集合传递:
    "permissions": user.permissions

如果你真的需要通过 dict 自定义传入的数据,你应该这样做:
    "permissions": list(user.permissions)

但是,由于您的 dict 非常基础,因此更倾向于简单地将数据作为对象传递(这应该避免一次性迭代器问题)
form = EditUserForm(obj=user)

将所有这些结合在一起,您的 View 应如下所示:
def edit_user(user_id):
user = User.query.filter_by(id=user_id).first()
if not user:
abort(404)

form = EditUserForm(request.form, user)
[...]

关于sqlalchemy - 如何使用 SQLAlchemy 多对多关系实例化 wtforms.ext.sqlalchemy.fields.QuerySelectMultipleField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18815379/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com