2

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

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

我正在获得一个 myObjs 的 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 不会正确评估。

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

4

2 回答 2

1

不幸的是,您不能将 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文件中的数据做大部分准备工作,以简化模板中的可访问性。

编辑:

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

视图.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 -->
于 2013-10-23T22:14:33.403 回答
0

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

在您看来:

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

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

于 2013-10-23T23:02:25.053 回答