如何在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
相关产品推荐
相关产品推荐

