Flask-WTForms QuerySelectField - не показывает выбранную опцию при редактировании - PullRequest
0 голосов
/ 11 октября 2018

В настоящее время у меня есть модель пользователя, которая обновлена ​​с помощью 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

Когда я редактирую пользователя, мне нужно увидеть предварительно выбранное значение «Старший менеджер». Любая помощь будет принята с благодарностью, я ходил с ней по кругу.,Спасибо

...