Redirecionar para o padrão de URL nomeado diretamente de urls.py no django?

127

No Django, como posso fazer um redirecionamento simples diretamente do urls.py? Naturalmente, sou um cara bem organizado, favorecendo o princípio DRY, portanto, gostaria de obter o alvo com base no padrão de URL nomeado, em vez de codificá-lo.

thnee
fonte

Respostas:

193

Se você estiver no Django 1.4 ou 1.5, você pode fazer o seguinte:

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)),
    ...

Se você estiver no Django 1.6 ou superior, você pode fazer o seguinte:

from django.views.generic import RedirectView

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

No Django 1.9, o valor padrão de permanentmudou de True para False. Por esse motivo, se você não especificar o permanentargumento da palavra - chave, poderá receber este aviso:

RemovedInDjango19Warning: O valor padrão de 'RedirectView.permanent' mudará de True para False no Django 1.9. Defina um valor explícito para silenciar este aviso.

thnee
fonte
18
Apenas uma observação, lembre-se de que o RedirectView possui permanente = True como padrão.
precisa
8
Você pode redirecionar tudo! Assim:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
radtek
3
O RedirectView terá permanente = False como padrão no Django 1.9.
Gravity Grave
5
Alguém pode explicar o que é 'my_named_pattern' no exemplo acima.
Jay Modi
1
passar o pattern_nameargumento para RedirectViewexecutar a reversão para você no momento da chamada usando o nome do padrão fornecido. Outros parâmetros úteis incluem permanentequery_string .
TutuDajuju
32

Isso funciona para mim.

from django.views.generic import RedirectView

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

No exemplo acima '/', ele será redirecionado para a página de índice, onde você também pode adicionar qualquer padrão de URL.

Jay Modi
fonte
5
Apenas uma observação, lembre-se de que ele RedirectViewtem permanent=Truecomo padrão nas versões mais antigas do Django e permanent=Falsecomo padrão nas versões do Django> = 1.9.
Flimm
20

para 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),
]
Glushiator
fonte
3
@Ali Os redirecionamentos permanentes geralmente têm o código HTTP 301, os redirecionamentos temporários geralmente têm o código 302. Os redirecionamentos permanentes são usados ​​para informar o navegador sobre as alterações estruturais do site. Redirecionamentos temporários são usados ​​para indicar uma nova página a ser mostrada após uma ação dinâmica do servidor, como o login. De acordo com a documentação permanent=Falseé o padrão. Para mais detalhes, leia: docs.djangoproject.com/en/2.1/topics/http/shortcuts/#redirect developer.mozilla.org/en-US/docs/Web/HTTP/…
Glushiator
9

Dessa forma, é suportado nas versões mais antigas do django se você não puder suportar o RedirectView

Em view.py

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

No url.py

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

Você pode torná-lo permanente usando HttpResponsePermanentRedirect

sirFunkenstine
fonte
7

Eu estava tentando redirecionar todos os 404s para a página inicial e o seguinte funcionou muito bem:

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