Django基于slug与get_absolute_url实现ListView跳转DetailView无报错失效问题
问题定位与修正方案
跳转失效且无任何报错的核心原因是多处代码拼写错误、模板变量引用错误,具体问题及修正方式如下:
1. 模型层URL生成逻辑错误
首先需要在模型文件顶部导入reverse函数:from django.urls import reverse
原get_absolute_url方法存在两处拼写问题:
- 关键字参数名
kargs拼写错误,正确应为kwargs - 传参格式错误,无冒号的大括号键值对是集合语法,无法传递字典参数,正确格式为
{'slug': self.slug}
修正后的方法代码:
def get_absolute_url(self): return reverse('story-detail', kwargs={'slug': self.slug})
注:因后续模板层的变量引用错误,实际代码根本未执行到reverse调用,因此没有抛出对应的Python语法错误。
2. 模板层变量引用错误
故事列表模板的循环逻辑中,两处链接的变量引用不符合作用域规则:
- 标题链接写为
{{ title.get_absolute_url }},当前循环的上下文对象为story,全局不存在title变量,模板解析时会静默返回空值,最终href渲染为空,点击无任何反应。正确写法为{{ story.get_absolute_url }} - 作者链接写为
{{ author.get_absolute_url }},同样不存在独立的author变量,正确引用应为循环对象下的关联作者{{ story.author.get_absolute_url }}
3. 视图层类属性配置错误
基于类的视图(ListView/DetailView)绑定模型的属性名为model,当前代码误写为models = Story:
- ListView因为额外配置了
queryset能暂时正常渲染列表 - DetailView未配置queryset,因属性名错误无法绑定Story模型,就算链接生成正确,访问详情页也会抛出配置类错误
修正方式:将两个视图类中的models = Story改为model = Story
4. Slug字段缺少自动生成逻辑
当前slug字段配置为unique=True, blank=True但无赋值逻辑,新建故事时slug值会为空,就算前述问题全部修正,也会因为slug值为空无法匹配URL路由规则。可在模型中重写save方法实现slug自动生成:
from django.utils.text import slugify class Story(models.Model): # 原有字段保持不变 def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title) super().save(*args, **kwargs)
内容的提问来源于stack exchange,提问作者Rafael Gois
相关产品推荐
相关产品推荐

