URL-шаблоны позволяют связывать URL с представлениями. Шаблон URL состоит из шаблона строки, представления и имени (опционально), с помощью которого можно задать имя для URL всего проекта. Django перебирает каждый шаблон и останавливается на первом, который соответствует запрошенному URL. Затем библиотека импортирует представление совпавшего URL-шаблона и исполняет его, передавая экземпляр класса HttpRequest
и ключевое слово или позиционные аргументы.
Создайте файл urls.py
в папке приложение blog
и добавьте следующие строки:
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
# post views
path('', views.post_list, name='post_list'),
path('<int:year>/<int:month>/<int:day>/<slug:post>/',
views.post_detail,
name='post_detail'),
]
В этом коде было определено пространство имен приложения с помощью переменной app_name
. Это позволяет организовать URL по приложениям и использовать имена, ссылаясь на них. В примере два шаблона были определены с помощью функции path()
. Первый URL-шаблон не принимает аргументов и привязан к представлению post_list
. Второй — принимает следующие 4 аргумента и связан с представлением post_detail
:
year
: требует целое числоmonth
: требует целое числоday
: требует целое числоpost
: может быть составлен из слов и дефисов
Угловые скобки используются для захвата значений из URL. Любое значение, определенное в URL-шаблоне как <parameter>
, захватывается как строка. Для точного совпадения и возврата целого числа применяются конвертеры пути, такие как <int:year>
. А <slug:post>
нужен для совпадения ссылки (строки, состоящей из символов ASCII и чисел, плюс дефис и нижнее подчеркивание). Все конвертеры перечислены здесь: https://docs.djangoproject.com/en/2.0/topics/urls/#path-converters.
Если способ с использованием path()
и конвертеров не подходит, можно рассмотреть re_path()
. Она применяется для определения сложных URL-шаблонов с помощью регулярных выражений Python. Узнать больше об определении URL-шаблонов с помощью регулярных выражений можно по ссылке https://docs.djangoproject.com/en/2.0/ref/urls/#django.urls.re_path. Если вы не работали с ними раньше, рассмотрите эту тему в разделе HOWTO: https://docs.python.org/3/howto/regex/html_
Создавать файл
urls.py
для каждого приложения — лучший способ добиться того, чтобы их можно было использовать в других проектах.
Теперь нужно включить URL-шаблоны приложения blog
в основные URL-шаблоны проекта. Отредактируйте файл urls.py
в папке mysite
проекта, чтобы он выглядел следующим образом:
from django.urls import path, include
from django.contrib import admin
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls', namespace='blog')),
]
Новый URL-шаблон, определенный с помощью include
, ссылается на URL-шаблоны, определенные в приложении блога. Таким образом они относятся к пути blog/
и включены под пространством имен blog
. Пространства имен должны быть уникальными во всем проекте. Позже на URL блога можно будет ссылаться с помощью пространства имен, создавая их, например вот так blog:post_list
или blog:post_detail
. Больше о пространствах имен URL можно узнать по ссылке https://docs.djangoproject.com/en/2.0/topics/http/urls/#url-namespaces.
Канонические URL для моделей
Для построения канонических URL для объектов post
можно использовать URL post_detail
, определенные в предыдущем разделе. По правилам Django нужно добавить метод get_absolute_url()
в модель. Он вернет канонический URL объекта. Для этого метода будет использоваться метод reverse()
, который позволяет создавать URL согласно их названиям и передаваемым опциональным параметрам. Отредактируйте файл models.py
и добавьте следующее:
from django.urls import reverse
class Post(models.Model):
# ...
def get_absolute_url(self):
return reverse('blog:post_detail',
args=[self.publish.year,
self.publish.month,
self.publish.day,
self.slug])
В шаблонах будет использоваться метод get_absolute_url()
для связи с конкретными постами.