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

Posted

技术标签:

【中文标题】如何在 django 2.0.4 中从我的专辑模型自动生成 slug【英文标题】:How to auto generate slug from my Album model in django 2.0.4 【发布时间】:2018-10-30 09:22:44 【问题描述】:

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

 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 的教程,该教程使用正则表达式来实现此任务。但是通过查看文档,他们引入了一种更简单的方法('')。 因此,您能否帮助解释我如何为初学者实施它,不仅在这种情况下,而且如果可能的话,全面理解。 提前致谢。

【问题讨论】:

我已经回答了一个类似的问题,请查看here 【参考方案1】:

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

【讨论】:

如果对象标题被修改,这个答案会生成一个新的 slug,这可能会导致链接中断。在生成 slug 之前检查是否存在更安全 @GEV 怎么做? @DerekPK 您可以在保存方法中添加一个检查(即,如果不是 self.slug);我建议进行编辑。但我认为您使用信号的答案也应该有效,甚至可能会更好。有理由不直接使用您的答案吗?【参考方案2】:

要使用信号, 这是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)

确保它在 class 和 def 之下, 否则会报错

【讨论】:

以上是关于如何在 django 2.0.4 中从我的专辑模型自动生成 slug的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中从当前 html 页面导航到另一个 html 页面

如何在 Django 中从用户模型的字段自动填充和显示数据到来自不同应用程序的另一个模型?

如何在 django 模型中从一个字段添加多个输入

如何在 django 中从一对多关系中检索数据?

如何在 Django 中从 2 个不同的模型对象创建表单对象?

如何在 Eclipse 中从我的 Android 项目中删除依赖项