我目前有一个用数据库中的user_role更新的用户模型。此更新是使用WTForms和SqlAlchemy使用QuerySelectField完成的。我可以更新数据库,并且一切正常。但是,当我想更新用户的角色并编辑该用户时,表单中的QuerySelectField不会在数据库中显示user_role的当前值,而是在user_roles数据库中显示第一个选项。
用于向用户添加user_role的用户窗体
class UserForm(FlaskForm):
user_role_opts = QuerySelectField(query_factory=lambda: UserRole.query,
get_pk=lambda x: x.id, get_label="role_name")
submit = SubmitField()
模型
class User(UserMixin,db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
clients = db.relationship('Client',
secondary=user_clients,
back_populates='users')
user_role_id_user = db.Column(db.Integer, db.ForeignKey('user_role.id'))
class UserRole(db.Model):
id = db.Column(db.Integer, primary_key=True)
role_name = db.Column(db.String(64), index=True, unique=True)
users = db.relationship('User', backref='user', lazy='dynamic')
def __repr__(self):
return '<UserRole: {}>'.format(self.name)
更新路由
@settings_blueprint.route('/user/<int:id>/edit', methods=['GET','POST', 'PATCH'])
def edit_user(id):
found_user = User.query.get(id)
form = UserForm(obj=found_user)
if request.method == b"PATCH":
found_user.user_role_id_user = request.form['user_role_opts']
db.session.add(found_user)
db.session.commit()
flash('User has been updated')
return redirect(url_for('settings.index'))
return render_template('settings/edit_user.html', id=id, found_user=found_user, form=form)
edit_user.html页面
{% block app_content %}
<h1>Edit User {{ found_user.username }}</h1>
<div class="row">
<form action="{{ url_for('settings.edit_user', id=found_user.id) }}?_method=PATCH" method="POST">
{{ form.hidden_tag() }}
<p>
{{ form.user_role_opts }}
</p>
<button>Edit User</button>
</form>
</div>
{% endblock %}
因此,在数据库中,用户“ Mark”具有“高级经理”的角色(数据库中的id = 2) pic database
当我尝试编辑此用户时,QuerySelectField会自动将角色显示为“导演”(在数据库中为ID 1)
当我编辑用户时,我需要查看“高级管理员”的预选值 任何帮助将不胜感激,我已经绕圈了。 谢谢