2009-11-25 60 views
22

在我的項目中,我有很多Ajax方法,帶有外部客戶端腳本(我不想將JavaScript包含到模板中!),並且更改URL對我來說是一種痛苦,因爲我需要手動更改我的Ajax調用中的URL。Django reverse()for JavaScript

是否有某種方法可以模仿{% url %} templatetag在JavaScript中的行爲?

例如,打印urlpatterns以^ajax開頭,後來在腳本中用它們的實際值替換模式?

這就是我的想法,我的問題是 - 是否有任何常見做法來做這樣的事情?也許一些可重用的應用程序?另外,我會很樂意閱讀您的任何建議和相關想法。

更新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是一個小工具庫,旨在提供的JavaScript/Django開發的幾個實用工具,這將有助於開發RIA在Django的後端之上。

它目前支持以下功能:

  • 產生的Django的URL反向方法...
+0

也檢查出一些叉子。 Dimitri-Gnidash使用管理命令構建URL。 ljosa創建了一個視圖,在飛行中建立它們。 – SystemParadox 2012-02-08 15:33:55

+0

看來這個解決方案仍然需要硬編碼{url_name:pattern}字典。自動生成在dutils.conf.urls.example.js中找到的列表會很好。 – Fydo 2013-09-05 13:57:31

+0

@Fydo使用它https://github.com/ierror/django-js-reverse – 2017-05-12 15:19:49

4

我通常做的就是把網址在任何一個<input type="hidden" />元素,或在rel=""屬性。

然後,寫JS時(使用下面jQuery)我做的:

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

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

非標準屬性是由所有主要的瀏覽器和隱藏要素很好的支持並不一定要在形式。

+0

你將與計算的URL做什麼? url(r'^ ajax/delete /(?P image | audio)/(?P \ d +)/ from/set /(?P \ d +)/ $','blog.ajax.remove_item_from_set') , – dir01 2009-11-25 10:14:25

+0

你把它們放在頁面上的某個地方(在Django模板中) - javascript是一個單獨的文件,不是由django生成的。 – 2009-11-25 13:21:59

14

將JavaScript放入模板會出現什麼問題?

您經常想要在HTML模板中調用初始化函數,那麼爲什麼不傳遞一個包含您將使用的URL的對象?

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

如果你發現自己路過很多變量的這種方式,或者想在你的JavaScript您在HTML模板做使用的邏輯,那麼爲什麼不通過Django的模板引擎渲染你的腳本?請記住,Django模板不僅適用於HTML文檔 - 通常它有助於使用純文本,XML,JSON以及甚至是JavaScript的模板。擔心表現?然後緩存結果。

+0

這是我的任務的縮寫,所以面對它)JS文件將通過CDN傳遞。我可以做的是把urlpatterns放在我的頁面頂部(設置js變量),並用真正的數據從正則表達式編譯真實的URL – dir01 2009-11-25 10:20:33

+3

這種方法的缺點是沒有辦法使用視圖參數。 – intgr 2012-05-09 09:31:13

+0

通過設計,混合語言是一個壞主意。 – azmeuk 2016-06-21 11:02:29

16

嘗試生成URL字符串創建JavaScript的輔助函數(Django的模板)。在簡單的形式,他們可能看起來像這樣:

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

也許這有一些其他的影響,但我認爲它應該工作。

+0

你救我一命,謝謝!只是一個觀察,我想最好在佔位符中使用id = 0,因爲你永遠不會有一個等於0,我們不能說112233相同,但在另一個可以有所有0的字符串改變,也許我們應該有一個模板來改變正確的位置。 – 2013-10-03 22:10:38

+0

我很高興你喜歡我的解決方案。關於id,更重要的是你要替換的值不在url字符串中的其他地方。所以它不會真的計量它是0或112233,只要相同的值不在URL字符串中的其他地方。 – kodmasin 2013-12-07 21:45:18

2

首先,您應該爲您的網址:

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 %}'); 
}); 
</script> 
// js/my-module.js 
var MyModule = { 
    init: function(url) { 
     console.log(url); 
    } 
}; 

你可以在你的URL中使用的令牌:

<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+)。

我對這個解決方案有點不滿意,最後我寫了自己的應用程序來處理javascript與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:??

URL(R'^/betterliving /(P [ - \ W] +)/(P \ d + )/ $」, 'get_house',名稱= 'betterliving_get_house'),

以JavaScript等

網址。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 JS反向

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/