在Django模板中使用json数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Django模板中使用json数据相关的知识,希望对你有一定的参考价值。

我有一个模型,该模型具有一个使用OneToOneField由多个其他类组成的类。 我的最终目标是能够以抽象的方式遍历数据结构(不使用字段名),并使用模板标签将内容输出到模板。我想为我的模板提供json中的嵌套数据直接在模板中使用模板标签格式化和解析json。我已经利用了Django rest框架。以下是我的代码库的一般示例:


models.py--------------------------------------

from django.db import models
from rest_framework import serializers


class Class1(models.Model):
    class_1_field_1 = models.CharField()
    class_1_field_2 = models.CharField()


class Class2(models.Model):
    class_2_field_1 = models.CharField()
    class_2_field_2 = models.CharField()


class MainClass(models.Model):
    field_1 = models.CharField()
    field_2 = models.IntegerField()
    field_3 = models.DateTimeField()

    class_1 = models.OneToOneField(Class1, on_delete=models.CASCADE,)
    class_2 = models.OneToOneField(Class2, on_delete=models.CASCADE,)


class Class1Serializer(serializers.ModelSerializer):
    class Meta:
        model = Class1
        fields = ('class_1_field_1', 'class_1_field_2')


class Class2Serializer(serializers.ModelSerializer):
    class Meta:
        model = Class2
        fields = ('class_2_field_1', 'class_2_field_2')


class MainClassSerializer(serializers.ModelSerializer):
    class_1= Class1Serializer()
    class_2= Class2Serializer()

    class Meta:
        model = MainClass
        fields = ('field1', 'field2', 'field3', 'class_1', 'class_2')


views.py-------------------------------------

from django.views.generic import ListView
from rest_framework.renderers import JSONRenderer
from MyApp.models import MainClass, MainClassSerializer


MainClassListView(ListView):
    context_object_name = 'mainclasses'
    model = MainClass
    serializer_class = MainClassSerializer

    def get_queryset(self):
        object_list = MainClass.objects.filter(user__in=[self.request.user])
        return object_list

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        serializer = MainClassSerializer(MainClass.objects.filter(user__in=[self.request.user]), many=True)
        context['data'] = JSONRenderer().render(serializer.data)
        return context

    def dispatch(self, request, *args, **kwargs):
        return super(MainClassListView, self).dispatch(request, *args, **kwargs)


index.html----------------------------------------------------

...

{{data}}

...

json output-------------------------------------------------------

b'[{
   "field_1": "Some String",
   "field_2": 100,
   "field_3": "2020-04-20T02:34:27.912451Z",
   "class_1": {
      "class_1_field_1": "str_1",
      "class_1_field_2": "str_2"
   },
   "class_2": {
      "class_2_field_1": "str_3",
      "class_2_field_2": "str_4"
   }
}]'

{{data}}标签显示具有以下格式的字符串(请参见上文):b'[valid_json_is_displayed_here]',其中valid_json_is_displayed_here是格式正确的json结构,其中包括来自OneToOneField关系的嵌套数据。

我想直接在我的模板中解析包含一对一关系数据的模板标签中返回的json输出中的各个值。在Django中这可能吗,我该怎么做?我觉得应该很简单,我想念的是什么?

谢谢。

答案

[Django template can parse dict,带点符号。

因此,如果将dict添加到dict,它将使解析非常容易。

context

在模板中:

import json

def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        serializer = MainClassSerializer(MainClass.objects.filter(user__in=[self.request.user]), many=True)
        context['data'] = json.loads(JSONRenderer().render(serializer.data))
        return context

但是除了这样做,您可以简单地将{% for d in data %} {{ d.field1}} {{ d.class_1.class_1_field_1}} {% endfor %} 实例传递到模板中,并访问模板中的MainClass之类的字段。

mainClassInstance.class_1.class_1_field1

在模板中:

def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['data'] = MainClass.objects.filter(user__in=[self.request.user])
        return context

以上是关于在Django模板中使用json数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django 模板作为片段

如何在 Django 中显式重置模板片段缓存?

如何在扩展另一个文件的 django 模板中使用带有动态内容的 html 块片段?

在 Django 模板中的 JSON 中安全地使用带有 html 的 JSON

在 django 模板中显示 json 数据

如何解析和渲染 json 以在 Django 模板中使用