Функция re_path
Функция re_path используется для определения URL-маршрутов в Django на основе регулярных выражений. Она принимает строку с регулярным выражением, представление или класс представления и возвращает объект маршрута. В отличие от функции path, которая использует простые конвертеры типов, re_path позволяет задавать сложные паттерны URL с помощью полной мощи регулярных выражений Python.
Основные параметры функции re_path: регулярное выражение, представление, которое будет обрабатывать запрос, и необязательные аргументы, такие как имя маршрута или дополнительные параметры. Регулярное выражение может содержать именованные группы для передачи параметров в представление.
Синтаксис
from django.urls import re_path
re_path(route, view, kwargs=None, name=None)
Пример
Давайте создадим простой маршрут, который обрабатывает URL с числовым идентификатором статьи:
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^articles/(?P<article_id>\d+)/$', views.article_detail, name='article_detail'),
]
Теперь создадим представление, которое обрабатывает этот маршрут:
from 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/":
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^articles/(?P<slug>[\w-]+)/$', views.article_by_slug, name='article_by_slug'),
]
А теперь создадим представление для обработки этого маршрута:
from 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":
from 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'),
]
Создадим представление, которое фильтрует статьи по указанной дате:
from 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:
from 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'),
]
Представление, которое обрабатывает этот маршрут, будет получать дополнительный параметр:
from 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 с отложенным вычислением