Javascript 中的模板标签

Posted

技术标签:

【中文标题】Javascript 中的模板标签【英文标题】:Template Tag in Javascript 【发布时间】:2015-08-25 00:28:46 【问题描述】:

我的 Django 模板标签在我的 javascript 中不起作用。我最新的错误是:SyntaxError: expected expression, got '&' var resourceTypes = ['Structural Model', 'X-Ray Diffraction']

我怎样才能让它工作?我需要将这些 Django 变量放入 js 中,以便创建图表(我使用的是 Google Charts)

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>

模板标签.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

【问题讨论】:

【参考方案1】:

你可以考虑使用赋值标签:

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 %
]);

这应该允许您在单个数据库查询中完成所有操作,而不必为每个数据库查询。您也可以通过查询集上每种类型的聚合计数来做到这一点。根据我们谈论的数据量,我不能确定哪一个会更快。

【讨论】:

越来越近了!谢谢@brandon 解决了这个问题,但现在% for x in resourceTypes % 不起作用 - 知道为什么那个循环不去吗? “不工作”是什么意思?有错误吗?循环没有迭代吗?请解释 没有错误 - 它根本没有迭代。我在 for 循环中添加了一个 console.log(x);,它甚至从不打印 哦,@brandon,刚刚看到你的最新编辑-我现在也试试 我为您添加了一个替代实现,但是在重新阅读您的问题时,我发现您正在传递 data_type 以获取计数。还有另一种方法可以做到这一点。请耐心等待,我会给你一个更新的实现。

以上是关于Javascript 中的模板标签的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 google.load 加载 javascript 文件,而不是直接使用 freemarker 模板语言中的标签?

从 odoo 模板的脚本标签中的 javascript dict 获取值

在 Javascript 中使用 DJango 模板标签添加 Google 地图标记

如何将带有 django 标签的 javascript 代码加载到我的 django 模板中

如何为 django 模板中的标签创建动态 id

如何使用VUE给模板标签中的属性赋值