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?