Подтвердить что ты не робот

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'

Я считаю, что я проследил это до ошибки импорта, и в настоящее время я изучаю это.

4b9b3361

Ответ 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),
]