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

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

6 ответов

Решение

Если вы используете 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. Установите явное значение, чтобы отключить это предупреждение.

Это работает для меня.

from django.views.generic import RedirectView

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

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

Для 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-home', permanent=False)),
    path('hola/', include("hola.urls")),
    path('admin/', admin.site.urls),
]

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

from django.views.generic import RedirectView
...
under urlpatterns, added:
    url(r'^.*/$', RedirectView.as_view(url='/home/')),
    url(r'^$', RedirectView.as_view(url='/home/')),

Этот способ поддерживается в старых версиях 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

Вы можете сделать это прямо на urls.py, просто выполнив что-то вроде:

      url(r'^story/(?P<pk>\d+)/',
        lambda request, pk: HttpResponsePermanentRedirect('/new_story/{pk}'.format(pk=pk)))

Просто убедитесь, что у вас есть новый URL-адрес, готовый для получения перенаправления! Также обратите внимание на вид перенаправления, в примере я использую постоянное перенаправление .

Другие вопросы по тегам