【问题标题】:How to combine a QuerySet and a Dictionary in Django Template?如何在 Django 模板中组合查询集和字典?
【发布时间】:2013-10-23 22:03:50
【问题描述】:

我有一个 Django 模型对象,看起来像这样:

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

我正在获取 myObj 的 querySet,如下所示:

mList = myObj.objects.all()

我还有一个用户字典,看起来像这样:

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

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

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

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

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

...因为 uDict.currObj.C 无法正确评估。

那么做我想做的最好的方法是什么?

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    不幸的是,你不能在 Django 中使用 for 循环变量作为字典的键。

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

    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 -->
    

    【讨论】:

    • 谢谢。问题是 A 和 B 本身就是 Django 模型,它们有自己的字段,我也在模板中使用这些字段。所以在模板中我做了这样的事情:{{currObj.A.F.G}} 如果我使用farmerjoe的解决方案,那么模板中不再可以访问那些二级和三级字段。对吗?
    • @user1742777 我没有你的代码,所以我无法测试它,但如果是这种情况,我会编辑其他我会尝试的东西。
    【解决方案2】:

    我认为最简单的方法是将uDict 值直接添加到您视图中的myObj 实例中。这会给你一个列表而不是上下文中的 qs,但这对你的模板没有任何影响。

    在你看来:

    mList = myObj.objects.all()
    for my_obj in mList:
        my_obj.user = uDict.get(my_obj.C)
    

    这会将用户值添加到内存实例中,因此您可以在模板中获取currObj.user

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2014-08-04
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      相关资源
      最近更新 更多