2009-10-05 63 views
35

Một vài tùy chọn trong tệp cài đặt django là các url, ví dụ: LOGIN_URLLOGIN_REDIRECT_URL. Có thể tránh hardcoding những url này, và thay vào đó sử dụng ánh xạ url đảo ngược? Tại thời điểm này thực sự là nơi duy nhất mà tôi thấy mình viết cùng một url ở nhiều nơi.Django - sử dụng ánh xạ url ngược trong cài đặt

+2

Tôi nghi ngờ điều đó, vì 'settings.py' được nạp trước module URL. Quan tâm để tìm hiểu mặc dù. Câu hỏi tuyệt vời. –

Trả lời

48

Django 1.5 và sau

Tính đến Django 1.5, LOGIN_URLLOGIN_REDIRECT_URL chấp nhận tên mẫu URL. Điều đó có nghĩa là bạn không cần phải mã hóa bất kỳ url nào trong cài đặt của mình.

LOGIN_URL = 'login' # name of url pattern 

Đối với Django 1,5-1,9, bạn cũng có thể sử dụng xem tên hàm, nhưng điều này là không nên vì nó bị phản đối trong Django 1.8 và sẽ không làm việc trong Django 1.10+.

LOGIN_URL = 'django.contrib.auth.views.login' # path to view function 

Django 1,4

Đối với Django 1.4, bạn có thể có thể sử dụng reverse_lazy

LOGIN_URL = reverse_lazy('login') 

Django 1.3 và trước đó

Đây là câu trả lời ban đầu, mà làm việc trước khi reverse_lazy đã được thêm vào Django

Trong url s.py, cài đặt nhập khẩu:

from django.conf import settings 

Sau đó, thêm mẫu url

urlpatterns=('', 
    ... 
    url('^%s$' %settings.LOGIN_URL[1:], 'django.contrib.auth.views.login', 
     name="login") 
    ... 
) 

Lưu ý rằng bạn cần phải cắt LOGIN_URL để loại bỏ các dấu gạch chéo lên hàng đầu.

Trong vỏ:

>>>from django.core.urlresolvers import reverse 
>>>reverse('login') 
'/accounts/login/' 
+1

Ah, giải pháp tốt, tôi đã không xem xét đi từ cài đặt -> url, chỉ có cách khác xung quanh. +1 –

+0

Và bạn có thể tránh mã hóa cứng gốc django, sao cho/accounts/login đăng nhập vào/root/accounts/login nếu ứng dụng django của bạn được triển khai trên example.com/root thay vì example.com/? – gozzilli

+0

@gozzilli - kể từ Django 1.4, tôi sẽ sử dụng 'reverse_lazy' thay vì nhập' settings.LOGIN_URL' vào url. Tôi đã cập nhật câu trả lời. – Alasdair

12

Trong django phiên bản phát triển reverse_lazy() sẽ trở thành một lựa chọn: https://docs.djangoproject.com/en/dev/ref/urlresolvers/#reverse-lazy

+1

+1 cảm ơn vì đã đầu hàng! –

+0

Dự kiến ​​phát hành te 1.4 vào tháng 3 năm 2012 –

+0

Đây là đoạn mã cho các phiên bản trước: http://djangosnippets.org/snippets/499/ –

Các vấn đề liên quan