2016-07-07 90 views
1

經過數月的網絡開發之後,我發現自己完全無奈,試圖找到一個很好的解決方案,以便按照我的意願對整個DOM中的所有數字進行格式化。具體來說,我有一個js函數my_int_formatter(),我想在文檔加載後應用於所有整數。舉例最佳descriped - 我要像做在整個文檔中格式化整數千位分隔符

<td>my_int_formatter({{django_variable}})</td> 

我知道上面的代碼將無法正常工作,因爲我必須包括「腳本」的標籤,但首先,我不喜歡的亂碼,第二,JavaScript會將其識別Python變量

我嘗試以下方法:

HTML

<td class = 'my_integer'>{{django_variable}}</td> 

JS

$(document).ready(function(){ 
    // .... 
    content = $('.my_integer').html(); 
    $('.my_integer').html(my_int_formatter(content)); 

......但正如所料,我得到了錯誤的結果,因爲js代碼將DOM鏈中第一個.my_integer元素的相同html()內容應用於所有其他元素。任何想法如何做到這一點簡短而正確的方式?

回答

1

如果我理解正確的話,你要使用內置django.contrib.humanize應用:https://docs.djangoproject.com/en/1.9/ref/contrib/humanize/

你可以使用一些預定義的過濾器格式化整數,例如intcomma:你的情況

4500 becomes 4,500. 
45000 becomes 45,000. 
450000 becomes 450,000. 
4500000 becomes 4,500,000. 

用法會像

{% load humanize %} 
<td>{{django_variable|intcomma}}</td> 

此外不要忘記包括應用程序INSTALLED_APPS

此外,如果你想將過濾器應用於某種類型的所有變量this問題可能是有用的

,我建議你在渲染之前使用Middleware來撥弄響應。

+0

太棒了!我再次低估Django並尋找解決方案客戶端,這就是爲什麼你提到的問題逃脫我的通知)) –

+0

有什麼辦法可以告訴Django將這種格式應用於所有整數,除非另有明確規定? –

+1

@Edgar Navasardyan我建議使用中間件。查看文檔鏈接回覆更新 – valignatev

2

如果我理解正確,你的問題不是格式化,而是將格式應用到你的每個dom元素。

嘗試使用jquerys .each()函數並使用$(this).html()來實際獲取內容。

$('.my_integer').each(function(){ 
    content = $(this).html(); 
    $(this).html(content+"formatted"); 
}); 

這裏有一個快速的小提琴:

https://jsfiddle.net/57rdq2a0/2/

+0

Starbug,我已經將valentjedi的答案打勾爲解決方案,因爲使用他的方法,您不必遍歷整個DOM。我想知道,如果你有大型網站 –

+1

是的,我注意到他的回覆之後,這樣循環有多昂貴。操縱服務器端更好(我已經nerer真的觸及Django所以不能幫助)。 jquery的each()可能在大型網站上很沉重,這就是爲什麼在JS中搜索fo ID而不是JS的類更好。祝你好運^^ – StarbugStone

+0

明白了,謝謝) –