仅在 slug 存在冲突时才添加标识符

Add identifier only if there is a conflict for slug

我有 slug 自定义,它提供自动从标题创建 slug。

这是我的代码,

#models.py
from django.db import models
from django.urls import reverse
from django.template.defaultfilters import slugify

class Blog(models.Model)
    title = models.CharField(max_length=200)
    slug = models.SlugField(blank=True)

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

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        return super().save(*args, **kwargs)


#admin.py
class BlogAdmin(admin.ModelAdmin):
    list_display = ('title')
    prepopulated_fields = {'slug': ('title',)}

admin.site.register(Blog,BlogAdmin)  

                                                         
#urls.py
from django.urls import path
from .views import *

urlpatterns = [
    path('blog/<slug:slug>', entry.as_view(), name='entry'),
    ]

                                

我想添加带有数字的标识符但前提是存在冲突。 我想要的场景如下,

让我们假设,

管理员创建了一个博客, 博客标题是“伦敦旅游攻略”-> 第一次用这个标题创建博客。
所以 slug 是“london-travel-guide”

Second-time 管理员创建了一个名为“伦敦旅游指南”的博客 子弹应该是“london-travel-guide-1”

第三次,slug应该是“london-travel-guide-2” 等等。

我该如何实现,谢谢你的帮助?

我自己解决了这个问题。

#utils.py
from django.utils.text import slugify

def generate_unique_slug(Blog, title):
    origin_slug = slugify(title)
    unique_slug = origin_slug
    numb = 1
    while Country.objects.filter(slug=unique_slug).exists():
        unique_slug = '%s-%d' % (origin_slug, numb)
        numb += 1
    return unique_slug

#models.py
from django.db import models
from core.utils import generate_unique_slug
from . import *

class Blog(models.Model)
    title = models.CharField(max_length=200)
    slug = models.SlugField(blank=True)
    
    def save(self, *args, **kwargs):
        if self.slug:
            if slugify(self.title) != self.slug:
                self.slug = generate_unique_slug(Country, self.title)
            else:
                self.slug = generate_unique_slug(Country, self.title)
            super(Blog, self).save(*args, **kwargs)