использовать json данные в django шаблоне - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть модель, у которой есть один класс, который состоит из множества других, использующих OneToOneField. Моя конечная цель состоит в том, чтобы иметь возможность абстрактно (* без использования имен полей) l oop просматривать структуру данных и выводить содержимое в мой шаблон с помощью тегов шаблона. Я хотел бы предоставить свой шаблон с вложенными данными в формате json и парсингом json, используя теги шаблона непосредственно в моем шаблоне. Я кое-что использовал Django. Ниже приведен общий пример c моей кодовой базы:


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 и как я могу выполнить sh это? Я чувствую, что все должно быть просто, чего мне не хватает?

Спасибо.

1 Ответ

0 голосов
/ 20 апреля 2020

Django шаблон может анализировать 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

И в шаблоне:

{% for d in data %}
    {{ d.field1}}
    {{ d.class_1.class_1_field_1}}
{% endfor %}
...