Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Flask主体角色填充WTForm MulticheckBox字段_Python_Flask_Jinja2_Wtforms_Flask Principal - Fatal编程技术网

Python 使用Flask主体角色填充WTForm MulticheckBox字段

Python 使用Flask主体角色填充WTForm MulticheckBox字段,python,flask,jinja2,wtforms,flask-principal,Python,Flask,Jinja2,Wtforms,Flask Principal,我正在为我的flask应用程序编写一个编辑用户页面,但我似乎无法像处理电子邮件等其他变量那样处理用户当前的角色 以下是我的模型、表单和视图: #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 =

我正在为我的flask应用程序编写一个编辑用户页面,但我似乎无法像处理电子邮件等其他变量那样处理用户当前的角色

以下是我的模型、表单和视图:

#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)
#主要角色模型
班级角色(db.Model,RoleMixin):
id=db.Column(db.Integer(),主键=True)
name=db.Column(db.String(80),unique=True)
description=db.Column(db.String(255))
定义报告(自我):
返回“”%(self.name)
#SQLALchemy用户模型
类用户(db.Model,UserMixin):
id=db.Column(db.Integer,主键=True)
email=db.Column(db.String(255),unique=True)
密码=db.Column(db.String(255))
first_name=db.Column(db.String(128))
last_name=db.Column(db.String(128))
业务名称=db.Column(db.String(128))
active=db.Column(db.Boolean())
roles=db.relationship('Role',secondary=roles\u用户,
backref=db.backref('users',lazy='dynamic'))
#WTForms用户表单
类用户表单(表单):
first\u name=StringField('first name',validator=[Required()])
last_name=StringField('last name',验证器=[Required()])
业务\u name=StringField('business name',validators=[Required()])
email=StringField('email',验证器=[Required(),email()])
活动=布尔字段(“活动”)
roles=MultiCheckboxField('roles',强制=int)
#编辑用户视图
@app.route('/admin/users//edit/',methods=['GET','POST'])
@需要的角色(“管理员”)
def编辑用户(id):
user=user.query.filter\u by(id=id.first)()
editform=UserForm()
#这就是我为其他MultiCheckboxField表单分配选项的方式,但我没有
#在使用角色对象之前,需要从用户模型填充MultiCheckBox字段。
editform.roles.choices=[(x.id,x.name)表示Role.query.all()中的x
如果editform.validate_on_submit():
通过
editform.first\u name.data=user.first\u name
editform.last\u name.data=user.last\u name
editform.business\u name.data=user.business\u name
editform.email.data=user.email
editform.active.data=user.active
#下面没有显示所有可用的角色,只显示分配的当前角色。
editform.roles.data=user.roles
返回渲染模板(“user\u edit.html”,
title=“编辑用户”,
用户=用户,
editform=editform)

那么,有人知道如何让WTForms显示所有可用的角色吗,并且已经检查了当前在user.roles列表中的那些?

数据
对于多选字段,是一个由
表单数据
组成的列表,在它被您的
强制
可调用后-因此您提供的内容需要与您提供给
选项的每个元组中的第一个可用项相匹配这个例子是一个整数。也就是说,如果您将代码更改为:

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

您应该会看到选中了所有相应的复选框。

这太完美了。一旦我按照你的建议格式化了数据,所有的数据都会按我的预期工作。谢谢你,肖恩!