如何自动填充SlugField而不是覆盖save()?

时间:2018-05-31 01:52:44

标签: django django-models

Hello Awesome People

我想知道是否有办法生成slug,而不是覆盖模型的save()方法。
以下是我以前的做法:

def save(self, *args, **kwargs):
    if self.pk is None:
        self.slug = create_slug(self)
    super(ModelName, self).save(*args, **kwargs)

create_slug是一个使用slugify

生成slug的函数
def create_slug(instance,new_slug=None,field="name"):
    ''' long stuff to ensure the slug is unique '''
    return slug

正如django可以通过自动填充slug字段在Django Admin中完成。我们可以简单地添加 另一个参数models.SlugField(field='name')。通过添加此参数,django将确保在保存之前获取field = name的值以生成slug而不总是通过复制/粘贴大量代码覆盖save()方法来为每个模型生成一个slug我们有。

我有点厌倦了为所有型号复制这个,任何提示都会有所帮助!

提前谢谢!

1 个答案:

答案 0 :(得分:2)

不,模型级别没有这样的论点。您可以使用prepopulated_fields在管理员级别执行此操作:

ObjectContent

在模型级别,您可以编写自定义mixin类,并将其用作所有模型的父级:

class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}

在这种情况下,您无需在每个模型中实施class SlugMixin: def create_slug(instance,new_slug=None,field="name"): ''' long stuff to ensure the slug is unique ''' return slug def save(self, *args, **kwargs): if self.pk is None: self.slug = create_slug(self) super().save(*args, **kwargs) class SomeModel(SlugMixin, models.Model): ... class OtherModel(SlugMixin, models.Model): ... 并覆盖create_slug