Django传pk生成的doc.html页面点击登出触发ValueError如何解决
错误原因
你遇到的报错核心是相对路径跳转 + 路由匹配规则的问题:
- 登出按钮使用了相对路径
logout,当你处于/doc/[pk值]这个二级路径页面时,点击按钮会将路径拼接为/doc/logout,而非你预期的根路径下的/logout - 你的URL配置中
doc/<str:pk>路由会匹配所有doc/开头的路径,将后面的logout当做pk参数传给DocDetailView,而DetailView需要数值类型的id查询Laws表,拿到字符串logout就抛出了类型错误。
修复方案
方案1(推荐,彻底解决所有页面的登出路径问题)
修改consult_home.html中的登出按钮,使用Django模板标签生成绝对路径的登出地址,避免相对路径拼接错误:
<button type="button" class="button log_out" onclick="location.href='{% url 'logout' %}';">LOGOUT</button>
{% url 'logout' %}会根据你命名的路由直接生成根路径下的/logout地址,不管当前处于哪一级页面都不会拼接错误。
方案2(优化路由匹配逻辑,避免误匹配)
修改urls.py中doc路由的参数类型,将str改为int,因为你的Laws表的主键id本身就是数值类型,只有数值才会匹配该路由,doc/logout会自动跳过该路由继续匹配:
urlpatterns=[ path('logout', views.logoutUser, name='logout'), path('doc/<int:pk>', DocDetailView.as_view(), name='doc' ), ]
两个方案同时使用最佳,既解决当前登出问题,也避免后续其他类似的路径误匹配问题。
内容的提问来源于stack exchange,提问作者Ritankar Bhattacharjee
相关产品推荐
相关产品推荐

