В настоящее время у меня есть модель пользователя, которая обновлена с помощью user_role в базе данных.это обновление выполняется с использованием WTForms и SqlAlchemy с использованием QuerySelectField.Я могу обновить базу данных, и все работает нормально.Однако, когда я хочу обновить роль пользователя и редактирую этого пользователя, QuerySelectField из формы не показывает текущее значение user_role для в базе данных, он показывает первый параметр в базе данных user_roles.
UserForm, используемая для добавления 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 page
{% 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 %}
Таким образом, в базе данных пользователь «Марк» играет роль «Старший менеджер» (id =2 в базе данных) pic database
Когда я пытаюсь отредактировать этого пользователя, QuerySelectField автоматически показывает роль «Директор» (это идентификатор 1 в базе данных)
pic edit
Когда я редактирую пользователя, мне нужно увидеть предварительно выбранное значение «Старший менеджер». Любая помощь будет принята с благодарностью, я ходил с ней по кругу.,Спасибо