Настройка маршрутизации URL в Django

маршрутизация

Файл urls.py в Django является основным механизмом для маршрутизации URL-адресов приложения. Он используется для соответствия URL-адресов определенным функциям (вызываемым view-функциям) в вашем приложении Django.

Обычно в Django проектах есть два вида файлов urls.py — один для основного проекта и один для каждого приложения в проекте. Файл urls.py приложения определяет URL-адреса, специфичные для данного приложения, а файл urls.py проекта используется для обработки URL-адресов, которые не определены в urls.py приложения.

Пример кода urls.py в Django:

from django.urls import path
from . import views

urlpatterns = [
path('', views.index, name='index'),
path('about/', views.about, name='about'),
path('contact/', views.contact, name='contact'),
]

В этом примере мы импортируем функции views из текущего приложения (обозначенного точкой) и определяем три URL-адреса, которые будут соответствовать этим функциям: пустой URL-адрес (''), URL-адрес 'about/' и URL-адрес 'contact/'.

Каждый URL-адрес представлен объектом path(), который принимает два обязательных аргумента: строку пути и вызываемую view-функцию. Дополнительно, мы можем указать имя маршрута (через параметр name), которое позволит нам легко ссылаться на этот URL-адрес в других местах кода.

Кроме path(), Django также предоставляет другие функции для маршрутизации URL-адресов, такие как re_path() для использования регулярных выражений в URL-адресах и include() для включения других файлов urls.py в ваше приложение.

Список urlpatterns

urlpatterns — это список, содержащий все пути маршрутизации URL-адресов для приложения Django. Он обрабатывается в том порядке, в котором описаны URL-адреса, сверху вниз, до тех пор, пока не будет найден соответствующий маршрут для запроса.

Каждый элемент списка urlpatterns обычно содержит объект path() или re_path(), который определяет маршрут URL-адреса, а также имя вызываемой view-функции. Также в этом списке можно использовать специальные функции, такие как include(), которая позволяет добавлять в urlpatterns другие списки urlpatterns из других модулей.

Например, мы можем импортировать urlpatterns из модуля другого приложения и добавить его в urlpatterns текущего приложения следующим образом:

from django.urls import include, path
from other_app.urls import urlpatterns as other_app_urls

urlpatterns = [
path('', views.index, name='index'),
path('about/', views.about, name='about'),
path('contact/', views.contact, name='contact'),
path('other/', include(other_app_urls)),
]

В этом примере мы добавляем путь "other/" и включаем urlpatterns из другого приложения "other_app".

Также можно использовать регулярные выражения для определения URL-адресов, используя re_path(). Например, чтобы сопоставить URL-адрес, содержащий числовой идентификатор, можно использовать следующий код:

from django.urls import re_path
from . import views

urlpatterns = [
re_path(r'^blog/(?P<id>\d+)/$', views.blog_post, name='blog_post'),
]

Здесь мы используем регулярное выражение, чтобы сопоставить URL-адрес вида "blog/1/" или "blog/2/" и передать число в качестве параметра id в вызываемую view-функцию blog_post().

Наконец, можно использовать параметры именованных аргументов, такие как name, чтобы задать имена маршрутов для каждого URL-адреса. Это позволяет обращаться к URL-адресам в шаблонах или в другом месте кода, не используя жестко закодированные URL-адреса.

Функция path

path() является функцией модуля django.urls, которая используется для определения маршрута URL-адреса в приложении Django. Эта функция принимает два обязательных аргумента: первый — это строка, которая определяет маршрут URL-адреса, а второй — это вызываемая view-функция, которая обрабатывает запрос для данного URL-адреса.

Например, чтобы определить маршрут для домашней страницы нашего приложения, мы можем использовать path() следующим образом:

from django.urls import path
from . import views

urlpatterns = [
path('', views.home, name='home'),
]

Здесь первый аргумент — это пустая строка, что означает, что это корневой URL-адрес для нашего приложения. Второй аргумент — это вызываемая view-функция home(), которая будет обрабатывать запросы для данного URL-адреса. И третий аргумент — это строковое имя для данного маршрута URL-адреса, которое может использоваться в других частях приложения, например, в шаблонах.

Кроме того, path() поддерживает опциональные параметры, которые могут использоваться для передачи дополнительной информации о маршруте URL-адреса. Например, мы можем передать параметр int в качестве типа данных для параметра URL-адреса, чтобы ограничить его только целыми числами:

from django.urls import path
from . import views

urlpatterns = [
path('post/<int:pk>/', views.post_detail, name='post_detail'),
]

Здесь мы определяем маршрут для URL-адреса, который имеет параметр pk, и ограничиваем его типом int. Это означает, что Django будет соответствовать только тем URL-адресам, которые имеют числовое значение для этого параметра. Кроме того, мы можем использовать и другие типы данных, такие как slug, str или uuid, чтобы ограничить значения параметров URL-адресов.

В общем, функция path() является одной из основных функций модуля django.urls, которая позволяет определять маршруты URL-адресов в приложении Django и связывать их с соответствующими view-функциями для обработки запросов.

Опциональные параметры

Опциональный параметр URL — это параметр, который может или не может присутствовать в URL-адресе. Это означает, что маршрут URL-адреса, который содержит опциональный параметр, может соответствовать URL-адресам с параметром или без него.

В Django опциональный параметр может быть определен с помощью знака вопроса «?» в конце имени параметра в URL-шаблоне. Это означает, что параметр является необязательным. Если параметр присутствует в URL-адресе, Django проверяет его на соответствие шаблону и передает его в соответствующее представление. Если параметр отсутствует в URL-адресе, Django передает значение параметра по умолчанию в представление, если таковое определено.

