仅在 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)
我有 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)