Django: поддержка аргументов строкового представления для url() устарела и будет удалена в Django 1.10
Новый пользователь python/Django (и действительно новый для SO):
При попытке переноса моего проекта Django возникает ошибка:
RemovedInDjango110Warning: Support for string view arguments to url() is deprecated
and will be removed in Django 1.10 (got main.views.home). Pass the callable instead.
url(r'^$', 'main.views.home')
По-видимому, второй аргумент больше не может быть строкой. Я пришел, чтобы создать этот код, как и через учебник на multipalsight.com, который учит использовать Django с предыдущей версией (сейчас я работаю с 1.9). Учитель инструктирует нас создавать urlpatterns в urls.py из представлений, которые мы создаем в приложениях. Он учит нас создавать URL-адрес, например:
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', 'main.views.home')
]
для ссылки
def home(request):
return render(request, "main/home.html",
{'message': 'You\'ve met with a terrible fate, haven\'t you?'}) #this message calls HTML, not shown, not important for question
в view.py приложения "main", которое я создал.
Если этот метод устарел, как передать аргумент представления не как строку? Если я просто удалю кавычки, как показано в документации (https://docs.djangoproject.com/en/1.9/topics/http/urls/), я получаю сообщение об ошибке:
NameError: name 'main' is not defined
Я попытался "импортировать" представления или основные, используя код, представленный в этой документации:
from . import views
или
from . import main
который дал мне:
ImportError: cannot import name 'views'
и
ImportError: cannot import name 'main'
Я считаю, что я проследил это до ошибки импорта, и в настоящее время я изучаю это.
Ответы
Ответ 1
Я нашел ответ на свой вопрос. Это была ошибка импорта. Для Django 1.10 вам нужно импортировать приложение view.py, а затем передать второй аргумент url() без кавычек. Вот мой код сейчас в urls.py:
from django.conf.urls import url
from django.contrib import admin
import main.views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', main.views.home)
]
Я ничего не менял в файлах app или view.py.
Реквизиты @Rik Poggi для иллюстрации того, как импортировать в свой ответ на этот вопрос:
Django - импорт видов из отдельных приложений
Ответ 2
Вы должны иметь возможность использовать следующее:
from django.conf.urls import url
from django.contrib import admin
from main import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.home)
]
Я не совсем уверен, как выглядит ваша структура каталогов, но использование относительного импорта, такого как from . import X
, происходит, когда файлы находятся в одной папке друг с другом.
Ответ 3
Вы можете использовать свои функции, импортируя все из них в список и добавляя каждую из них в urlpatterns.
from django.conf.urls import url
from django.contrib import admin
from main.views import(
home,
function2,
function3,
)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', home),
url(r'^$', function2),
url(r'^$', function3),
]