Django URL SLUG

关键词

  • 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=Truemax_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