【问题标题】:How can I distinguish lists from strings in django templates如何区分 Django 模板中的列表和字符串
【发布时间】:2011-04-29 10:39:58
【问题描述】:

我正在使用 Django 模板在 Google AppEngine 上开发一个项目,因此我必须使用 {{ aitem.Author }} 之类的标签来打印我的 HTML 模板中的内容。

然而,

Author 既可以是string 也可以是list 对象,我无法提前告诉它。当作者是一个列表并且我尝试在我的模板上打印它时,我得到了

的丑陋结果

作者:[u'J. K. Rowling', u'Mary GrandPr\xe9']

有什么方法可以有效地处理这种情况(基本上根据其类型打印不同的字段)?我必须依赖自定义标签或任何其他方式吗?

【问题讨论】:

    标签: python django google-app-engine django-templates


    【解决方案1】:

    我听从了 Matthew 的建议,最终实现了一个过滤器来处理列表。 我把它贴在这里以防其他人需要它。

    @register.filter(name='fixlist')
    def fixlist(author):
        if type(author) == list:
            return ', '.join(author)
        else:
            return author
    

    我从这样的模板页面调用它{{ aitem.Author|fixlist }}

    感谢您的帮助!

    【讨论】:

    • if isinstance(author, list):可能比较时髦
    【解决方案2】:

    我认为 Aidas 的 get_authors() 解决方案是最好的,但另一种方法可能是创建一个模板标签来进行测试。你会想阅读custom template tags,但如果你看看现有的,它们并不难创建。

    【讨论】:

      【解决方案3】:

      我认为最干净的解决方案是向模型get_authors() 添加一个方法,该方法总是返回一个或多个作者的列表。然后你可以使用:

      Author: {{ aitem.get_authors|join:", " }}
      

      如果您出于某种原因只能访问模板而无法更改模型,那么您可以使用这样的 hack:

      {% if "[" == aitem.Author|pprint|slice:":1" %}
          Author: {{ aitem.Author|join:", " }}
      {% else %}
          Author: {{ aitem.Author }}
      {% endif %}
      

      附:对属性名称使用大写字母不是一个好的约定。

      【讨论】:

      • 你是对的,但不幸的是我无法为此修改模型:我正在使用一个库并且不能轻易改变那个东西。这也解释了命名不当的属性。
      • 而不是pprint,检查特定类型的方法不是更好吗?例如。 if author.islower 仅在 string 时才评估 true。
      • 好主意。我还没想过。
      猜你喜欢
      • 2016-01-29
      • 2013-06-22
      • 2017-06-15
      • 2021-04-16
      • 2018-10-08
      • 1970-01-01
      • 2013-04-08
      • 2011-12-23
      • 2013-07-16
      相关资源
      最近更新 更多