我正在使用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。
感谢您的帮助!
答案 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 }}')
);