เปลี่ยนเส้นทางไปยังรูปแบบ url ที่ตั้งชื่อโดยตรงจาก urls.py ใน django หรือไม่


128

ใน Django ฉันจะเปลี่ยนเส้นทางง่ายๆโดยตรงจาก urls.py ได้อย่างไร โดยปกติแล้วฉันเป็นคนที่มีระเบียบเรียบร้อยชอบหลักการ DRY ดังนั้นฉันจึงต้องการได้รับเป้าหมายตามรูปแบบ URL ที่ตั้งชื่อไว้แทนที่จะเข้ารหัส URL ยาก

คำตอบ:


194

หากคุณใช้ 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 ตั้งค่าที่ชัดเจนเพื่อปิดเสียงคำเตือนนี้


18
โปรดทราบว่า RedirectView มีถาวร = True เป็นค่าเริ่มต้น
Daniel Backman

8
คุณสามารถเปลี่ยนเส้นทางได้ทุกอย่าง! ดังนี้:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
radtek

3
RedirectView จะมีถาวร = False เป็นค่าเริ่มต้นใน Django 1.9
Gravity Grave

5
ใครช่วยอธิบายว่า 'my_named_pattern' คืออะไรในตัวอย่างข้างต้น
Jay Modi

1
ส่งผ่านpattern_nameอาร์กิวเมนต์เพื่อRedirectViewดำเนินการย้อนกลับสำหรับคุณในเวลาโทรโดยใช้ชื่อรูปแบบที่กำหนด อื่น ๆพารามิเตอร์ที่มีประโยชน์รวมpermanentquery_stringและ
tutuDajuju

32

สิ่งนี้ใช้ได้กับฉัน

from django.views.generic import RedirectView

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

ในตัวอย่างข้างต้น'/'หมายความว่ามันจะเปลี่ยนเส้นทางไปยังหน้าดัชนีซึ่งคุณสามารถเพิ่มรูปแบบ URL ได้ด้วย


5
โปรดทราบว่าRedirectViewมีpermanent=Trueเป็นค่าเริ่มต้นใน Django เวอร์ชันเก่าและpermanent=Falseเป็นค่าเริ่มต้นในเวอร์ชัน Django> = 1.9
Flimm

21

สำหรับ 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


8

ฉันพยายามเปลี่ยนเส้นทาง 404 ทั้งหมดไปยังโฮมเพจและสิ่งต่อไปนี้ใช้งานได้ดี:

from django.views.generic import RedirectView
...
under urlpatterns, added:
    url(r'^.*/$', RedirectView.as_view(url='/home/')),
    url(r'^$', RedirectView.as_view(url='/home/')),
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.