Python:创建字典列表,其中键没有引号?

时间:2019-09-03 13:53:37

标签: python django dictionary

我正在使用visjs插件在页面上创建时间轴。时间轴代码要求我在列表中为它提供多个字典,如下所示:

  var items = new vis.DataSet([
     {id: 1, content: 'item 1', start: '2013-04-20'},
     {id: 2, content: 'item 2', start: '2013-04-14'},
     {id: 3, content: 'item 3', start: '2013-04-16', end: '2013-04-19'},
  ]);

现在,我正在尝试通过使用for循环为我的索引视图创建类似的内容并将dict添加到列表中,然后将其放入上下文中并在模板中使用它。我的代码如下:

class ItemIndex(SingleTableMixin, FilterView):
    model = Item
    context_object_name = 'items'
    template_name = 'accounting/item/item_index.html'

    def get_context_data(self, **kwargs):
        items = Item.objects.all()
        context = super().get_context_data(**kwargs)

        dict_list = []

        for item in items:
            dict = {
                "id": item.pk,
                "content": Item (# {item.pk})',
                "start": str(item.start), #DateField
                "end": str(item.end), #DateField
            }
            dict_list.append(dict)
        context.update({
            "dict_list": dict_list,
        })
        return context

现在,我发现这不是最漂亮的解决方案,但是我什么都不知道(也许有人有更好的主意)。

在我的html中,我这样称呼dict_list

var items = new vis.DataSet(
                "{{dict_list}}"
            );

我的问题是我要返回的列表如下:

[{'id': 3, 'content': 'Item (# 3)', 'start': '2020-01-01', 'end': '2020-01-03'}, {'id': 4, 'content': 'Item (# 4)', 'start': '2020-01-01', 'end': 'None'}]

我的问题是按键周围的引号会“破坏”整个列表,因此我的时间轴无法正确显示。

是否存在一种好的解决方案,可以以某种方式创建不带键引号的dict?

我正在使用Python 3和Django 2.2。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这里有一个Python对象,使用{{ dict_list }}可获得该对象str(..) HTML转义版本。您可能最好使用JSON作为中间格式。因此,您首先要在上下文中对对象进行JSON编码:

context.update(
    dict_list=json.dumps(dict_list),
)

然后,您可以在模板端解析JSON。您应将dict_list变量标记为安全,以确保它不会HTML逸出:

var items = new vis.DataSet(
    JSON.parse('{{ dict_list|safe }}')
);