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

Django DetailView无法显示设备详情,跳转至列表页问题

解决Django设备详情页跳转回列表页的问题

让我们一步步排查并解决你的问题:

1. URL模式不匹配(核心问题)

你的设备详情页访问路径是http://127.0.0.1:8000/maintenance/equipments/1,但在maintenance/urls.py中,详情页的URL正则是:

url(r'^equipment(?P<pk>\d+)/$', views.EquipmentDetailView.as_view(), name='equipment-detail'),

这个正则会匹配/maintenance/equipment1/(注意equipment后面没有s,也没有斜杠分隔pk),和你实际访问的路径完全不匹配。Django找不到对应的视图时,可能会 fallback 到最接近的匹配(你说跳转回列表页大概率是项目路由优先级或全局配置导致的)。

修正方法:
把详情页的URL正则改为:

url(r'^equipments/(?P<pk>\d+)/$', views.EquipmentDetailView.as_view(), name='equipment-detail'),

这样就能正确匹配/maintenance/equipments/1/这类路径了。

2. 模型中的潜在错误(避免后续页面崩溃)

在Equipment模型的display_specialty方法里:

def display_specialty(self):
    return ', '.join([ specialty.name for specialty in self.specialty.all()[:3] ])

这里self.specialty是ForeignKey关联的单个对象,不是可迭代的查询集,调用.all()会直接抛出异常。你需要根据实际需求调整:

  • 如果每个设备只属于一个Specialty:
    def display_specialty(self):
        return self.specialty.name if self.specialty else "No specialty assigned"
    
  • 如果设备可以属于多个Specialty:
    先把模型中的字段改成ManyToManyField:
    specialty = models.ManyToManyField(Specialty, null=True, help_text='Select a specialty for an equipment')
    
    然后保留原有的display_specialty方法即可。

3. 其他小问题(优化代码稳定性)

  • EquipmentInstance模型中status字段的默认值是'm',但你的MAINTENANCE_STATUS选项里没有这个值,建议改成有效值比如'a'(Available):
    status = models.CharField(max_length=1, choices=MAINTENANCE_STATUS, blank=True, default='a', help_text='Equipment availability')
    

修改完以上内容后,重新启动Django服务,访问http://127.0.0.1:8000/maintenance/equipments/1应该就能正常显示设备详情页了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:15:15