Chuyển hướng đến mẫu url được đặt tên trực tiếp từ urls.py trong django?


127

Trong Django, làm cách nào tôi có thể thực hiện chuyển hướng đơn giản trực tiếp từ urls.py? Đương nhiên, tôi là một người có tổ chức tốt, thiên về nguyên tắc DRY, vì vậy tôi muốn có được mục tiêu dựa trên mẫu url được đặt tên của nó, thay vì mã hóa url.

Câu trả lời:


193

Nếu bạn đang ở trên Django 1.4 hoặc 1.5, bạn có thể làm điều này:

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

Nếu bạn đang ở trên Django 1.6 trở lên, bạn có thể làm điều này:

from django.views.generic import RedirectView

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

Trong Django 1.9, giá trị mặc định của permanentđã thay đổi từ Đúng thành Sai. Vì điều này, nếu bạn không chỉ định permanentđối số từ khóa, bạn có thể thấy cảnh báo này:

RemoveedInDjango19Warning: Giá trị mặc định của 'RedirectView.permanent' sẽ thay đổi từ True thành false trong Django 1.9. Đặt một giá trị rõ ràng để tắt cảnh báo này.


18
Chỉ cần một lưu ý, hãy nhớ rằng RedirectView có vĩnh viễn = Đúng như mặc định.
Daniel Backman

8
Bạn có thể chuyển hướng mọi thứ! Giống như vậy:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
radtek

3
RedirectView sẽ có vĩnh viễn = Sai như mặc định trong Django 1.9.
Gravity Grave

5
Ai đó có thể giải thích 'my_named_potype' trong ví dụ trên không.
Jay Modi

1
chuyển pattern_nameđối số để RedirectViewthực thi ngược lại cho bạn tại thời điểm cuộc gọi bằng cách sử dụng tên mẫu đã cho. Các thông số hữu íchpermanentquery_string khác bao gồm .
tutuDajuju

32

Điều này làm việc cho tôi.

from django.views.generic import RedirectView

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

Trong ví dụ trên '/'có nghĩa là nó sẽ chuyển hướng đến trang chỉ mục, nơi bạn cũng có thể thêm bất kỳ mẫu url nào.


5
Chỉ cần lưu ý, hãy nhớ rằng nó RedirectViewpermanent=Truemặc định trong các phiên bản cũ của Django và permanent=Falsenhư mặc định trong các phiên bản Django> = 1.9.
Flimm

20

cho 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 Chuyển hướng vĩnh viễn thường có mã HTTP 301, chuyển hướng tạm thời thường có mã 302. Chuyển hướng vĩnh viễn được sử dụng để thông báo cho trình duyệt về các thay đổi cấu trúc của trang web. Chuyển hướng tạm thời được sử dụng để chỉ ra một trang mới sẽ được hiển thị sau một hành động phía máy chủ động như đăng nhập. Theo tài liệu permanent=Falselà mặc định. Để biết thêm chi tiết, vui lòng đọc: docs.djangoproject.com/en/2.1/topics/http/shortype/#redirect developer.mozilla.org/en-US/docs/Web/HTTP/
trộm

9

Cách này được hỗ trợ trong các phiên bản cũ hơn của django nếu bạn không thể hỗ trợ RedirectView

Trong chế độ xem

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

Trong url.py

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

Bạn có thể làm cho nó vĩnh viễn bằng cách sử dụng HttpResponsePermanentRedirect


7

Tôi đã cố gắng chuyển hướng tất cả 404 đến trang chủ và những điều sau đây hoạt động rất tốt:

from django.views.generic import RedirectView
...
under urlpatterns, added:
    url(r'^.*/$', RedirectView.as_view(url='/home/')),
    url(r'^$', RedirectView.as_view(url='/home/')),
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.