Я совершенно уверен, что вы не хотите использовать заголовок. Заголовки обычно могут содержать пробелы (
), знаки пунктуации (~!#.?
и т. Д.) И специальные символы. URL не может содержать большинство этих символов. Можно действительно избежать этих символов, но тогда URL выглядит довольно уродливо, как:
myurl.com/some%20title%20containing%20spaces
Теперь это не очень читабельно.
Однако вы можете использовать slug , с SlugField
[Django-doc] . SlugField
- это CharField
, но он выполняет некоторую очистку, чтобы избежать неприятных URL Например, 'some title containing spaces'
будет преобразовано в some-title-containing-spaces
.
Вы можете добавить SlugField
к вашему CategoryModel
, например:
from django.utils.text import <b>slugify</b>
class Category(models.Model):
name = models.CharField(max_length=20)
<b>slug = models.SlugField(unique=True, blank=True)</b>
def save(self, *args, **kwargs):
<b>self.slug = slugify(self.name)</b>
super().save(*args, **kwargs)
В urlpatterns
мы можем указать slug
как:
# app/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.blog_index, name='blog_index'),
path('<int:pk>/', views.blog_detail, name='blog_detail'),
path('category/<b><slug:category_slug></b>/', views.blog_category, name='blog_category'),
]
Затем мы можем отфильтровать наше мнение о слаге:
from django.shortcuts import get_list_or_404
from .models import Post
def blog_category(request, category_slug):
posts = get_list_or_404(Post.objects.filter(
<b>categories__slug=category_slug</b>
).order_by(
'-created_on'
))
context = {
'category': category,
'posts': posts
}
return render(request, 'blog_category.html', context)
Генерация уникальных слизней
Иногда может случиться, что slug
уже существует для другого объекта Category
, мы можем использовать скрипт для генерации уникального слага, например:
from django.utils.text import slugify
from itertools import count
class Category(models.Model):
name = models.CharField(max_length=20)
<b>slug = models.SlugField(unique=True, blank=True)</b>
def save(self, *args, **kwargs):
for i in count():
slug = slugify('{}{}'.format(self.title, i or ''))
if not Category.objects.filter(slug=slug).exists():
break
self.slug = slug
super().save(*args, **kwargs)