Django 2.0报错:View必须是可调用对象或include()的列表/元组
解决Django 2.0中的TypeError: View must be a callable or a list/tuple...问题
嘿,我来帮你搞定这个报错!你遇到的这个TypeError主要是两处代码错误导致的,咱们一步步来修正:
1. 应用URL(catalog/urls.py)的导入与视图函数不匹配
你当前的应用URL里犯了两个小错误:
- 导入错误:你写的
from django import views是导入Django自带的系统视图模块,但你的index、show_category这些视图函数是自己在catalog/views.py里定义的,根本不在这个模块里! - 函数名不匹配:URL里写的
views.catalog_home,但你视图文件里定义的函数名叫index,完全对应不上!
修改后的catalog/urls.py应该是这样:
from django.urls import path # 从当前应用导入自定义视图(两种写法都可以) from . import views # 或者 from catalog import views urlpatterns = [ # 这里改成views.index,和你视图里的函数名对应 path('index/', views.index, name='catalog_home'), path('category/<category_slug>/', views.show_category, name='show_category'), path('product/<product_slug>/', views.show_product, name='show_product') ]
2. 项目URL里的静态文件配置错误
你项目URL里的静态文件路径配置有两个问题:
- 你把
static模块当成了可调用的视图函数传入,但实际上应该用static.serve这个具体的视图函数; - 路径匹配规则不对,应该用
static/<path:path>来匹配静态文件的具体路径,不然Django找不到对应的文件。
另外,硬编码静态文件路径不是好习惯,建议用Django配置里的STATIC_ROOT来替代。修改后的项目URL如下:
from django.contrib import admin from django.urls import path, include from django.views.static import serve from django.conf import settings urlpatterns = [ path('admin/', admin.site.urls), path('catalog/', include('catalog.urls')), # 开发环境下的静态文件服务配置(生产环境请用Nginx等外部服务托管静态文件) path('static/<path:path>', serve, { 'document_root': settings.STATIC_ROOT, }), ] # 更推荐的写法是用Django自带的static辅助函数: # from django.conf.urls.static import static # urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
最后验证
把这两处修改完之后,重启你的Django开发服务器,应该就能解决这个TypeError了。本质上这个报错就是告诉我们:你配置的URL对应的不是一个可调用的视图函数,要么是导入错了,要么是传了模块而非具体函数,咱们上面的修改正好解决了这两个问题。
内容的提问来源于stack exchange,提问作者Raphael
相关产品推荐
相关产品推荐

