You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于非英文字段值生成可用于URL路径的英文slug?

实现步骤

1. 安装必要依赖

处理非英文字符转英文音译slug需要用到支持Unicode转换的slugify工具,执行以下命令安装:
pip install python-slugify[unidecode]
建议将依赖添加到你的项目requirements.txt文件中,避免部署时缺失

2. 修改Author模型代码

修改你的模型文件,新增slug字段并重写save方法实现自动生成逻辑:

from django.db import models
# 注意这里使用第三方slugify而非Django内置的,Django自带slugify不支持非英文转译
from slugify import slugify

class Author(models.Model):
    firstname = models.CharField(max_length=50)
    lastname = models.CharField(max_length=50)
    # slug字段设置唯一、允许为空,值会自动生成无需手动填写
    slug = models.SlugField(unique=True, blank=True, max_length=120)

    def save(self, *args, **kwargs):
        # 仅当slug为空时生成,避免后续修改姓名覆盖原有slug导致旧链接失效
        if not self.slug:
            full_name = f"{self.firstname} {self.lastname}"
            # 自动将非英文字符转成英文音译,同时处理空格、特殊字符为短横线
            base_slug = slugify(full_name)
            # 处理重名场景,自动添加数字后缀避免slug冲突
            current_slug = base_slug
            count = 1
            while Author.objects.filter(slug=current_slug).exists():
                current_slug = f"{base_slug}-{count}"
                count += 1
            self.slug = current_slug
        super().save(*args, **kwargs)

3. 执行模型迁移并处理历史数据

3.1 生成字段迁移

首次新增slug字段时,因为数据库中已有旧的Author记录没有slug值,所以先直接生成迁移文件:
python manage.py makemigrations
执行后不要立刻运行migrate,需要先添加数据迁移处理旧数据。

3.2 生成空数据迁移文件

将your_app_name替换为你存放Author模型的应用名,执行:
python manage.py makemigrations --empty your_app_name

3.3 编辑数据迁移逻辑

打开上一步生成的空迁移文件,填入以下内容:

from django.db import migrations

def generate_slugs_for_old_authors(apps, schema_editor):
    # 从迁移上下文中获取Author模型
    Author = apps.get_model('your_app_name', 'Author')
    from slugify import slugify
    # 遍历所有已有作者生成slug
    for author in Author.objects.all():
        if not author.slug:
            full_name = f"{author.firstname} {author.lastname}"
            base_slug = slugify(full_name)
            current_slug = base_slug
            count = 1
            while Author.objects.filter(slug=current_slug).exists():
                current_slug = f"{base_slug}-{count}"
                count += 1
            author.slug = current_slug
            author.save()

class Migration(migrations.Migration):
    # 替换dependencies里的内容为你上一个迁移文件的标识
    dependencies = [
        ('your_app_name', '000x_previous_migration_id'),
    ]

    operations = [
        migrations.RunPython(generate_slugs_for_old_authors),
    ]

3.4 执行迁移

python manage.py migrate

4. 配置路由适配你的链接格式

在你的应用urls.py中添加对应路由:

from django.urls import path
from .views import your_author_detail_view

urlpatterns = [
    # 匹配localhost/authors/xxx-slug格式的链接
    path('authors/<slug:slug>/', your_author_detail_view, name='author_detail'),
]

内容的提问来源于stack exchange,提问作者Ihor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:06:04