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

如何在Django详情视图中用Slug替代主键优化SEO URL?

如何在Django详情视图中用Slug替代主键实现SEO友好URL

没问题,我来一步步帮你把Django详情页的URL从主键(PK)改成slug,实现像/bajki/winnie-the-pooh这种SEO友好的地址。你只需要修改三个核心部分,而且你的模型已经正确设置了unique=True的slug字段,这一步已经搞定了,很棒!


1. 修改URL路由配置(urls.py)

你原来的URL用了正则表达式的写法,现在我们换成Django更简洁的路径转换器slug,它会自动匹配字母、数字、下划线和连字符(完全符合slug的格式要求)。

把原来的这一行:

path('bajki/(?P<pk>\d+)/$', views.detale_bajki, name='detale_bajki'),

替换成:

path('bajki/<slug:slug>/', views.detale_bajki, name='detale_bajki'),

2. 更新视图函数(views.py)

现在视图需要接收slug参数,而不是pk,同时查询数据库时要通过slug字段来获取对象。

修改detale_bajki函数:

def detale_bajki(request, slug):  # 把pk参数替换为slug
    detale_bajki = get_object_or_404(Wpisy, slug=slug)  # 通过slug查询数据,而非pk
    return render(request, 'bajki/detale_bajki.html', {'detale_bajki': detale_bajki})

3. 调整模板中的链接(lista_bajek.html)

最后要修改列表页里的详情链接,让它传递slug参数而不是pk。

把原来的链接代码:

<a href="{% url 'detale_bajki' pk=bajki.pk %}">{{bajki.title}} </a>

改成:

<a href="{% url 'detale_bajki' slug=bajki.slug %}">{{bajki.title}} </a>

额外优化建议(可选)

如果你想让slug自动从文章标题生成,不用手动输入,可以重写模型的save()方法,或者使用django-autoslug库。比如在Wpisy模型里添加:

from django.utils.text import slugify

def save(self, *args, **kwargs):
    if not self.slug:
        # 从标题生成slug,自动处理空格和特殊字符
        self.slug = slugify(self.title)
    super().save(*args, **kwargs)

这样每次保存文章时,如果slug为空,就会自动从title生成唯一的slug(如果遇到重复标题,可以进一步优化在slug后添加数字来保证唯一性)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:36:59