0

我的Django模板標籤在我的javascript中不起作用。我最近的錯誤是:SyntaxError: expected expression, got '&' var resourceTypes = ['Structural Model', 'X-Ray Diffraction']Javascript中的模板標籤

我該如何得到這個工作?我需要得到這些變量的Django在js中,這樣我可以創建一個圖表(我使用谷歌圖表)

的index.html

<script> 
    function drawChart() { 

    // Create the data table. 
    var data = new google.visualization.DataTable(); 
    data.addColumn('string'); 
    data.addColumn('number'); 

    var resourceTypes = {{ "all"|resource_types }} 

    {% for x in resourceTypes %} 
     data.addRows([ 
      [x, {{ x|resourceType_count }}], 
     ]); 
    {% endfor %} 

    // Set chart options 
    var options = {'title':'Datasets by Type', 
        'width':400, 
        'height':300}; 

    // Instantiate and draw our chart, passing in some options. 
    var chart = new google.visualization.PieChart(document.getElementById('chart_div')); 
    chart.draw(data, options); 
    } 

</script> 

templatetags.py

@register.filter(name='resource_types') 
def resource_types(data_type): 
    resourceTypes = [ str(x.data_type) for x in ResourceType.objects.all() ] 
    return resourceTypes 

@register.filter(name='resourceType_count') 
def resourceType_count(data_type): 
    count = Dataset.objects.filter(data_type=ResourceType.objects.get(data_type=data_type)).count() 
    return count 

回答

0

你可以考慮使用賦值標籤:

from collections import Counter 

@register.assignment_tag(takes_context=True) 
def get_resource_types(context): 
    values = dict(Counter(list(map(str, ResourceType.objects.values_list('data_type', flat=True))))) 
    return {'resource_types': values} 

這會給你每data_type〜應變的計數克值列表,如:

{'data type 1': 3, 'data type 2': 10, 'data type 3': 47} 

然後你就可以傳遞給.addRows()功能:

{% get_resource_types as resource_types %} 

data.addRows([ 
    {% for data_type, count in resource_types.items %} 
    ['{{ data_type }}', {{ count }}], 
    {% endfor %} 
]); 

這應該讓你做的一切在一個單一的數據庫查詢與具有查詢每一個。您也可以通過查詢集上的每種類型的聚合計數來完成此操作。根據我們談論的數據量,我不能確定哪一個會更快。

+0

靠得更近!謝謝@brandon解決了這個問題,但現在'{%for x in resourceTypes%}'不工作 - 任何想法爲什麼這個循環沒有去? – plact

+0

你是什麼意思「不工作」?有錯誤嗎?循環是不是迭代?請解釋 – Brandon

+0

沒有錯誤 - 它根本沒有迭代。我在for循環中添加了一個'console.log(x);',它甚至從不打印 – plact