繁体   English   中英

不同视图的Django Queryset相同模板

[英]Django Queryset same template for different views

我在 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”。 谢谢

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

首先,您使用.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})

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM