Flask-WTForms QuerySelectField-编辑时不显示所选选项

时间:2018-10-11 11:42:21

标签: flask-wtforms

我目前有一个用数据库中的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)

pic edit

当我编辑用户时,我需要查看“高级管理员”的预选值 任何帮助将不胜感激,我已经绕圈了。 谢谢

0 个答案:

没有答案