Django Queryset 不同视图的相同模板

Posted

技术标签:

【中文标题】Django Queryset 不同视图的相同模板【英文标题】:Django Queryset same template for different views 【发布时间】:2020-07-06 09:28:18 【问题描述】:

我在view.py中有两个视图函数

def function1(request):
   qset = Table1.objects.values(
    'Field1__code',
    'Field2__descr',
    'Field3__nr',   
    ...
    )

return render(request, 'template.html', 'qset':qset)


def function2(request):
   qset = Table2.objects.values(
    'Field4__abc',
    'Field5__def',
    'Field6__fgh',  
    ...
    )

return render(request, 'template.html', 'qset':qset)

我想对两个视图使用相同的 template.html。 如何从内容 'qset':qset 中的两个函数发送到模板相同的键名,如“x1”、“x2”、“x3”(或 qset.x1、qset.x2、qset.x3)而不是发送两组不同的密钥? template.html 包含键“x1”、“x2”、“x3”。 谢谢

【问题讨论】:

【参考方案1】:

我可以快速想到三个选项。

首先,您使用.values_list 并使用位置索引而不是键。所以在你的问题中你要求qset.x1, ...。你会改用qset.0, qset.1。但是,这很难维护。

其次,您可以注释查询集以定义字段:

Table2.objects.annotate(
    x1=F('Field4__abc'),
    x2=F('Field5__def'),
    ...
).values('x1', 'x2', ...)

第三,您可以创建一个虚拟视图模型来将模型实例转换为它。

class ViewModel:
    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

def function2(request):
    table2s = Table2.objects.all()
    data = [
        ViewModel(x1=obj.Field4.abc, x2=Field5.def, ...)
        for obj in table2s
    ]
    return render(request, 'template.html', 'data':data)

字段的数量和逻辑的复杂性将决定哪个最适合您。

【讨论】:

以上是关于Django Queryset 不同视图的相同模板的主要内容,如果未能解决你的问题,请参考以下文章

在 django 模板中索引 QuerySet 数组

Django通过不同的相关对象注释QuerySet中的几个相同对象

Django - 相同的 html,不同的视图

如何使用相同的值但使用现有字段之一的不同数据类型来注释 Django Queryset?

如何使用 Django QuerySet 生成总和并在模板中显示?

Django:如何将相同的功能扩展到多个视图?