2017-04-19 4 views
1

Ich versuche, ein Slug-Feld in einem meiner DB-Modelle zu erstellen. Ich benutze Flask-SQLAlchemy und Flask-Admin. Meine Klasse ist wie folgt definiert:Slug-Feld in 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) 

habe ich versucht, so etwas wie dies aus dieser question umzusetzen:

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

aber es nicht funktioniert, wenn ich die neue Händler erschaffe mit Flask-Admin.

Bei dem Versuch, festzustellen, warum, ändere ich die Init-Funktion einfach print kwargs. Wenn ich einen neuen Merchant in Flask-Admin erstelle, druckt es {}, aber wenn ich es in der Python-Shell mache, wie Merchant(name ='test'), druckt es .

Weiß jemand, wie ich auf die Argumente zugreifen kann, die an meine Klasse bei init von Flask-Admin übergeben werden?

Antwort

1

Es sieht so aus, als würde Flask-Admin keine Konstruktorargumente übergeben, wenn das neue Objekt initialisiert wird und Ihr Code keine Wirkung hat. Ich habe nicht den Quellcode überprüft, aber sie konnten tun so etwas wie sein:

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

Ich denke, die beste Wahl, wenn Sie Flask-Admin weiter benutzen wollen würde die ModelView und Umsetzung des on_model_change Haken werden erstreckt:

class MerchantModelView(BaseModelView): 

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

Sie können weitere Informationen in the documentation.

+0

Ehrfürchtig. Vielen Dank. – GMarsh

+0

@GMarsh Danke für die Bearbeitung, ich habe das vergessen :) –