【问题标题】:How to return return multiple objects using get_context_data如何使用 get_context_data 返回多个对象
【发布时间】:2020-11-23 02:35:13
【问题描述】:

该应用程序旨在为单个用户提供服务。 我试图在 get_context_data 方法中填充多个模型类对象。我的问题是当我在模板中调用上下文变量时,我得到的只是查询集。如果我调用查询集中的特定项目,我看到的只是内存中的一个位置。如果我在模板内的 for 循环中调用上下文变量“数据”,我什么也得不到。根据 django 文档,这个逻辑应该有效。我错过了什么步骤?还是使用基于函数的视图会更好地为我服务?

我的模特

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

【问题讨论】:

  • 您如何在模板中使用data

标签: django list django-views django-templates


【解决方案1】:

我的问题是,当我在模板中调用上下文变量时,我得到的只是查询集。

这是因为,在您的上下文数据(特别是 ['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]]

附:根据this thread,您可以将查询集转换为列表

【讨论】:

  • zip 有缺点在这种特殊情况下。如果查询集的长度不同怎么办?
  • 我记得有一个工具 itertools.zip_longest 当长度不同时:它用 None 代替较短的值。这里是docs
猜你喜欢
  • 1970-01-01
  • 2020-01-13
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2013-06-03
相关资源
最近更新 更多