Django - сопоставление URL-адресов

Теперь, когда у нас есть рабочий вид, описанный в предыдущих главах. Мы хотим получить доступ к этому представлению через URL-адрес. У Django есть собственный способ сопоставления URL-адресов, и это делается путем редактирования файла url.py вашего проекта.(myproject/url.py). Файл url.py выглядит так -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
)

Когда пользователь делает запрос страницы в вашем веб-приложении, контроллер Django выполняет поиск соответствующего представления через файл url.py, а затем возвращает HTML-ответ или ошибку 404 not found, если она не найдена. В url.py самое главное - это"urlpatterns"кортеж. Здесь вы определяете соответствие между URL-адресами и представлениями. Отображение - это кортеж в шаблонах URL, таких как -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)

Выделенная линия отображает URL-адрес «/ home» на представление приветствия, созданное в файле myapp / view.py. Как вы можете видеть выше, отображение состоит из трех элементов:

  • The pattern- Регулярное выражение, соответствующее URL-адресу, который вы хотите разрешить и сопоставить. Все, что может работать с модулем python 're', подходит для этого шаблона (полезно, когда вы хотите передавать параметры через URL-адрес).

  • The python path to the view - То же, что и при импорте модуля.

  • The name- Чтобы выполнить реверсирование URL-адресов, вам необходимо использовать именованные шаблоны URL-адресов, как это сделано в примерах выше. После этого просто запустите сервер, чтобы получить доступ к вашему представлению через: http: //127.0.0.1/hello

Организация ваших URL-адресов

До сих пор мы создали URL-адреса в файле «myprojects / url.py», однако, как говорилось ранее о Django и создании приложения, лучшим моментом была возможность повторно использовать приложения в разных проектах. Вы можете легко увидеть, в чем проблема, если сохраните все свои URL-адреса в файле «projecturl.py». Поэтому лучше всего создать «url.py» для каждого приложения и включить его в наш основной файл проекта url.py (раньше мы включали админские URL-адреса для административного интерфейса).

Как это делается?

Нам нужно создать файл url.py в myapp, используя следующий код -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)

Тогда myproject / url.py изменится на следующее -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^myapp/', include('myapp.urls')),
)

Мы включили все URL-адреса из приложения myapp. Home.html, доступ к которому осуществлялся через «/ hello», теперь называется «/ myapp / hello», что является лучшей и более понятной структурой для веб-приложения.

Теперь представим, что у нас есть еще одно представление в myapp «morning», и мы хотим отобразить его в myapp / url.py, затем мы изменим наш myapp / url.py на -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
   url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)

Это может быть преобразовано в -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),)

Как видите, теперь мы используем первый элемент нашего urlpatternsкортеж. Это может быть полезно, если вы хотите изменить имя приложения.

Отправка параметров в представления

Теперь мы знаем, как отображать URL-адреса, как их организовывать, теперь давайте посмотрим, как отправлять параметры в представления. Классическим примером является пример статьи (вы хотите получить доступ к статье через «/ article / article_id»).

Передача параметров осуществляется путем их захвата с помощью regexpв шаблоне URL. Если у нас есть представление, подобное следующему, в «myapp / view.py»

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

Мы хотим отобразить его в myapp / url.py, чтобы мы могли получить к нему доступ через «/ myapp / article / articleId», нам нужно следующее в «myapp / url.py» -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)

Когда Django увидит URL-адрес: «/ myapp / article / 42», он передаст параметры «42» в представление viewArticle, и в вашем браузере вы должны получить следующий результат:

Обратите внимание, что здесь важен порядок параметров. Предположим, нам нужен список статей за месяц в году, давайте добавим представление viewArticles. Наш view.py становится -

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

def viewArticle(request, month, year):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

Соответствующие url.py файл будет выглядеть так -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)

Теперь, когда вы перейдете в «/ myapp / article / 12/2006 /», вы получите «Отображение статей за: 2006/12», но если вы измените параметры, вы не получите того же результата.

Чтобы этого избежать, можно связать параметр URL-адреса с параметром представления. Для этого нашиurl.py станет -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)