Các câu trả lời hiện tại đã làm rất tốt trong việc giải thích những gì của reverse()
chức năng này trong Django.
Tuy nhiên, tôi đã hy vọng rằng câu trả lời của tôi rơi nhẹ khác nhau tại sao : tại sao sử dụng reverse()
ở vị trí của, cách tiếp cận cho là pythonic hơn đơn giản hơn khác trong mẫu-view ràng buộc, và một số lý do chính đáng cho sự phổ biến của việc này "chuyển hướng là gì qua reverse()
mẫu "trong logic định tuyến Django.
Một lợi ích chính là việc xây dựng ngược lại một url, như những người khác đã đề cập. Giống như cách bạn sẽ sử dụng {% url "profile" profile.id %}
để tạo url từ tệp cấu hình url của ứng dụng: vd path('<int:profile.id>/profile', views.profile, name="profile")
.
Nhưng như OP đã lưu ý, việc sử dụng reverse()
cũng thường được kết hợp với việc sử dụng HttpResponseRedirect
. Nhưng tại sao?
Tôi không chắc chắn đây là cái gì nhưng nó được sử dụng cùng với HttpResponseRedirect. Làm thế nào và khi nào thì đảo ngược () này được sử dụng?
Hãy xem xét những điều sau đây views.py
:
from django.http import HttpResponseRedirect
from django.urls import reverse
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected = question.choice_set.get(pk=request.POST['choice'])
except KeyError:
# handle exception
pass
else:
selected.votes += 1
selected.save()
return HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
))
Và tối thiểu của chúng tôi urls.py
:
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('<int:question_id>/results/', views.results, name='polls-results'),
path('<int:question_id>/vote/', views.vote, name='polls-vote')
]
Trong vote()
hàm, mã trong else
khối của chúng tôi sử dụng reverse
cùng với HttpResponseRedirect
mẫu sau:
HttpResponseRedirect(reverse('polls:polls-results',
args=(question.id)
Điều này trước hết, có nghĩa là chúng ta không phải mã hóa URL (phù hợp với nguyên tắc DRY) nhưng quan trọng hơn, reverse()
cung cấp một cách thanh lịch để xây dựng chuỗi URL bằng cách xử lý các giá trị được giải nén khỏi các đối số ( args=(question.id)
được xử lý bởi URLConfig). Giả sử question
có một thuộc tính id
chứa giá trị 5
, URL được xây dựng từ reverse()
đó sẽ là:
'/polls/5/results/'
Trong mã ràng buộc chế độ xem mẫu thông thường, chúng tôi sử dụng HttpResponse()
hoặc render()
vì chúng thường liên quan đến ít trừu tượng hơn: một chức năng xem trả về một mẫu:
def index(request):
return render(request, 'polls/index.html')
Nhưng trong nhiều trường hợp chuyển hướng hợp pháp, chúng tôi thường quan tâm đến việc xây dựng URL từ danh sách các tham số. Chúng bao gồm các trường hợp như:
- Gửi biểu mẫu HTML thông qua
POST
yêu cầu
- Đăng nhập người dùng sau khi xác thực
- Đặt lại mật khẩu thông qua mã thông báo web JSON
Hầu hết trong số này liên quan đến một số hình thức chuyển hướng và một URL được xây dựng thông qua một tập hợp các tham số. Hy vọng điều này thêm vào chủ đề đã có ích của câu trả lời!
url--> view name
. Nhưng đôi khi, giống như khi chuyển hướng, bạn cần đi theo hướng ngược lại và đặt cho Django tên của chế độ xem và Django tạo url phù hợp. Nói cách khác ,view name --> url
. Đó là,reverse()
(đó là đảo ngược của chức năng url). Nó có vẻ minh bạch hơn khi chỉ gọi nógenerateUrlFromViewName
nhưng quá dài và có thể không đủ chung chung: docs.djangoproject.com/en/dev/topics/http/urls/ Lỗi