Функция re_path

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

Основные параметры функции re_path: регулярное выражение, представление, которое будет обрабатывать запрос, и необязательные аргументы, такие как имя маршрута или дополнительные параметры. Регулярное выражение может содержать именованные группы для передачи параметров в представление.

Синтаксис

pythonfrom django.urls import re_path

re_path(route, view, kwargs=None, name=None)

Пример

Давайте создадим простой маршрут, который обрабатывает URL с числовым идентификатором статьи:

pythonfrom django.urls import re_path
from . import views

urlpatterns = [
  re_path(r'^articles/(?P<article_id>\d+)/$', views.article_detail, name='article_detail'),
]

Теперь создадим представление, которое обрабатывает этот маршрут:

pythonfrom django.http import HttpResponse
from myapp.models import Article

def article_detail(request, article_id):
  article = Article.objects.get(id=article_id)
  return HttpResponse(f"Article title: {article.title}")

Пример

Давайте создадим маршрут с использованием слэгов, который обрабатывает URL вида "articles/my-first-article/":

pythonfrom django.urls import re_path
from . import views

urlpatterns = [
  re_path(r'^articles/(?P<slug>[\w-]+)/$', views.article_by_slug, name='article_by_slug'),
]

А теперь создадим представление для обработки этого маршрута:

pythonfrom django.shortcuts import render
from myapp.models import Article

def article_by_slug(request, slug):
  article = Article.objects.get(slug=slug)
  return render(request, 'article_detail.html', {'article': article})

Пример

Давайте создадим маршрут, который обрабатывает дату в URL в формате "2024/12/25":

pythonfrom django.urls import re_path
from . import views

urlpatterns = [
  re_path(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', views.article_by_date, name='article_by_date'),
]

Создадим представление, которое фильтрует статьи по указанной дате:

pythonfrom django.http import JsonResponse
from myapp.models import Article
from datetime import datetime

def article_by_date(request, year, month, day):
  date_str = f"{year}-{month}-{day}"
  date_obj = datetime.strptime(date_str, '%Y-%m-%d').date()
  articles = Article.objects.filter(created_at__date=date_obj)
  data = [{"title": article.title, "created_at": article.created_at} for article in articles]
  return JsonResponse(data, safe=False)

Пример

Давайте создадим маршрут с дополнительными параметрами через kwargs:

pythonfrom django.urls import re_path
from . import views

urlpatterns = [
  re_path(r'^users/(?P<username>\w+)/$', views.user_profile, kwargs={'show_posts': True}, name='user_profile'),
]

Представление, которое обрабатывает этот маршрут, будет получать дополнительный параметр:

pythonfrom django.shortcuts import render
from myapp.models import User, Post

def user_profile(request, username, show_posts=False):
  user = User.objects.get(username=username)
  context = {'user': user}
  if show_posts:
    context['posts'] = Post.objects.filter(user=user)
  return render(request, 'user_profile.html', context)

Смотрите также

  • функция path,
    которая определяет маршруты с использованием конвертеров типов
  • функция include,
    которая включает другие URL-конфигурации
  • функция reverse,
    которая генерирует URL по имени маршрута
  • функция reverse_lazy,
    которая генерирует URL с отложенным вычислением