如何在 django 2.0.4 中从我的相册模型自动生成 slug

How to auto generate slug from my Album model in django 2.0.4

我有一个包含歌曲列表的专辑字段

 class Album(models.Model):
    artist = models.CharField(max_length=250)
    album_title = models.CharField(max_length=250)
    genre = models.CharField(max_length=100)
    album_logo = models.CharField(max_length=1000,blank=True)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.album_title               

class Song(models.Model):
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    artist = models.CharField(max_length=250, blank=True)
    file_type = models.CharField(max_length=10)
    song_title = models.CharField(max_length=100)    

    def __str__(self):
        return self.artist

我想知道如何从专辑名称生成 slug。我正在关注使用 django 1.8 的教程,该教程使用正则表达式来实现此任务。但是通过查看文档,他们引入了一种更简单的方法('')。 那么,您能否帮助解释一下我如何实施它,让初学者不仅在这种情况下,而且在可能的情况下都能全面理解。 提前致谢。

Django 会根据您传递给 slug 字段的字符串对象自动生成 slug。

# Import slugify to generate slugs from strings
from django.utils.text import slugify 

class Album(models.Model):
    artist = models.CharField(max_length=250)
    album_title = models.CharField(max_length=250)
    genre = models.CharField(max_length=100)
    album_logo = models.CharField(max_length=1000,blank=True)
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.album_title)
        super(Album, self).save(*args, **kwargs)

    def __str__(self):
        return self.album_title    


class Song(models.Model):
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    artist = models.CharField(max_length=250, blank=True)
    file_type = models.CharField(max_length=10)
    song_title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.song_title)
        super(Song, self).save(*args, **kwargs)    

    def __str__(self):
        return self.artist

要使用信号, 这是 tutorial 我找到解决方案的地方


models.py

导入这些东西

from django.utils.text import slugify
from django.dispatch import receiver
from django.db.models.signals import pre_save

在你的模型下添加这个。

class Album(models.Model):
    artist = models.CharField(max_length=250)
    album_title = models.CharField(max_length=250)
    genre = models.CharField(max_length=100)
    album_logo = models.CharField(max_length=1000,blank=True)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.album_title   

@receiver(pre_save, sender=Store)
def store_pre_save(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = slugify(instance.song_title)

Make sure it's under the class and the def, otherwise you will get an error