我正在尝试在我的一个数据库模型中创建一个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传递给我的类的参数?
答案 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中了解更多信息。