Skip to main content
 首页 » 编程设计

python之如何在 Django 模板中组合查询集和字典

2025年05月04日2498°冷暖

我有一个 Django 模型对象,如下所示:

class myObj(models.Model): 
    A = models.TextField() 
    B = models.DateField()       
    C = models.ForeignKey(User) 

我正在获取 myObjs 的查询集,如下所示:

mList = myObj.objects.all() 

我还有一个用户字典,如下所示:

uDict = {1: "Hello", 2: "World"}  //The keys of this dictionary correspond to the field myObj.C 

在我看来,我正在使用上下文将 mList 和 uList 发送到我的 HTML 模板。

在我的模板中,我想在不同的行中列出所有的 mList。那些在 uDict 中具有匹配用户条目的 mLists 应该与 uList 中的匹配值一起出现。

我应该怎么做?在模板中,我可以轻松地遍历 mList。但我不知道如何将 myObj.C 与 uDict 键匹配。我知道这行不通:

{% for currObj in mList %} 
    {{currObj.A}} {{currObj.B}} {{uDict.currObj.C}} 
{% endfor %}  

...因为 uDict.currObj.C 不会正确计算。

那么做我想做的事情的最佳方法是什么?

请您参考如下方法:

不幸的是,您不能将 for 循环变量用作 Django 中字典的键。

您可以做的是将它们全部打包到某个列表或其他数据集中。像这样:

mList = myObj.objects.all() 
uDict = {1: "Hello", 2: "World"} 
 
data_for_template = [] 
for i in range(len(mList)): 
    data_for_template.append( 
        { 
            'mListObjA':mList.A, 
            'mListObjB':mList.B, 
            'uDictObj':uDict[i], # or i+1 for your example uDict 
        } 
    ) 

然后在您的模板中,您将能够以类似的方式访问这些数据。

{% for item in data_for_template %} 
    {{item.mListObjA}} {{item.mListObjB}} {{item.uDictObj}} 
{% endfor %} 

基本上,您应该尝试在 views.py 文件中为您的数据做大部分准备工作,以简化模板中的可访问性。

编辑:

根据您的评论,我接下来会尝试的事情:

views.py:

mList = myObj.objects.all() 
uDict = {1: "Hello", 2: "World"} 
 
data_for_template = [] 
for i in range(len(mList)): 
    data_for_template.append( 
        { 
            'mListObj':mList, 
            'uDictObj':uDict[i], # or i+1 for your example uDict 
        } 
    ) 

html

{% for item in data_for_template %} 
    {{item.mListObj.A}} {{item.mListObj.B}} {{item.uDictObj}} 
    {{item.mListObj.C.F.G}} 
{% endfor %} 
 
{{data_for_template.N.mListObj.C.F.G}} <!-- Where N is the index of whatever Object you wish to access -->