在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 模板中使用带有动态内容的 html 块片段?