2017-04-19 10 views
1

私のDBモデルの1つにslugフィールドを作成しようとしています。 Flask-SQLAlchemyとFlask-Adminを使用しています。私のクラスは次のように定義されています。私はフラスコ-Admin]を使用して新しい商人を作成していたときに、それは動作しません。しかしSQL Alchemy/FlaskAdminのSlugフィールド

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

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) 

私はこのquestionからこのような何かを実装しようとしてきました。

理由を調べようとして、init関数を単にprint kwargsに変更しました。 Flask-Adminで新しいMerchantを作成すると、{}が印刷されますが、Merchant(name ='test')のようなPythonシェルでは、{'name' : 'test'}が印刷されます。

私はFlask-Adminから自分のクラスに渡された引数にどのようにアクセスできますか?

答えて

1

Flask-Adminは、新しいオブジェクトを初期化するときにコンストラクタ引数を渡さず、コードには何の効果もないようです。私は、ソースコードをチェックしていないが、彼らのようなものやってことができます:

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

を私はあなたがフラスコ-Adminを使用し続けたい場合は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編集のおかげで、私はそれについて忘れてしまった:) –