【问题标题】:Slug field in SQL Alchemy/FlaskAdminSQLAlchemy/Flask Admin 中的 Slug 字段
【发布时间】:2026-01-14 11:15:02
【问题描述】:

我正在尝试在我的一个数据库模型中创建一个 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 初始化时传递给我的类的参数?

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-admin


    【解决方案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了解更多信息。

    【讨论】:

    • 太棒了。谢谢。