Ответ
Функция redirect из модуля django.shortcuts — это основной способ выполнить HTTP-перенаправление (редирект) в Django.
Она принимает различные аргументы (URL-путь, имя маршрута, объект модели) и возвращает экземпляр класса HttpResponseRedirect, который браузер интерпретирует как команду для перехода на новую страницу.
Основные способы использования:
- По имени URL-маршрута (рекомендуется): Наиболее надежный способ, так как он не зависит от конкретного URL-пути.
- По абсолютному или относительному пути: Прямое указание URL, например
/articles/. - По объекту модели: Если у модели определен метод
get_absolute_url(), Django автоматически использует его для определения URL для редиректа.
Пример:
from django.shortcuts import redirect
from .models import Article
def my_view(request):
# 1. Рекомендуемый способ: по имени URL из urls.py
return redirect('articles:list')
# 2. Альтернатива: по абсолютному пути
# return redirect('/articles/')
# 3. Перенаправление на страницу конкретного объекта
# article = Article.objects.get(pk=1)
# return redirect(article) # Требует наличия метода get_absolute_url() в модели
Временный (302) vs. Постоянный (301) редирект
По умолчанию redirect выполняет временное перенаправление (HTTP-статус 302). Чтобы сделать его постоянным (статус 301), что важно для SEO, используйте параметр permanent=True:
return redirect('articles:list', permanent=True) Ответ 18+ 🔞
А, слушай, про этот redirect в Джанго! Ну, это же, блядь, классика, основа основ, как хлеб с маслом. Чувак, представь: пользователь что-то сделал — отправил форму, нажал кнопку — и его надо, сука, плавно перекинуть на другую страницу, чтобы он не пялился на белый экран. Вот для этого эта штука и существует.
По сути, функция redirect из django.shortcuts — это такой вежливый, но настойчивый охранник в клубе. Он тебе не говорит «пошёл нахуй», а тактично, но твёрдо: «Сэр, мероприятие продолжится в соседнем зале, пройдёмте, пожалуйста». И возвращает он не просто ответ, а специальный объект HttpResponseRedirect, который браузеру как команда: «А ну быстро перезапроси вот этот новый адрес!».
Как этим пользоваться, чтобы не выстрелить себе в ногу?
Есть три основных способа, и один из них — просто пиздец какой правильный.
-
По имени маршрута (идеальный вариант, ёпта). Это когда ты в своём
urls.pyдаёшь пути имена, типаname='article_detail'. И потом в коде просто кидаешь это имя. Зачем? Да потому что если ты завтра поменяешь сам URL с/posts/на/articles/, то во всём коде тебе не придётся, блядь, пол-проекта переписывать. Джанго сам всё подтянет. Умно, да? -
Прям по пути (способ для смелых и ленивых). Можно тупо строку с адресом запихнуть:
'/admin/'. Работает? Работает. Но это как гвоздём прибивать: быстро, но если надо перевесить картину — будет дырка в стене. Негибко, нахуй. -
Через объект модели (магия, но требует подготовки). Если у твоей модели (допустим,
Article) прописан методget_absolute_url(), который возвращает её URL, то можно просто передать сам объект статьи вredirect. Джанго, такой хитрожопый, сам догадается, куда его вести. Красиво, но надо заранее настроить.
Вот, смотри, как в коде это выглядит:
from django.shortcuts import redirect
from .models import Article
def my_view(request):
# 1. Правильно, как в учебнике. По имени из urls.py.
return redirect('articles:list')
# 2. По-простому, по-деревенски. Прямой путь.
# return redirect('/articles/')
# 3. По-умному, для красоты. Кидаем объект.
# article = Article.objects.get(pk=1)
# return redirect(article) # Работает, если в модели есть get_absolute_url()
А теперь про SEO, блядь, важный момент!
По умолчанию redirect делает временный редирект (статус 302). Это как сказать поисковикам: «Эй, Гугл, пока иди сюда, но это ненадолго». А бывает нужно постоянный (301). Это когда ты насовсем переезжаешь со страницы «мои-статьи» на страницу «блог». Чтобы поисковики перенесли весь свой авторитет на новый адрес, нужно явно указать permanent=True:
return redirect('articles:list', permanent=True)
Вот и вся магия. Ничего сложного, но если использовать первый способ — жить будет проще, честное слово. Не изобретай велосипед, просто именуй свои пути.