Django 1.11添加ChartsJS视图遇ImportError:无法导入AnalyticsView
解决Django中无法导入AnalyticsView的问题
看起来你在给Django应用添加ChartJS分析视图的时候卡壳了——这个导入错误其实是个很典型的Python模块导入问题,跟循环依赖或者Settings配置没关系,咱们来一步步理清楚:
你的相关代码
项目URL配置 (project/app/urls.py)
# -*- coding: utf-8 -*- from __future__ import ( absolute_import, division, print_function, unicode_literals ) from django.conf.urls import url from future import standard_library from survey.views import ConfirmView, IndexView, SurveyCompleted, SurveyDetail, AnalyticsView from survey.views.survey_result import serve_result_csv standard_library.install_aliases() urlpatterns = [ url(r'^$', IndexView.as_view(), name='survey-list'), url(r'^(?P<id>\d+)/', SurveyDetail.as_view(), name='survey-detail'), url(r'^csv/(?P<pk>\d+)/', serve_result_csv, name='survey-result'), url(r'^(?P<id>\d+)/completed/', SurveyCompleted.as_view(), name='survey-completed'), url(r'^(?P<id>\d+)-(?P<step>\d+)/', SurveyDetail.as_view(), name='survey-detail-step'), url(r'^confirm/(?P<uuid>\w+)/', ConfirmView.as_view(), name='survey-confirmation'), url(r'^analytics/$', AnalyticsView.as_view(), name='analytics-view'), ]
AnalyticsView视图文件 (project/app/views/analytics_view.py)
# -*- coding: utf-8 -*- from __future__ import ( absolute_import, division, print_function, unicode_literals ) from builtins import super from future import standard_library from django.views.generic.base import TemplateView from django.contrib.auth.models import User standard_library.install_aliases() import arrow class AnalyticsView(TemplateView): template_name = "survey/analytics.html" ...
Django配置相关部分 (project/settings.py)
ROOT = os.path.dirname(os.path.abspath(__file__)) STATIC_URL = '/bootstrap_admin/static/' STATICFILES_DIRS = [ os.path.normpath(os.path.join(ROOT, '..', "survey", "static")), ]
报错信息
Unhandled exception in thread started by <function wrapper at 0x05CBB9F0> Traceback (most recent call last): File "C:\Python27\lib\site-packages\django\utils\autoreload.py", line 227, in wrapper fn(*args, **kwargs) File "C:\Python27\lib\site-packages\django\core\management\commands\runserver.py", line 125, in inner_run self.check(display_num_errors=True) File "C:\Python27\lib\site-packages\django\core\management\base.py", line 359, in check include_deployment_checks=include_deployment_checks, File "C:\Python27\lib\site-packages\django\core\management\base.py", line 346, in _run_checks return checks.run_checks(**kwargs) File "C:\Python27\lib\site-packages\django\core\checks\registry.py", line 81, in run_checks new_errors = check(app_configs=app_configs) File "C:\Python27\lib\site-packages\django\core\checks\urls.py", line 16, in check_url_config return check_resolver(resolver) File "C:\Python27\lib\site-packages\django\core\checks\urls.py", line 26, in check_resolver return check_method() File "C:\Python27\lib\site-packages\django\urls\resolvers.py", line 254, in check for pattern in self.url_patterns: File "C:\Python27\lib\site-packages\django\utils\functional.py", line 35, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "C:\Python27\lib\site-packages\django\urls\resolvers.py", line 405, in url_patterns patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) File "C:\Python27\lib\site-packages\django\utils\functional.py", line 35, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "C:\Python27\lib\site-packages\django\urls\resolvers.py", line 398, in urlconf_module return import_module(self.urlconf_name) File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module __import__(name) File "C:\Users\ronaldg\Documents\csa-survey\urls.py", line 18, in <module> url(r'^survey/', include('survey.urls')), File "C:\Python27\lib\site-packages\django\conf\urls\__init__.py", line 50, in include urlconf_module = import_module(urlconf_module) File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module __import__(name) File "C:\Users\ronaldg\Documents\csa-survey\survey\urls.py", line 9, in <module> from survey.views import ConfirmView, IndexView, SurveyCompleted, SurveyDetail, AnalyticsView ImportError: cannot import name AnalyticsView
问题根源与解决方案
你踩的坑其实很简单:AnalyticsView放在了survey/views/analytics_view.py这个子模块里,但你试图直接从survey.views导入它——Python的模块规则里,只有当类定义在survey/views/__init__.py里,或者在__init__.py里显式导出该类时,才能直接从survey.views导入。
有两种简单的解决方法,选一种就行:
方法1:修改URL中的导入语句(推荐,直接直观)
把survey/urls.py里的导入代码拆成两行,从具体的子模块导入AnalyticsView:
# 替换原来的一行导入 from survey.views import ConfirmView, IndexView, SurveyCompleted, SurveyDetail from survey.views.analytics_view import AnalyticsView
方法2:在views目录的__init__.py中添加导出
如果你想保持原来的导入方式,就在survey/views/__init__.py文件里添加一行代码,把AnalyticsView注册到survey.views模块下:
from .analytics_view import AnalyticsView
额外检查点
- 确认
analytics_view.py的文件名拼写完全正确(注意大小写,Windows系统不敏感,但Linux/macOS下是区分大小写的) - 确认该文件确实放在
survey/views目录下,没有放错位置
内容的提问来源于stack exchange,提问作者user1970728
相关产品推荐
相关产品推荐

