【问题标题】:Django loop and accessing the objects and dictionary items in templateDjango循环并访问模板中的对象和字典项
【发布时间】:2017-08-14 11:10:15
【问题描述】:

所以我在使用 django 模板时遇到了这个问题,我认为该解决方案可能对其他人有用:
在这里,我将假设一个非常复杂的情况,因此它也可以用于更简单的情况:
假设我们需要访问模板中的文章列表及其 id 和标题。此外,我们希望使用字典传递关于每篇文章(如出版商)的一些额外数据,因为它们不在类属性中。更难的是,当您想要两个接一个地访问这篇文章时。意味着一个 for 循环在 0 范围内迭代到最后一项的索引,并且能够同时访问项目编号 i 和 i+1。
这特别困难,因为你可能知道如果你想在 django 模板中使用字典,你不能这样做:

{{ publishers[article.id] }}

因为模板不支持 []。没什么大不了的,您可以将字段视为属性,例如

{{ publishers.0 }}

但是 django 模板不会让你这样做

{{ publishers.article.id }}

更不用说使用 for 循环和通过列表和索引访问文章了:

{{ publishers.articles.i.id }}

那我们怎么办???

【问题讨论】:

    标签: python django templates dictionary for-loop


    【解决方案1】:

    所以这就是答案。 这有点过于复杂,但我想涵盖所有可能性。
    首先,我们需要能够通过定义我们自己的过滤器来访问字典的对象,例如 this:

    from django import template
    register = template.Library()
    
    def hash_dict(h, key):  
       return h[key]
    
    def get_attr(item,field):
       dict_obj = item.__dict__
          return dict_obj[field]
    
    register.filter('hash_dict',hash_dict)
    register.filter('get_attr',get_attr)
    

    稍后我们将介绍 get_attr 方法,但现在,我们可以访问模板中的字典对象:

    {% load modulename %}
    {{ dictionary|hash_dict:obj.id }}
    

    要使用带计数器的 for 循环,您可以将范围对象或列表传递给模板。

    range_of_article = range(0, len(articles_list), 2)
    

    并以某种方式将该变量传递给模板。
    在您的模板中:

    {% for i in range_of_article %}
       {% with article=articles|hash_dict:i %}
          {% with article_id=article|get_attr:'id' %}
             {{ publishe|hash_dict:article_id }}
    

    这就是 get_attr 方法派上用场的地方。我本可以在这里毫无问题地使用 article.id,但有时情况并非如此。当您无法使用 object.attribute 访问对象的属性时,我发现此解决方法非常有用。
    最后可以同时访问 i 和 i+1:

    {% for i in range_of_article %}
       {% with j=i|add:1 %}
          {% with article=articles|hash_dict:i article2=articles|hash_dict:j %}
             {% with article_id=article|get_attr:'id'  article_id2=article2|get_attr:'id'%}
                {{ publishe|hash_dict:article_id }}
                {{ publishe|hash_dict:article_id2 }} 
    

    【讨论】:

    • 这实在是太复杂了。您可以使用简单的for 遍历列表,对于字典,您可以遍历.items 以提供键和值。而且您无论如何都不需要在 dict 中传递单独的值;您可以直接在对象上注释它们。
    • 我知道它过于复杂。在我的具体情况下,事实是我无法迭代项目或注释值。关键是假设最复杂的场景来涵盖我在这个过程中学到的几乎所有东西。我虽然这可能会帮助我这个职位的人。对于大多数目的,但是做你提到的就足够了。
    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2021-10-17
    • 2021-04-10
    • 2018-09-22
    • 2014-02-08
    相关资源
    最近更新 更多