【问题标题】:Django Queryset same template for different viewsDjango Queryset 不同视图的相同模板
【发布时间】: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”。 谢谢

【问题讨论】:

    标签: python django django-templates django-queryset


    【解决方案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})
    

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

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 2021-11-07
      • 2012-07-26
      • 2014-04-05
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多