本文介绍了Django ImportError:无法从“django.shortcuts"导入名称“render_to_response"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

升级到 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"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-04 23:18