2015-12-13 2 views
4

Использование Flask-Admin + Flask-SQLAlchemy Я определил три модели: User, Apikey, Exchange.Flask-Admin/Flask-SQLAlchemy: установить user_id = current_user для INSERT

Когда идентифицированный пользователь создает новый 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 

ответ

5

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

Предполагая, что вы используете колбовую Логин или колба-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

+0

Фантастическая, спасибо много. Это хорошо работает. – Unai

+0

@ pjcunningham: Ответ работает хорошо, и не могли бы вы посоветовать, как 'model.user_roles = current_user.roles'. Спасибо, я хочу получить роль текущего пользователя. – Samoth