Django中使用include()导入urls.py时出现TypeError问题排查
嘿,这个错误我之前在Django 1.11里也踩过坑!让我帮你梳理下可能的问题点:
常见问题排查方向
1. 确认include()的使用格式是否正确
Django 1.11已经不再支持直接通过字符串路径引入其他urls模块,必须用include()包裹目标路径——这是最容易踩的坑!
- 错误写法(旧版本兼容写法,1.11会触发报错):
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/', 'blog.urls'), # 直接传字符串路径是错误的! ] - 正确写法:
from django.conf.urls import include, url # 必须导入include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/', include('blog.urls')), # 用include()包裹目标urls模块路径 ]
2. 检查被导入的urls.py本身是否合法
你要引入的那个urls.py文件,必须保证urlpatterns是合法的列表,且每个条目都正确定义了视图:
- 如果被导入的urls里用了视图字符串(虽然1.11还兼容,但可能引发连锁错误),建议改成导入视图的方式:
# 错误示例(不推荐的写法) urlpatterns = [ url(r'^post/$', 'blog.views.post_list'), ] # 正确示例 from . import views urlpatterns = [ url(r'^post/$', views.post_list), ] - 同时要确保被导入的urls里没有语法错误,比如漏写逗号、视图未定义等,这些都会导致Django解析时认为它不是合法的可调用结构。
3. 确认include是否已正确导入
你的代码片段里只写了from django.contrib import admin from dj...,要检查是否完整导入了include:
from django.conf.urls import include, url # 这行必须有!
如果没导入include就直接使用,可能会触发类型错误(Django无法识别这个方法,进而把传入的路径当成视图处理)。
4. 排查是否混淆了视图和include的用法
有时候会不小心把include的参数写成了视图,比如:
# 错误示例:把视图当成了include的参数 urlpatterns = [ url(r'^blog/', include(views.post_list)), ]
这种情况会直接触发“view must be a callable”的错误,因为Django会把include(views.post_list)当成视图来解析,而它不符合要求。
总结
最常见的原因就是没有用include()包裹urls模块路径,而是直接传了字符串。你可以先从这个点入手排查,再逐步检查其他可能性,应该能解决问题。
内容的提问来源于stack exchange,提问作者RigidBody
相关产品推荐
相关产品推荐

