【问题标题】:How to add index to my slug if it already exists in database?如果数据库中已存在索引,如何向我的 slug 添加索引?
【发布时间】:2019-10-11 17:47:07
【问题描述】:

当我创建新帖子时,我需要做下一步:

1. Generate slug from self.title with slugify
2. Check if this slug does not exists we save post with self.slug
3. If this slug already exists we save post with self.slug + '-' + count index

我找到了可行的解决方案,但我是 django 的新手,所以我想问你这是最佳解决方案吗?

#models.py

from django.db import models
from django.shortcuts import reverse
from django.utils.text import slugify
from django.db.models.signals import post_save
from django.dispatch import receiver

class Post(models.Model):
    title = models.CharField(max_length=150, db_index=True)
    slug = models.SlugField(max_length=150, blank=True, unique=True)

    def get_absolute_url(self):
        return reverse('post_detail_url', kwargs={'slug': self.slug})

@receiver(post_save, sender=Post)
def set_slug(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = slugify(instance.title)
        while Post.objects.filter(slug__startswith=instance.slug).exists():
            instance.slug += '-' + str(Post.objects.filter(slug__startswith=instance.slug).count())
        instance.save()

【问题讨论】:

  • 请在问题中添加崩溃的堆栈跟踪
  • 没有更多的崩溃,但我需要问一下我的解决方案是最优的吗?帖子编辑
  • 还不错。但是你不应该覆盖 save 除非你真的需要这样做。我认为pre-save signal 最适合您尝试做的事情。如果您愿意,我可以编写一个正确的答案,向您展示如何使用它。
  • 是的,体验一下就好了

标签: python django slugify


【解决方案1】:

pre-save signal 是处理此问题的最佳方式。每次实例即将保存时,都会触发信号并运行一些逻辑。在这种情况下,它将在保存之前填充 slug 字段。

from django.db.models.signals import pre_save
from django.dispatch import receiver

# you other stuff goes here

@receiver(pre_save, sender=MyModel)
def set_slug(sender, instance, *args, **kwargs):
    instance.slug = slugify(instance.title)

就是这样!

如果您的信号未连接到应用程序周围,您可以将其放在您的models.py 上。但是,如果您使用它来连接不同的应用程序,或者将一个公共信号连接到多个应用程序,您应该有一个单独的文件来放置。

请注意:看到那张sender=MyModel 了吗?那就是将信号与特定模型联系起来。如果您有很多模型会使用 slug,您可以将其移除,以使预保存挂钩可用于多个模型。

【讨论】:

  • 我应该把这段代码放在哪里?你可以为我的案例发布完整的代码吗?我实际上不明白如何实现这一点。
  • 我在那里写的。如果您没有很多信号,或者信号要在单个应用程序上使用,只需将它们放入您的models.py
  • 未定义变量@receiver
  • 哦,抱歉,忘记了接收器导入。固定。
  • 但我需要保存 2 次:第一个有 self.id,第二个是保存 self.slug
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 2017-10-19
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
相关资源
最近更新 更多