SQL Alchemy / FlaskAdmin中的Slug字段

时间:2017-04-19 13:19:12

标签: python flask flask-sqlalchemy flask-admin

我正在尝试在我的一个数据库模型中创建一个slug字段。我正在使用Flask-SQLAlchemy和Flask-Admin。我的班级定义为:

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)

但是,当我使用Flask-Admin创建新商家时它不起作用。

在尝试确定原因时,我将init函数更改为print kwargs。当我在Flask-Admin中创建一个新的商家时,它会打印{},但是当我在python shell中执行它时,如Merchant(name ='test'),它会打印{'name' : 'test'}

有没有人知道如何在Flask-Admin中访问从init传递给我的类的参数?

1 个答案:

答案 0 :(得分:1)

看起来Flask-Admin在初始化新对象时没有传递构造函数参数,并且您的代码没有任何效果。我没有检查过源代码,但他们可能会做类似的事情:

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

如果你想继续使用Flask-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中了解更多信息。