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

