После обновления до Django 1.10 я получаю сообщение об ошибке:
TypeError: view must be a callable or a list/tuple in the case of include().
Мой urls.py выглядит следующим образом:
from django.conf.urls import include, url
urlpatterns = [
url(r'^$', 'myapp.views.home'),
url(r'^contact/$', 'myapp.views.contact'),
url(r'^login/$', 'django.contrib.auth.views.login'),
]
Полная трассировка:
Traceback (most recent call last):
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 121, in inner_run
self.check(display_num_errors=True)
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/core/management/base.py", line 385, in check
include_deployment_checks=include_deployment_checks,
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/core/management/base.py", line 372, in _run_checks
return checks.run_checks(**kwargs)
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/core/checks/registry.py", line 81, in run_checks
new_errors = check(app_configs=app_configs)
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/core/checks/urls.py", line 14, in check_url_config
return check_resolver(resolver)
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/core/checks/urls.py", line 24, in check_resolver
for pattern in resolver.url_patterns:
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/urls/resolvers.py", line 310, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/urls/resolvers.py", line 303, in urlconf_module
return import_module(self.urlconf_name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/Users/alasdair/dev/urlproject/urlproject/urls.py", line 28, in <module>
url(r'^$', 'myapp.views.home'),
File "/Users/alasdair/.virtualenvs/django110/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 85, in url
raise TypeError('view must be a callable or a list/tuple in the case of include().')
TypeError: view must be a callable or a list/tuple in the case of include().
python
django
django-urls
django-1.10
Алэсдэйр
источник
источник
None
, что вызовет a,TypeError
как указано выше.Ответы:
Django 1.10 больше не позволяет указывать представления в виде строки (например
'myapp.views.home'
) в шаблонах URL.Решение состоит в том, чтобы обновить ваш,
urls.py
включив в него вызываемый вид. Это означает, что вам нужно импортировать представление в вашurls.py
. Если у ваших шаблонов URL-адресов нет имен, то сейчас самое время добавить их, потому что реверсирование пути Python с точками больше не работает.Если просмотров много, то импорт их по отдельности может быть неудобным. Альтернативой является импорт модуля представлений из вашего приложения.
Обратите внимание, что мы использовали
as myapp_views
иas auth_views
, что позволяет нам импортировать файлыviews.py
из нескольких приложений без их конфликтов.См. Дополнительную информацию в документации диспетчера URL-адресов Django
urlpatterns
.источник
import_module
может помочь вам создать собственный поиск в качестве оболочки для старой строки в случае, когда тысячи URL-адресов ждут, когда вы их обновите.django.conf.urls.defaults
Django 1.5 или более ранней версии ). Я добавил импорт, как вы просили, но я не уверен, что это хорошая идея, поскольку импорт снова изменился в Django 2.0. Если вы хотите знать правильный импорт, то лучше всего искать в документации для вашей версии Django (например, 1.11 , 2.0 ).Эта ошибка просто означает, что
myapp.views.home
это не то, что можно вызвать, например функцию. На самом деле это строка. Хотя ваше решение работает в django 1.9, тем не менее оно выдает предупреждение о том, что оно устареет с версии 1.10 и далее, что именно и произошло. Предыдущее решение от @Alasdair импортирует необходимые функции просмотра в скрипт через либо,from myapp import views as myapp_views
либоfrom myapp.views import home, contact
источник
Вы также можете получить эту ошибку, если у вас есть конфликт имен представления и модуля. У меня возникает ошибка, когда я распространяю файлы представления в папке представлений
/views/view1.py, /views/view2.py
и импортировал некоторую модель с именем table.py в view2.py, которая оказалась именем представления в view1.py. Так что наименование функций просмотраv_table(request,id)
помогло.источник
Ваш код
измените его на следующее, когда вы импортируете
include()
функцию:источник