Перенаправлення на названий шаблон URL безпосередньо з urls.py у django?


127

Як у Django можна зробити просту переспрямування безпосередньо з urls.py? Природно, я добре організований хлопець, який віддає перевагу принципу DRY, тому я хотів би отримати ціль, грунтуючись на її назві URL-адреси, а не на жорсткому кодуванні URL-адреси.

Відповіді:


193

Якщо ви перебуваєте на 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" за замовчуванням у Django 1.9 зміниться з True на False. Встановіть явне значення, щоб заглушити це попередження.


18
Лише зауважте, пам’ятайте, що RedirectView за замовчуванням має постійний = True.
Даніель Бекман

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

3
У режимі RedirectView у Django 1.9 буде за замовчуванням постійний = Неправильний.
Гравітація Могила

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
Лише зауважте, пам’ятайте, що у старих версіях Django за замовчуванням RedirectViewє, permanent=Trueа у версіях Django - permanent=Falseза замовчуванням> = 1.9.
Flimm

20

для 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


7

Я намагався перенаправити всі 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.