javascript - 从模板中的 django 模型循环 JSON
问题描述
我不知道如何在模板中使用 javascripit 循环遍历 JSON 对象(我知道如何在 HTML 部分中执行此操作,但我需要它在 javascript 中)。我发现如果我在这样的变量中保护我的 JSON 对象:
<script>
let schedule = "{{ barber.schedule.schedule_day | safe}}"
</script>
它被保存为字符串类型,我无法使用它,schedule[0]
显示第一个字符, [
我不能 JSON.parse 它,因为错误出现“在位置 2 的 JSON 中出现意外令牌”我猜这是因为我的日程安排有单引号双重的
这就是我的日程安排在我控制台时的样子。记录它
[{'start': 8, 'end': 10}, {'start': 12, 'end': 14}, {'start': 15, 'end': 16}]
这就是来自模型的 JSON 的样子
{
"schedule_day": [
{
"start": 8,
"end": 10
},
{
"start": 12,
"end": 14
},
{
"start": 15,
"end": 16
}
]
}
视图.py
class Barber_schedule(DetailView):
model = Barber
context_object_name = 'barber'
模型.py
schedule_template = '''
{
"schedule_day": [
{
"start": 8,
"end": 16
}
]
}
'''
class Barber(models.Model):
name = models.CharField(max_length=30)
start_time = models.IntegerField(default=8, validators=[MaxValueValidator(16), MinValueValidator(0)])
JSON_schedule_template = json.loads(schedule_template)
schedule = models.JSONField(default=JSON_schedule_template)
photo = models.ImageField(upload_to='barber_avatar', default='default.png')
def __str__(self):
return self.name
解决方案
您的 javascript 未解析 JSON 字符串。
let schedule = JSON.parse("{{ barber.schedule.schedule_day | safe }}")
但是,这也不起作用,因为schedule_day
它不是有效的 JSON 字符串,它只是__str__()
您字段中对象的字符串表示 ( )。
字段是对象而不是数据库中的字符串的原因是,该JSONField
类型会自动反序列化该数据库字符串与对象之间的序列。通常这很方便,因为您想在视图中迭代 JSON 中的对象,但是,在这种情况下,您只需要将字符串发送到前端。
最简单的解决方案是将 更改JSONField
为TextField
. 但是,如果您依赖其他地方的自动反序列化,那么您必须在对象到达模板之前将它们重新序列化为视图中的字符串,然后使用 Javascript 将 JSON 字符串解析为对象。
推荐阅读
- java - java vlcj播放扩展wav文件时卡顿
- c - 使用 XLib 创建一个不可调整大小的窗口
- java - 如何在android中自定义单选按钮
- reactjs - 如何解决 Jest 遇到的意外令牌
- ansible - Ansible:如何过滤 dict2items 并仅为匹配的值运行 playbook
- java - 测试扩展抽象类和接口的 Spring Service 类
- python - 比较两个 Python 字典:CS50 PSET6 DNA
- docker-swarm - Docker Swarm Secrets + Portainer
- r - 将带有自己数据框的 geom_bar 添加到现有的 ggplot2
- java - Wildfly 数据源通过 VPN 到 MS SQL Server