问题描述
升级到 Django 3.0 后,出现以下错误:
After upgrading to Django 3.0, I get the following error:
ImportError: cannot import name 'render_to_response' from 'django.shortcuts'
我的观点:
from django.shortcuts import render_to_response
from django.template import RequestContext
def index(request):
context = {'foo': 'bar'}
return render_to_response('index.html', context, context_instance=RequestContext(request))
这里是完整的回溯:
Traceback (most recent call last):
File "./manage.py", line 21, in <module>
main()
File "./manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/core/management/base.py", line 323, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 60, in execute
super().execute(*args, **options)
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/core/management/base.py", line 364, in execute
output = self.handle(*args, **options)
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 95, in handle
self.run(**options)
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 102, in run
autoreload.run_with_reloader(self.inner_run, **options)
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/utils/autoreload.py", line 580, in run_with_reloader
start_django(reloader, main_func, *args, **kwargs)
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/utils/autoreload.py", line 565, in start_django
reloader.run(django_main_thread)
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/utils/autoreload.py", line 272, in run
get_resolver().urlconf_module
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/utils/functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/urls/resolvers.py", line 572, in urlconf_module
return import_module(self.urlconf_name)
File "/Users/alasdair/.pyenv/versions/3.7.2/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/Users/alasdair/dev/myproject/myproject/urls.py", line 19, in <module>
from myapp import views
File "/Users/alasdair/dev/myproject/myapp/views.py", line 8, in <module>
from django.shortcuts import render_to_response
ImportError: cannot import name 'render_to_response' from 'django.shortcuts' (/Users/alasdair/.virtualenvs/django30/lib/python3.7/site-packages/django/shortcuts.py)
推荐答案
render_to_response
快捷方式是 在 Django 2.0 中已弃用,并且是 在 Django 3.0 中删除.您可以改用 render
快捷方式,该快捷方式是在 Django 1.3 中添加的.render
快捷方式的工作方式与 render_to_response
类似,但将 request
作为它的第一个参数.按如下方式更改您的视图:
The render_to_response
shortcut was deprecated in Django 2.0, and is removed in Django 3.0. You can use the render
shortcut instead, which was added way back in Django 1.3. The render
shortcut works similarly to render_to_response
, but takes request
as its first argument. Change your view as follows:
from django.shortcuts import render
def index(request):
context = {'foo': 'bar'}
return render(request, 'index.html', context)
在您看来,您将 context_instance=RequestContext(request)
作为第三个参数.这在 Django 1.8 中已被弃用,在 Django 1.10+ 中不起作用.
In your view, you have context_instance=RequestContext(request)
as the third argument. This was deprecated in Django 1.8, and does not work in Django 1.10+.
如果您使用的是 render_to_response
而没有 context_instance
,那么您可以将 None
作为请求传递给 render
捷径.例如,如果您有,
If you are using render_to_response
without context_instance
, then you can pass None
as the request to the render
shortcut. For example, if you have,
return render_to_response('index.html', context)
那么与 render
等效的是:
return render(None, 'index.html', context)
请注意,如果您将 None
作为第一个参数传递,那么您的模板将在没有任何 上下文处理器.这可能会使渲染稍微快一点,但它可能会导致 CSRF 错误,这意味着您将无法从上下文处理器访问变量(例如 {{ request }}
和 {{ user }}
) 除非您明确将它们添加到上下文中.除非您了解这些后果,否则我不建议您像这样使用 None
.
Note that if you pass None
as the first argument, then your template will be rendered without any context processors. That could make the rendering slightly faster, but it might lead to CSRF errors, and means that you won't be able to access variables from the context processors (e.g. {{ request }}
and {{ user }}
) unless you explicitly add them to the context. I wouldn't recommend using None
like this unless you understand these consequences.
这篇关于Django ImportError:无法从“django.shortcuts"导入名称“render_to_response"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!