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

5 django django-models

你好真棒的人

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

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

create_slug 是一个生成slug的函数 slugify

def create_slug(instance,new_slug=None,field="name"):
    ''' long stuff to ensure the slug is unique '''
    return slug
Run Code Online (Sandbox Code Playgroud)

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

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

先感谢您!

nev*_*ner 2

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

class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}
Run Code Online (Sandbox Code Playgroud)

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

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):
    ...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您不需要在每个模型中实现create_slug和重写save

  • @EuChi 在Python3中,你不需要超级方法的类和实例参数。您可以直接使用`super()`。仅 Python2 需要此参数。 (3认同)