2009-11-25 4 views
22

के लिए Django रिवर्स() मेरे प्रोजेक्ट में मेरे पास Ajax विधियां हैं, बाहरी क्लाइंट-साइड स्क्रिप्ट्स के साथ (मैं जावास्क्रिप्ट को टेम्पलेट्स में शामिल नहीं करना चाहता हूं!) और यूआरएल बदलना मेरे लिए दर्द है क्योंकि मैं मैन्युअल रूप से मेरे अजाक्स कॉल में यूआरएल बदलने की जरूरत है।जावास्क्रिप्ट

क्या जावास्क्रिप्ट में {% url %} templatetag के व्यवहार को अनुकरण करने का कोई तरीका है?

उदाहरण के लिए, ^ajax से शुरू होने वाले urlpatterns प्रिंट करें और बाद में स्क्रिप्ट में उनके वास्तविक मूल्यों के साथ पैटर्न बदल दें?

मेरे दिमाग में यही है, और मेरा सवाल है - क्या ऐसी चीजों को करने के लिए कोई सामान्य प्रथाएं हैं? शायद कुछ पुन: प्रयोज्य अनुप्रयोग? इसके अलावा मुझे आपकी सलाह और प्रासंगिक विचारों को पढ़ने में खुशी होगी।

अद्यतन 1: मैं अभिकलन यूआरएल, नहीं स्थिर लोगों के बारे में बात कर रहा हूँ:

url(r'^ajax/delete/(?P<type>image|audio)/(?P<item_id>\d+)/from/set/(?P<set_id>\d+)/$', 'blog.ajax.remove_item_from_set'), 

उत्तर

10

https://github.com/mlouro/django-js-utils

dutils एक छोटे उपयोगिता पुस्तकालय है कि कुछ उपयोगिताओं कि एक Django बैकएंड के शीर्ष पर रिया के विकास में मदद मिलेगी के साथ जावास्क्रिप्ट/Django डेवलपर्स प्रदान करना है।

यह वर्तमान में निम्नलिखित विशेषताएं समर्थन करता है:

  • Django यूआरएल पैदा करने के लिए रिवर्स विधि ...
+0

कुछ कांटे की जांच भी करें। दिमित्री-गनिदाश प्रबंधन कमांड वाले यूआरएल बनाता है। ljosa एक दृश्य बनाया जो उन्हें फ्लाई पर बनाता है। – SystemParadox

+0

ऐसा लगता है कि इस समाधान को अभी भी {url_name: pattern} शब्दकोश को हार्ड कोड की आवश्यकता है। dutils.conf.urls.example.js में मिली सूची की पीढ़ी को स्वचालित करने के लिए अच्छा होगा ??? – Fydo

+0

@Fydo इसके लिए उपयोग करें https://github.com/ierror/django-js-reverse –

4

क्या मैं आमतौर पर करते हैं तो एक <input type="hidden" /> तत्व में, या rel="" विशेषता में यूआरएल डाल दिया है।

तब, जब जे एस लेखन (नीचे jQuery उपयोग करते हुए) मुझे क्या करना:

$('div#show_more').click(function() { 
    var url = $(this).attr('rel'); 
    // or 
    var url = $('#more_url').val(); 

    $.get(url, function() { /* ... */ }); 
}); 

अमानक गुण अच्छी तरह से सभी प्रमुख ब्राउज़रों और छिपे हुए तत्वों द्वारा समर्थित हैं रूपों में होने की जरूरत नहीं है।

+0

आप अभिकलन यूआरएल के साथ क्या करना होगा है है? यूआरएल (आर '^ AJAX/हटाएं/(? पी छवि | ऑडियो)/(? पी \ डी +)/से/सेट/(? पी \ डी +)/$', 'blog.ajax.remove_item_from_set') , – dir01

+0

आप उन्हें पृष्ठ पर कहीं भी डालते हैं (django टेम्पलेट में) - जावास्क्रिप्ट एक अलग फ़ाइल है जो django द्वारा उत्पन्न नहीं होती है। –

14

जावास्क्रिप्ट को अपने टेम्पलेट्स में डालने में क्या गड़बड़ है?

आप अक्सर अपने एचटीएमएल टेम्पलेट में प्रारंभिक फ़ंक्शन को कॉल करना चाहते हैं, तो इसे किसी ऑब्जेक्ट को क्यों न दें जिसका उपयोग आप करेंगे?

<script> 
MYGLOBAL.mymodule.init({ 
    fancy_ajax_url: '{% url fancy %}', 
    fancier_ajax_url: '{% url fancier %}' 
}); 
</script> 

यदि आप पाते हैं अपने आप को चर का एक बहुत इस तरह से गुजर रहा है, या अपने जावास्क्रिप्ट कि आप अपने HTML टेम्पलेट्स में क्या में तर्क का उपयोग करना चाहते है, तो क्यों Django के templating इंजन के माध्यम से अपनी स्क्रिप्ट से प्रस्तुत नहीं? याद रखें, Django टेम्पलेट्स केवल HTML दस्तावेज़ों के लिए नहीं हैं - अक्सर यह सादा पाठ, एक्सएमएल, JSON, और हाँ जावास्क्रिप्ट के लिए टेम्पलेट्स का उपयोग करने में मदद करता है। प्रदर्शन के बारे में चिंतित? फिर परिणाम कैश करें।

+0

यह मेरे काम के प्रारंभिक हैं, इसलिए इसका सामना करें) जेएस फाइलें सीडीएन के माध्यम से वितरित की जाएंगी। मैं अपने पृष्ठ के शीर्ष पर urlpatterns डालने के लिए क्या कर सकता हूं (जेएस चर सेट करें) और वास्तविक डेटा – dir01

