English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Маппинг URL Django

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

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
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)),
 ) , 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
 )

Когда пользователь инициирует запрос веб-страницы в вашем веб-приложении, контроллер Django принимает управление и ищет соответствующий вид в файле url.py, затем возвращает HTML-ответ или, если не найден, ошибку 404 'Не найдено'. Самое важное - это «urlpatterns» - это туплятор, который определяет соответствие URL и вида. URL-модель соответствия resembles tuple −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
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'),
 ) , '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" к просмотру Hello, созданному в файле myapp/view.py. Как вы видите, маппинг состоит из трех элементов -

Модели - это регулярное выражение, которое соответствует URL и его маппингу. Работает с Python 're' модуль, все, что соответствует этому шаблону (очень полезно, если вы хотите передавать параметры через URL). Путь к просмотру от python - в то же время, как вы импортируете модуль. Название - для выполнения URL-обратного преобразования необходимо использовать命名 URL-модели для выполнения примеров выше. После этого запустите сервер и доступ к вашему просмотру через следующий URL: http://127.0.0.1/hello

Упорядочение URL

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

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

Нам нужно использовать следующий код, чтобы создать файл urls.py в папке myapp (myapp/urls.py) -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello')),

myproject/urls.py будет изменено на следующее-

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
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)),
 ) , '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», что является лучшей и более понятной структурой Web-приложения.

Создайте еще один файл вида: C:\myproject\templates\myapp\hello.html, содержимое которого будет следующим:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
   <meta http-equiv="content-type" content="text/html; charset=utf-8">
   <title>Hello</title>
   <meta name="robots" content="NONE,NOARCHIVE">
   </style>
 </head>
     <body>
         <h2>Welcome to w3codebox.</h2>
         <p>This is my first Django App</p>
     <body>
 </html>

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

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
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'),
 )

Это может быть重构ировано в

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
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-адреса, как их организовывать, давайте посмотрим, как передавать параметры в вид.

Параметры передаются через регулярное выражение URL-модели. Если у нас есть подобный вид, «myapp/view.py»

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
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/urls.py, поэтому мы можем получить доступ через «/myapp/article/articleId», нам нужно определить в следующем −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import url
 from . import views
 urlpatterns = [
     url(r'^hello', views.hello, name='hello'),
     url(r'^article/(\d+)/', views.viewArticle, name = 'article'), 
     url(r'^, views.index, name='index'),
 ], views.index, name='index'),
 ]


Когда Django видит URL: “/myapp/article/42” , он передает параметр '42' в вид viewArticle, в браузере должны получиться следующие результаты −

Обратите внимание, порядок параметров здесь очень важен. Предположим, что мы хотим просмотреть список статей за определенный месяц года, добавим соответствующий вид viewArticles. Код в file.py изменяется на −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
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 viewArticles(request, month, year):
    text = "Displaying articles of : %s/%s"%(year, month)
    return HttpResponse(text)

Соответствующий файл myapp/urls.py выглядит следующим образом −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
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'),)

Теперь, когда вы посещаете http://localhost:8000/myapp/articles/12/2015/, вы получите 'Displaying articles of: 2015/12', но если изменить параметры, вы не получите такой же результат.

Чтобы избежать этой ситуации, возможно, один параметр URL будет связаны с параметрами представления. Таким образом, url.py станет '-'

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ru.oldtoolbag.com
# Date : 2020-08-08
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'),)