2012-11-12 37 views
7

Có rất nhiều bài đăng và trang thảo luận về việc sử dụng Django và AJAX, và tôi đã đọc hàng trăm ngày trước hoặc để tìm câu trả lời cho câu hỏi này. Một cái nhìn tổng quát:Sử dụng Thẻ URL Django trong Cuộc gọi AJAX

tháng trong những ví dụ cho thấy một URL mã hóa cứng như thế này:

$.post("/projects/create/", {"name" : name}, function(data) {... 

hoặc một số sử dụng mẫu URL thẻ, nhưng không có thông số:

$.post("{% url create_project %}", {"name" : name}, function(data) {... 

Tuy nhiên, Tôi muốn bao gồm thông số kiểu Django trong URL. Đây là định nghĩa url của tôi:

url(r'ajax/entity_name/(?P<pk>\w+)/$',EntityAjaxView.as_view(),name='entity_name'), 

Vâng, tôi đang sử dụng chế độ xem dựa trên lớp và dựa trên DetailView. Chế độ xem này theo mặc định cho giá trị pk được cung cấp trong URL và trong mẫu chuẩn tôi sẽ sử dụng:

{% url entity_name id_number %} 

để cung cấp liên kết. Trong mã của tôi, tôi muốn lấy giá trị được nhập vào một hộp đầu vào cho giá trị pk. Đây là đoạn mã JavaScript của tôi (không hoạt động):

var id_number = $('#id_endowmententity_set-' + rownum + '-id_number').val() 
$.ajax({ 
    type: "GET", 
url: '{% url entity_name id_number %}', 

Vì vậy, câu hỏi của tôi là, tôi có thể sử dụng thẻ mẫu URL có giá trị từ hộp nhập liệu không?

(Tôi biết rằng tôi có thể sử dụng POST thay vì GET và vượt qua id_number trong dữ liệu POST, nhưng điều đó sẽ không làm việc tốt với các DetailView.)

Cảm ơn trước sự giúp đỡ của bạn.

Trả lời

10

Django là ứng dụng phía máy chủ. Javascript là phía máy khách. Các mẫu Django được hiển thị trên máy chủ, do đó, {% url entity_name id_number %} được đánh giá ở phía máy chủ và sau đó giá trị của nó được trả lại cho máy khách. Chỉ vì điều này, bạn không thể kết hợp các mẫu Django với javascript. Tuy nhiên có một vài điều bạn có thể làm để giải quyết vấn đề của mình.

Vì bạn đang thực hiện cuộc gọi ajax và cuộc gọi ajax tùy thuộc vào đầu vào của người dùng, thường là tuyến đường tốt nhất để khách hàng gửi bất kỳ kiểu người dùng nào nhập vào máy chủ bằng cách sử dụng chuỗi truy vấn (điều sau ? trong URL) hoặc bằng cách gửi dữ liệu POST. Vì vậy, điều đơn giản nhất là thay đổi url của bạn để không bao gồm số pk trong url, nhưng để có được điều đó như là một phần của dữ liệu GET hoặc POST.

url(r'ajax/entity_name/$', EntityAjaxView.as_view(), name='entity_name'), 

và xem (xin lỗi tôi không quen thuộc với quan điểm dựa trên lớp):

def entity_name(request): 
    pk = request.GET.get('pk') 
    ... 

Đó dường như với tôi là giải pháp thanh lịch nhất. Tuy nhiên, nếu bạn hoàn toàn cần xây dựng url ở phía máy khách, bạn có thể tạo một url mẫu ở phía máy chủ và sau đó thay thế bất kỳ phần nào bạn cần ở phía máy khách để có được url đầy đủ. Tuy nhiên điều này đòi hỏi bảo trì nhiều hơn và do đó có nhiều lỗi hơn. Ví dụ đơn giản về phương pháp tiếp cận này:

var id_number = $('#id_endowmententity_set-' + rownum + '-id_number').val(), 
    url = '{% url entity_name 0 %}'.replace('0', id_number); 
$.ajax({ 
    type: "GET", 
    url: url, 
    ... 
}); 
+0

Hai tùy chọn tốt. Cảm ơn! – Dashdrum

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