Przekierować do nazwanego wzorca url bezpośrednio z urls.py w django?

127

W Django, jak mogę zrobić proste przekierowanie bezpośrednio z urls.py? Oczywiście jestem dobrze zorganizowanym facetem, faworyzującym zasadę DRY, więc chciałbym uzyskać cel na podstawie jego nazwanego wzorca adresu URL, a nie na sztywno zakodowanym adresie URL.

kolano
źródło

Odpowiedzi:

193

Jeśli korzystasz z Django 1.4 lub 1.5, możesz to zrobić:

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

Jeśli korzystasz z Django 1.6 lub nowszego, możesz to zrobić:

from django.views.generic import RedirectView

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

W Django 1.9 domyślna wartość permanentzmieniła się z True na False. Z tego powodu, jeśli nie określisz permanentargumentu słowa kluczowego, możesz zobaczyć następujące ostrzeżenie:

RemovedInDjango19Warning: Domyślna wartość „RedirectView.permanent” zmieni się z True na False w Django 1.9. Ustaw jawną wartość, aby wyciszyć to ostrzeżenie.

kolano
źródło
18
Uwaga, pamiętaj, że RedirectView ma domyślnie permanent = True.
Daniel Backman,
8
Możesz przekierować wszystko! Tak jak to:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
radtek
3
RedirectView będzie miał domyślnie wartość permanent = False w Django 1.9.
Gravity Grave,
5
Czy ktoś może wyjaśnić, co to jest „moj_nazwa_wzór” w powyższym przykładzie.
Jay Modi,
1
przekazanie pattern_nameargumentu do RedirectViewwykonania odwrotnego za Ciebie w czasie wywołania przy użyciu podanej nazwy wzorca. Inne przydatne parametry obejmują permanentiquery_string .
tutuDajuju
32

To działa dla mnie.

from django.views.generic import RedirectView

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

W powyższym przykładzie '/'oznacza, że ​​przekieruje do strony indeksowej, na której możesz również dodać dowolne wzorce adresów URL.

Jay Modi
źródło
5
Tylko uwaga, należy pamiętać, że RedirectViewma permanent=Truedomyślnie w starszych wersji Django, a permanent=Falsejako domyślny w Django wersji> = 1.9.
Flimm
20

dla 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
źródło
3
@Ali Stałe przekierowania zwykle mają kod HTTP 301, tymczasowe przekierowania zwykle mają kod 302. Stałe przekierowania służą do informowania przeglądarki o zmianach strukturalnych witryny. Tymczasowe przekierowania służą do wskazania nowej strony, która ma być wyświetlana po dynamicznej akcji po stronie serwera, takiej jak logowanie. Zgodnie z dokumentacją permanent=Falsejest to ustawienie domyślne. Aby uzyskać więcej informacji, przeczytaj: docs.djangoproject.com/en/2.1/topics/http/shortcuts/#redirect developer.mozilla.org/en-US/docs/Web/HTTP/ ...
Glushiator
9

Ten sposób jest obsługiwany w starszych wersjach django, jeśli nie możesz obsługiwać RedirectView

In view.py

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

W pliku url.py

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

Możesz to uczynić na stałe, używając HttpResponsePermanentRedirect

sirFunkenstine
źródło
7

Próbowałem przekierować wszystkie 404 na stronę główną i następujące rzeczy działały świetnie:

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