Как вернуть возврат нескольких объектов с помощью get_context_data - PullRequest
1 голос
/ 03 августа 2020

Приложение предназначено для обслуживания одного пользователя. Я пытаюсь заполнить несколько объектов классов модели внутри метода get_context_data. Моя проблема в том, что когда я go вызываю контекстную переменную в моем шаблоне, все, что я получаю, - это набор запросов. Если я вызываю конкретный элемент c в наборе запросов, все, что я вижу, - это место в памяти. Если я вызываю переменные контекста «данные» в for l oop внутри шаблона, я вообще ничего не получаю. Согласно документам django, этот logi c должен работать. Какой шаг мне не хватает? Или мне лучше использовать представление на основе функций?

моя модель

class backend(models.Model):
    lang1 = models.CharField(max_length=50)
    lang2 = models.CharField(max_length=50)
    lang3 = models.CharField(max_length=50)
    

    def __str__(self):
        return 'Backend Language'

class frontend(models.Model):
    lang1 = models.CharField( max_length=50)
    lang2 = models.CharField(max_length=50)
    lang3 = models.CharField(max_length=50)
    
    def __str__(self):
        return 'Frontend Language'
    
class datalayer(models.Model):
    lang1 = models.CharField( max_length=50)
    lang2 = models.CharField(max_length=50)
    lang3 = models.CharField(max_length=50)

    def __str__(self):
        return 'Database Language'

мое представление


from django.shortcuts import render
from django.views.generic import View, TemplateView, ListView
from cbvapp.models import backend, frontend, datalayer

class Index(ListView):
    template_name = 'index.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['data'] = [backend.objects.all(),
                            datalayer.objects.all(),
                            frontend.objects.all()]
        return context

1 Ответ

0 голосов
/ 03 августа 2020

Моя проблема в том, что когда я go вызываю контекстную переменную в моем шаблоне, все, что я получаю, - это набор запросов.

Это потому, что в ваших данных контекста (в частности, ['data']), все объекты представляют собой набор запросов, как вы использовали .objects.all(). Я знаю два решения, которые могут сработать: одно - вернуть их по отдельности, если они не связаны, а другое - использовать функцию zip.

Возвращать данные отдельно

Наивно, но работает, если ваши данные просты, что означает, что они не имеют отношения друг к другу.

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['backend'] = backend.objects.all()
    context['datalayer'] = datalayer.objects.all()
    context['frontend'] = frontend.objects.all()
    return context

Объединить данные вместе

Используйте это, если вы хотите, чтобы ваш контекст отображался вместе.

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)

    back = list(backend.objects.all())
    datal = list(datalayer.objects.all())
    front = list(frontend.objects.all())
    context['data'] = zip(back, data1, front)    # pairs data up, returns 2D array

    return context

Итак, допустим, у вас есть эти

back = [a, b, c]
datal = [d, e, f]
front = [g, h, i]

Когда вы соедините их вместе, вы получите

zipped = [[a, d, g], [b, e, h], [c, f, i]]

PS в соответствии с этот поток , вы можете преобразовывать наборы запросов в список

...