Как в Django выполнить перенаправление на другой URL

Ответ

Функция redirect из модуля django.shortcuts — это основной способ выполнить HTTP-перенаправление (редирект) в Django.

Она принимает различные аргументы (URL-путь, имя маршрута, объект модели) и возвращает экземпляр класса HttpResponseRedirect, который браузер интерпретирует как команду для перехода на новую страницу.

Основные способы использования:

  1. По имени URL-маршрута (рекомендуется): Наиболее надежный способ, так как он не зависит от конкретного URL-пути.
  2. По абсолютному или относительному пути: Прямое указание URL, например /articles/.
  3. По объекту модели: Если у модели определен метод 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, который браузеру как команда: «А ну быстро перезапроси вот этот новый адрес!».

Как этим пользоваться, чтобы не выстрелить себе в ногу?

Есть три основных способа, и один из них — просто пиздец какой правильный.

  1. По имени маршрута (идеальный вариант, ёпта). Это когда ты в своём urls.py даёшь пути имена, типа name='article_detail'. И потом в коде просто кидаешь это имя. Зачем? Да потому что если ты завтра поменяешь сам URL с /posts/ на /articles/, то во всём коде тебе не придётся, блядь, пол-проекта переписывать. Джанго сам всё подтянет. Умно, да?

  2. Прям по пути (способ для смелых и ленивых). Можно тупо строку с адресом запихнуть: '/admin/'. Работает? Работает. Но это как гвоздём прибивать: быстро, но если надо перевесить картину — будет дырка в стене. Негибко, нахуй.

  3. Через объект модели (магия, но требует подготовки). Если у твоей модели (допустим, 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)

Вот и вся магия. Ничего сложного, но если использовать первый способ — жить будет проще, честное слово. Не изобретай велосипед, просто именуй свои пути.