2017-04-19 10 views
1

DB 모델 중 하나에서 슬러그 필드를 만들려고합니다. 나는 Flask-SQLAlchemy와 Flask-Admin을 사용하고있다. 나는이 question에서이 같은 것을 구현하려고했습니다SQL Alchemy/FlaskAdmin의 슬러그 필드

class Merchant(db.Model): 
    __tablename__ = 'merchants' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String()) 
    ... 
    slug = db.Column(db.String()) 

    def __repr__(self): 
     return 'Merchant: {}'.format(self.name) 

:로 내 클래스가 정의됩니다

def __init__(self, *args, **kwargs): 
     if not 'slug' in kwargs: 
      kwargs['slug'] = slugify(kwargs.get('name', '')) 
     super().__init__(*args, **kwargs) 

그것이 내가 플라스크-관리자를 사용하여 새 상인을 만드는 오전 때 작동하지 않습니다하지만.

이유를 알아 내려고 시도하면서 init 함수를 간단히 print kwargs으로 변경합니다. Flask-Admin에서 새로운 판매자를 만들면 {}을 인쇄하지만, Merchant(name ='test')과 같이 파이썬 셸에서 수행하면 {'name' : 'test'}이 인쇄됩니다.

Flask-Admin에서 초기화 할 때 클래스에 전달되는 인수에 액세스하는 방법을 아는 사람이 있습니까?

답변

1

새 개체를 초기화 할 때 Flask-Admin이 생성자 인수를 전달하지 않고 코드가 효과가없는 것처럼 보입니다. 나는 소스 코드를 확인하지 않은,하지만 그들은 같은 일을 할 수 있습니다 :

m = Merchant() 
... 
m.name = 'foo' 

내가 가장 좋은 생각은 플라스크-관리자가 ModelView을 확장하고 on_model_change 후크를 구현하는 것입니다 계속 사용하려면를 :

class MerchantModelView(BaseModelView): 

    def on_model_change(self, form, model, is_created): 
     if is_created and not model.slug: 
      model.slug = slugify(model.name) 

자세한 내용은 the documentation에 있습니다.

+0

굉장합니다. 감사. – GMarsh

+0

@GMarsh 편집 해 주셔서 감사합니다. 나는 그것에 대해 잊어 버렸습니다. :) –