Опциональные параметры могут быть полезны для создания более гибких и динамических маршрутов URL-адресов, таких как поиск, сортировка, фильтрация или пагинация. Например, URL-адрес для страницы поиска может содержать параметр поискового запроса, который может быть опциональным, чтобы позволить пользователям просматривать результаты поиска без выполнения запроса.

Пример использования опциональных параметров в path()

В Django, опциональные параметры маршрутов URL могут быть определены в функции path() с помощью регулярных выражений. Опциональный параметр обозначается в URL с помощью символа ? после имени параметра. Вот пример определения маршрута URL с одним опциональным параметром:

from django.urls import path
from . import views

urlpatterns = [
path('blog/<int:year>/', views.year_archive),
path('blog/<int:year>/<str:month>/', views.month_archive),
path('blog/<int:year>/<str:month>/<slug:slug>/', views.post_detail),
]

В этом примере мы определяем три маршрута URL для нашего приложения blog. Первый маршрут ожидает целочисленный параметр year и соответствует URL-адресам вида /blog/2021/. Второй маршрут ожидает строковый параметр `month` и соответствует URL-адресам вида /blog/2021/march/. Третий маршрут ожидает параметр `slug` и соответствует URL-адресам вида /blog/2021/march/my-post/.

Второй и третий маршруты имеют опциональные параметры month и slug. Опциональные параметры могут быть заданы в маршруте URL, добавив к имени параметра знак вопроса ?. Например, URL-адрес /blog/2021/ будет соответствовать первому маршруту, а URL-адрес /blog/2021/march/ и /blog/2021/april/ будут соответствовать второму маршруту.

Пример обработки опциональных параметров в функции month_archive модуля views.py

Когда пользователь перейдет на этот URL-адрес, Django получит значения года и месяца из URL-адреса и передаст их в представление views.month_archive. Вот как может выглядеть код представления:

from django.shortcuts import render
from .models import Post

def month_archive (request, year=None, month=None):
    posts = Post.objects.all()

    if year:
        posts = posts.filter(created_date__year=year)
    if month:
        posts = posts.filter(created_date__month=month)

    return render(request, 'archive.html', {'posts': posts})

В этом примере мы импортируем модель «Post» и определяем представление «month_archive». Представление принимает два опциональных параметра year и month, а также объект запроса request.

В начале представления мы получаем все объекты «Post» с помощью метода «all()». Затем мы фильтруем этот запрос, если параметры year и month были переданы в URL-адресе.

Например, если пользователь переходит по URL-адресу «archive/2023/04/», мы будем фильтровать объекты «Post» по году 2023 и месяцу 04. Если пользователь переходит по URL-адресу «archive/2023/», мы будем фильтровать объекты «Post» только по году 2023.

Затем мы передаем отфильтрованные объекты «Post» в шаблон «archive.html» с помощью функции render(). В шаблоне мы можем использовать переменную «posts» для отображения списка постов, соответствующих определенному месяцу и году.

Таким образом, мы использовали опциональные параметры year и month в URL-адресе для фильтрации объектов «Post» по дате создания в представлении.

Стандартный опциональный параметр pk

Опциональный параметр «pk» в Django — это сокращение от «primary key» (первичный ключ) объекта модели, который является уникальным идентификатором объекта в базе данных. «pk» — это стандартное имя опционального параметра, которое используется в Django, когда мы хотим идентифицировать объект модели с помощью его первичного ключа в URL-адресе. Например, мы можем определить следующий URL-шаблон:

path('blog/<int:pk>/', views.blog_detail, name='blog_detail'),

В этом URL-шаблоне определен опциональный параметр «pk», который используется для отображения деталей конкретной статьи блога. В представлении, обрабатывающем этот URL-адрес, мы можем использовать «pk» для получения соответствующей статьи блога из базы данных и отображения ее содержимого на странице.

Значение параметра по умолчанию

Также можно задать значение параметра по умолчанию для опционального параметра в маршруте URL. Это можно сделать, используя знак равенства = и задав значение по умолчанию после имени параметра. Например, мы можем изменить третий маршрут следующим образом:

path('blog/<int:year>/<str:month>/<slug:slug>/', views.post_detail, {'author': 'anonymous'}, name='post_detail')

Здесь мы задаем значение по умолчанию для параметра `author` равным `anonymous`. Если значение параметра `author` не указано в URL-адресе, то будет использоваться значение по умолчанию.

Что такое slug

Slug — это короткое текстовое значение, которое используется в качестве уникального идентификатора для объекта модели в веб-разработке. Slug обычно используется в URL-адресах для обеспечения читаемых пользователем адресов страниц, которые содержат информацию о содержимом страницы.

Slug создается из имени объекта, обычно удаляются все пробелы и знаки пунктуации, а затем оставляются только буквы, цифры и дефисы. Он должен быть уникальным для каждого объекта модели и использоваться в URL-адресе для поиска и отображения информации о данном объекте.

В Django slug обычно определяется как поле модели CharField с параметром max_length, например:

from django.db import models

class Article(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=200, unique=True)
content = models.TextField()

В этом примере, при сохранении нового объекта Article, Django автоматически генерирует slug из поля title и сохраняет его в поле slug модели. Затем slug может быть использован в URL-адресе для отображения содержимого данной статьи.

 

Понравилась статья? Поделиться с друзьями:
Школа Виктора Комлева
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.