首页 > 解决方案 > 从模板中的 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

标签: javascriptpythonjsondjango

解决方案


您的 javascript 未解析 JSON 字符串。

let schedule = JSON.parse("{{ barber.schedule.schedule_day | safe }}")

但是,这也不起作用,因为schedule_day它不是有效的 JSON 字符串,它只是__str__()您字段中对象的字符串表示 ( )。

字段是对象而不是数据库中的字符串的原因是,该JSONField类型会自动反序列化该数据库字符串与对象之间的序列。通常这很方便,因为您想在视图中迭代 JSON 中的对象,但是,在这种情况下,您只需要将字符串发送到前端。

最简单的解决方案是将 更改JSONFieldTextField. 但是,如果您依赖其他地方的自动反序列化,那么您必须在对象到达模板之前将它们重新序列化为视图中的字符串,然后使用 Javascript 将 JSON 字符串解析为对象。


推荐阅读