Перенаправить на именованный шаблон URL-адреса непосредственно из urls.py в django?


128

Как в Django выполнить простое перенаправление прямо из urls.py? Естественно, я хорошо организованный парень, отдающий предпочтение принципу DRY, поэтому я хотел бы получить цель на основе названного шаблона URL-адреса, а не жесткого кодирования URL-адреса.

Ответы:


194

Если вы используете Django 1.4 или 1.5, вы можете сделать это:

from django.core.urlresolvers import reverse_lazy
from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-page/$', RedirectView.as_view(url=reverse_lazy('my_named_pattern'), permanent=False)),
    ...

Если вы используете Django 1.6 или выше, вы можете сделать это:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-page/$', RedirectView.as_view(pattern_name='my_named_pattern', permanent=False)),
    ...

В Django 1.9 значение по умолчанию permanentизменилось с True на False. По этой причине, если вы не укажете permanentаргумент ключевого слова, вы можете увидеть это предупреждение:

RemovedInDjango19Warning: значение по умолчанию RedirectView.permanent изменится с True на False в Django 1.9. Установите явное значение, чтобы отключить это предупреждение.


18
Просто примечание: помните, что RedirectView по умолчанию имеет постоянное = True.
Daniel Backman

8
Вы можете перенаправить все! Вроде так:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
radtek 08

3
RedirectView будет иметь постоянное значение = False по умолчанию в Django 1.9.
Gravity Grave

5
Может кто-нибудь объяснить, что такое my_ named_pattern в приведенном выше примере.
Джей Моди

1
передача pattern_nameаргумента для выполнения RedirectViewобратного вызова во время вызова с использованием заданного имени шаблона. Другие полезные параметры включают permanentиquery_string .
tutuDajuju

32

У меня это работает.

from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-page/$', RedirectView.as_view(url='/')),
    ...

В приведенном выше примере '/'это означает, что он будет перенаправлен на страницу индекса, где вы также можете добавить любые шаблоны URL.


5
Просто обратите внимание, помните , что RedirectViewесть permanent=Trueпо умолчанию в старых версиях Django, и permanent=Falseпо умолчанию в Django версии> = 1.9.
Flimm 03

21

для django v2 +

from django.contrib import admin
from django.shortcuts import redirect
from django.urls import path, include


urlpatterns = [
    # this example uses named URL 'hola-home' from app named hola
    # for more redirect's usage options: https://docs.djangoproject.com/en/2.1/topics/http/shortcuts/
    path('', lambda request: redirect('hola/', permanent=False)),
    path('hola/', include("hola.urls")),
    path('admin/', admin.site.urls),
]

3
@Ali Постоянные перенаправления обычно имеют код HTTP 301, временные перенаправления обычно имеют код 302. Постоянные перенаправления используются для информирования браузера о структурных изменениях сайта. Временные перенаправления используются для указания новой страницы, которая будет отображаться после динамического действия на стороне сервера, такого как вход в систему. По документации permanent=Falseстоит по умолчанию. Для получения дополнительной информации прочтите: docs.djangoproject.com/en/2.1/topics/http/shortcuts/#redirect developer.mozilla.org/en-US/docs/Web/HTTP/…
Glushiator

9

Этот способ поддерживается в более старых версиях django, если вы не можете поддерживать RedirectView.

В view.py

def url_redirect(request):
    return HttpResponseRedirect("/new_url/")

В url.py

url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),

Вы можете сделать его постоянным, используя HttpResponsePermanentRedirect


8

Я пытался перенаправить все ошибки 404 на домашнюю страницу, и следующее отлично сработало:

from django.views.generic import RedirectView
...
under urlpatterns, added:
    url(r'^.*/$', RedirectView.as_view(url='/home/')),
    url(r'^$', RedirectView.as_view(url='/home/')),
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.