2012-11-12 19 views
7

में Django यूआरएल टैग का उपयोग करके डीजेगो और एजेक्स के उपयोग पर चर्चा करने वाले बहुत सारे पोस्ट और पेज हैं, और मैंने पिछले दिन सैकड़ों पढ़े हैं या इस सवाल का जवाब ढूंढ रहे हैं। एक त्वरित अवलोकन:AJAX कॉल

उदाहरण के मई इस तरह की एक हार्ड-कोडेड URL दिखाने:

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

या कुछ URL टेम्प्लेट टैग का उपयोग, लेकिन कोई पैरामीटर के साथ:

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

हालांकि, मैं एक यूआरएल में एक Django- शैली पैरामीटर शामिल करना चाहता हूँ। यहां मेरी यूआरएल परिभाषा है:

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

हां, मैं कक्षा आधारित दृश्य का उपयोग कर रहा हूं, और यह DetailView पर आधारित है। यह दृश्य एक pk मान URL के प्रदान करने की लिए डिफ़ॉल्ट रूप से लग रहा है, और एक सामान्य टेम्पलेट में मैं का प्रयोग करेंगे:

{% url entity_name id_number %} 

एक लिंक प्रदान करने के लिए। मेरे कोड में, मैं पीके मान के लिए इनपुट बॉक्स में दर्ज मान को पकड़ना चाहता हूं।

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

तो, मेरे सवाल है, मैं एक इनपुट बॉक्स से एक मूल्य के साथ URL टेम्प्लेट टैग का उपयोग कर सकते हैं: यहाँ मेरी JavaScript का एक स्निपेट (जो काम नहीं करता है) है?

(मुझे पता है कि मैं के बजाय पोस्ट का उपयोग करें और पोस्ट डेटा में ID_NUMBER गुजारें सकता है, लेकिन उस DetailView साथ अच्छी तरह से काम नहीं करेगा।) आपकी मदद के लिए अग्रिम में

धन्यवाद।

उत्तर

10

Django एक सर्वर-साइड एप्लिकेशन है। जावास्क्रिप्ट क्लाइंट-साइड है। Django टेम्पलेट्स सर्वर पर प्रस्तुत किया जाता है, इसलिए {% url entity_name id_number %} का मूल्यांकन सर्वर पक्ष पर किया जाता है, और उसके बाद यह मान क्लाइंट को वापस कर दिया जाता है। इसके कारण, जावास्क्रिप्ट के साथ Django टेम्पलेट्स को गठबंधन करना आपके लिए असंभव है। हालांकि आपकी समस्या को हल करने के लिए आप कुछ चीजें कर सकते हैं।

चूंकि आप एजेक्स कॉल कर रहे हैं, और AJAX कॉल कुछ उपयोगकर्ता इनपुट पर निर्भर करता है, आमतौर पर सर्वर के लिए किसी भी प्रकार का उपयोगकर्ता इनपुट भेजने के लिए क्लाइंट के लिए सबसे अच्छा मार्ग क्वेरीस्ट्रिंग का उपयोग करके होता है (? के बाद चीज यूआरएल) या POST डेटा भेजकर। तो सबसे सरल बात यह है कि यूआरएल में pk को शामिल न करने के लिए अपना यूआरएल बदलना है, लेकिन GET या POST डेटा के हिस्से के रूप में इसे देखने के लिए।

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

और दृश्य (खेद मैं कक्षा आधारित विचारों से परिचित नहीं हूँ):

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

कि मुझे लगता है सबसे सुरुचिपूर्ण समाधान किया जाना है। यदि आपको क्लाइंट साइड पर यूआरएल बनाने की ज़रूरत है, तो आप सर्वर की तरफ एक टेम्पलेट यूआरएल जेनरेट कर सकते हैं और फिर पूर्ण यूआरएल प्राप्त करने के लिए क्लाइंट साइड पर जो भी हिस्सों की जरूरत है उसे प्रतिस्थापित कर सकते हैं। हालांकि इसे अधिक रखरखाव की आवश्यकता है और इसलिए अधिक त्रुटि प्रवण है। इस दृष्टिकोण का सरल जेएस उदाहरण:

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

दो अच्छे विकल्प। धन्यवाद! – Dashdrum

संबंधित मुद्दे