SQL Alchemy/FlaskAdmin 中的 Slug 字段

Slug field in SQL Alchemy/FlaskAdmin

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

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 访问传递给我的 class 的参数?

看起来 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中找到更多信息。