Django URL SLUG
2022-09-16
关键词
- slug
- seo
- django
通过 URL SLUG 获取网站单页
通过 Unique SLUG 获取网站单页,有利于 SEO
http get http://127.0.0.1:8000/post/django-url-slug/ # good
http get http://127.0.0.1:8000/post/2343242/ # bad
使用 Django Model 中的添加 SlugField
编辑 models.py 文件
from django.db import models
class Foo(model.Model):
slug = models.SlugField(max_length=100, unique=True)
title = models.CharField(max_length=255)
以上代码示例,在 SlugField() 方法中传递了 unique=True
和 max_length=100
的参数
通过 Django Singal 生成 slug
- 编辑 singals.py 文件
from hashlib import sha224
from django.template.defaultfilters import slugify
from django.utils import timezone
def get_unique_string() -> str:
now = timezone.now().strftime("%Y-%m-%d %H:%M:%S")
h_str = sha224(now.encode('utf8')).hexdigest()
return h_str
def generate_slug(sender, instance, *args, **kwargs):
_slug = slugify(instance.title)
if instance.slug != _slug and len(instance.slug) == 0:
try:
sender.objects.get(slug=_slug)
instance.slug = f"{_slug}-{get_unique_string()[:8]}"
except sender.DoesNotExist:
instance.slug = _slug
else:
pass
- 在 apps.py 中链接 singals
"""App config for `toolbox` app."""
# For details on app configs, see:
# https://docs.djangoproject.com/en/3.2/ref/applications/
from django.apps import AppConfig
class FooConfig(AppConfig):
"""App config for toolbox."""
default_auto_field = "django.db.models.BigAutoField"
name = "apps.toolbox"
def ready(self):
from django.db.models.signals import pre_save
from .models import Foo
from . import signals # noqa
pre_save.connect(signals.generate_slug, Foo)
- 编辑
foo/__init__.py
文件
default_app_config = "apps.toolbox.apps.FooConfig"
结论
通过,Django 自带的 slugify 方法与 model singals 组合。 实现了每创建一个行数据,自动生成 unique slug