Flask-Admin / Flask-SQLAlchemy: установите user_id = current_user для INSERT

Используя Flask-Admin + Flask-SQLAlchemy, я определил три модели: User, Apikey, Exchange.

Когда аутентифицированный пользователь создает новый Apikey через веб-интерфейс администратора, я бы хотел, чтобы user_id в этой новой строке, вставленной в базу данных, был установлен на текущий user_id, который вошел в систему.

В моей текущей реализации пользователь может выбрать любого понравившегося пользователя (что нежелательно).

Это мое определение моделей:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(255))
    last_name = db.Column(db.String(255))
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users,
                        backref=db.backref('users', lazy='dynamic'))
    apikeys = db.relationship('Apikey', backref='user')

    def __str__(self):
        return self.email



class Apikey(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    exch_user = db.Column(db.String(255))
    exch_pass = db.Column(db.String(255))
    exch_key = db.Column(db.String(255))
    exch_secret = db.Column(db.String(255))

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    exch_id = db.Column(db.Integer, db.ForeignKey('exchange.id'))



class Exchange(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255))
    apikeys = db.relationship('Apikey', backref='exchange')

    def __str__(self):
        return self.name

person Unai    schedule 13.12.2015    source источник


Ответы (1)


В вашем административном представлении для модели Apikey вам нужно сделать несколько вещей; скройте поле user_id и вручную установите user_id до того, как данные формы будут отправлены в базу данных.

Предполагая, что вы также используете Flask-Login или Flask-Security, ваш класс представления должен выглядеть примерно так:

class ApikeyView(sqla.ModelView):

    form_excluded_columns = ('user_id')

    def on_model_change(self, form, model, is_created):

        if is_created:
            model.user_id = current_user.id

Не забудьте импортировать current_user из flask.ext.login

person pjcunningham    schedule 14.12.2015
comment
@ pjcunningham: Ответ работает хорошо, не могли бы вы посоветовать, как model.user_roles = current_user.roles. Я хочу получить роль текущего пользователя, спасибо. - person Samoth; 06.05.2017
comment
Вау.., большое спасибо @pjcunningham, вы очень сэкономили мое время :) - person Tri; 25.01.2019