Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django模板中组合QuerySet和Dictionary?_Python_Django_Django Templates - Fatal编程技术网

Python 如何在Django模板中组合QuerySet和Dictionary?

Python 如何在Django模板中组合QuerySet和Dictionary?,python,django,django-templates,Python,Django,Django Templates,我有一个Django模型对象,如下所示: class myObj(models.Model): A = models.TextField() B = models.DateField() C = models.ForeignKey(User) mList = myObj.objects.all() uDict = {1: "Hello", 2: "World"} //The keys of this dictionary correspond to th

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

class myObj(models.Model):
    A = models.TextField()
    B = models.DateField()      
    C = models.ForeignKey(User)
mList = myObj.objects.all()
uDict = {1: "Hello", 2: "World"}  //The keys of this dictionary correspond to the field myObj.C
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
        }
    )
我正在获得一组MyOBJ,如下所示:

class myObj(models.Model):
    A = models.TextField()
    B = models.DateField()      
    C = models.ForeignKey(User)
mList = myObj.objects.all()
uDict = {1: "Hello", 2: "World"}  //The keys of this dictionary correspond to the field myObj.C
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
        }
    )
我还有一个用户字典,看起来像这样:

class myObj(models.Model):
    A = models.TextField()
    B = models.DateField()      
    C = models.ForeignKey(User)
mList = myObj.objects.all()
uDict = {1: "Hello", 2: "World"}  //The keys of this dictionary correspond to the field myObj.C
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
        }
    )
在我看来,我正在使用上下文将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无法正确计算


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

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

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

class myObj(models.Model):
    A = models.TextField()
    B = models.DateField()      
    C = models.ForeignKey(User)
mList = myObj.objects.all()
uDict = {1: "Hello", 2: "World"}  //The keys of this dictionary correspond to the field myObj.C
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

{u模板%的数据\u中的项的%
{{item.mListObj.A}{{item.mListObj.B}{{item.uDictObj}}
{{item.mListObj.C.F.G}
{%endfor%}
{{data_for_template.N.mListObj.C.F.G}

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

在你看来:

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

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

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