如何在Django URL中同时传递id与slug参数
问题修复方案
报错的根本原因:你的detail路由规则要求传入game_id和slug两个参数,但反向生成URL时只传入了32147这一个参数,参数数量不匹配导致报错。
修复步骤
1. 排查并修复slug参数为空的问题
报错说明第二个参数未成功传入,大概率是循环变量i的title字段为空,或者自定义slug过滤器处理后返回了空值。你可以先在模板中单独打印{{ i.title|slug }}确认输出是否正常。
如果确实存在空标题的游戏数据,修改自定义过滤器增加兜底逻辑,避免参数缺失:
@register.filter def slug(value): if not value: return "untitled-game" return slugify(unidecode(value))
2. 统一参数顺序(可选,规避潜在错误)
路由中参数的顺序是game_id在前、slug在后,虽然Django命名参数不强制顺序,建议将视图函数的参数顺序和路由保持一致,避免后续传参混乱:
# 修改views.py中的oyun函数参数顺序 def oyun(request, game_id, slug): # 原有逻辑保持不变
3. 补充模型的get_absolute_url方法
你视图中提交评论后调用了oyun.get_absolute_url()做重定向,目前模型未定义该方法,后续提交评论会触发报错,在Oyunlar模型中补充定义即可:
from django.urls import reverse from django.utils.text import slugify from unidecode import unidecode class Oyunlar(models.Model): # 原有字段、Meta、__str__逻辑保持不变 def get_absolute_url(self): return reverse('detail', args=[self.game_id, slugify(unidecode(self.title))])
内容的提问来源于stack exchange,提问作者cvsrt
相关产品推荐
相关产品推荐