+3

के साथ regexps से असली यूआरएल संकलित करना इस दृष्टिकोण का नकारात्मक पक्ष यह है कि दृश्य तर्कों का उपयोग करने का कोई तरीका नहीं है। – intgr

+0

डिज़ाइन द्वारा, भाषाओं को मिलाकर एक बुरा विचार है। – azmeuk

12

मैं एक तंत्र है कि आपके Django परियोजना में url प्रतिमानों की सूची बनाता है बनाया है और जावास्क्रिप्ट फ़ाइल में आउटपुट करता है। यह django-js-utils का एक कांटा है।

रेपो लिंक यहाँ है: https://github.com/Dimitri-Gnidash/django-js-utils

16

यूआरएल स्ट्रिंग पैदा करने के लिए जावास्क्रिप्ट सहायक कार्य (Django टेम्पलेट में) बनाने का प्रयास करें। सरल रूप में वे इस तरह दिख सकते हैं:

function generete_some_url(id){ 
    return "{% url some_url itemid=112233 %}".replace("112233", id); 
} 

शायद इसमें कुछ अन्य प्रभाव हैं लेकिन मुझे लगता है कि इसे काम करना चाहिए।

+0

आप मेरी जान बचाओ, धन्यवाद! सिर्फ एक अवलोकन, मुझे लगता है कि प्लेसहोल्डर में id = 0 का उपयोग करना बेहतर है क्योंकि आपके पास कभी भी बराबर 0 नहीं होगा, हम 112233 के लिए ऐसा नहीं कह सकते थे, लेकिन दूसरे में स्ट्रिंग के सभी 0 बदल सकते हैं, शायद हमें सही स्थिति में बदलने के लिए एक टेम्पलेट चाहिए। –

+0

मुझे खुशी है कि आप मेरे समाधान की तरह हैं। आईडी के संबंध में यह अधिक महत्वपूर्ण है कि आप जिस मूल्य को प्रतिस्थापित कर रहे हैं वह यूआरएल स्ट्रिंग में कहीं और नहीं है। तो यह वास्तव में मीटर नहीं है 0 या 112233 जहां तक ​​वही मान यूआरएल स्ट्रिंग में कहीं और नहीं है। – kodmasin

2

पहले, आप अपने यूआरएल नाम रखना चाहिए:

<script src="{{ STATIC_URL }}js/my-module.js"></script> 
<script> 
$(function(){ 
    MyModule.init('{% url blog-item item.id %}'); 
}); 
</script> 
// js/my-module.js 
var MyModule = { 
    init: function(url) { 
     console.log(url); 
    } 
}; 

आप अपने URL में टोकन इस्तेमाल कर सकते हैं:

url(r'^blog/(?P<item_id>\d+)/$', 'blog.ajax.remove_item', name='blog-item'), 

तो फिर आप अपने मॉड्यूल के लिए चर के रूप में यूआरएल गुजारें सकता

<script src="{{ STATIC_URL }}js/my-module.js"></script> 
<script> 
$(function(){ 
    MyModule.init("{% url blog-item item_id='0000' %}"); 
}); 
</script> 
// js/my-module.js 
var MyModule = { 
    init: function(url) { 
     var id = 1; 
     this._url = url; 
     console.log(this.url(id)); 
    }, 
    url: function(id) { 
     return this._url.replace('0000', id); 
    } 
}; 

ध्यान दें कि सफलतापूर्वक हल करने के लिए आपके टोकन को रेगेक्स प्रकार से मेल खाना चाहिए (मैं {item_id} का उपयोग टोकन के रूप में नहीं कर सकता क्योंकि इसे \d+ के साथ परिभाषित किया गया है)।

मैं इस समाधान से थोड़ा असंतुष्ट था और मैंने django के साथ जावास्क्रिप्ट को संभालने के लिए अपना स्वयं का एप्लिकेशन लिखकर समाप्त किया: django.js। इस आवेदन के साथ, मैं कर सकते हैं:

{% load js %} 
{% django_js %} 
{% js "js/my-module.js" %} 
// js/my-module.js 
var MyModule = { 
    init: function() { 
     var id = 1; 
     console.log(Django.url('blog-item', id)); 
    } 
}; 

$(function(){ 
    MyModule.init(); 
}); 
6

हम इस उद्देश्य के लिए django-js-reverse नामक एक छोटे से एप्लिकेशन बनाया।

उदाहरण के लिए यदि आप एक नामित url प्राप्त कर सकते हैं

urls.py?

यूआरएल (आर '^/betterliving/(पी [- \ डब्ल्यू] +)/(पी \ d +)/$ ',' get_house ', name =' betterliving_get_house '),

जावास्क्रिप्ट की तरह में

:

Urls।betterliving_get_house ('घर', 12)

परिणाम:

/betterliving/घर/12/

1

आप URL से पैरामीटर हटा सकते हैं और के रूप में गतिशील भागों पारित क्वेरी पैरामीटर:

$('#add-choice-button').on('click', function() { 
    var thing_id = $(this).closest('.thing').attr('data-item-id'); 
    $.get('{% url 'addThing' %}?t='+thing_id, function (data) { 
     ... 
    }); 
    }); 
0

मैं Django जे एस नामक इस शांत Django एप्लिकेशन पाया है रिवर्स

https://github.com/ierror/django-js-reverse

यदि आप

url(r'^/betterliving/(?P<category_slug>[-\w]+)/(?P<entry_pk>\d+)/$', 'get_house', name='betterliving_get_house'), 

की तरह एक यूआरएल तो फिर तुम

Urls.betterliving_get_house('house', 12) 

परिणाम

/betterliving/house/12/ 
संबंधित मुद्दे