2017-04-19 66 views
1

我想在我的数据库模型之一中创建一个slug字段。我正在使用Flask-SQLAlchemy和Flask-Admin。我的等级定义为:Slug字段在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) 

我试图从这个question实现这样的事情:

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中创建一个新商户时,它会打印{},但是当我在python shell中执行此操作时,它会打印{'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感谢编辑,我忘了那:) –