确定django模板中的变量类型

Ed.*_*Ed. 12 django django-templates

我有一个变量,我正在拉入一个有时是日期的表,有时候是一个字符串.如果变量是日期,我想更改格式:

<td>{{ action.extra_column|date:"M d" }}</td>
Run Code Online (Sandbox Code Playgroud)

但如果它是一个字符串,我只想按原样显示:

<td>{{ action.extra_column }}</td>
Run Code Online (Sandbox Code Playgroud)

如果我尝试格式化它并且它是一个字符串,我得不到该变量的输出.

如何确定类型以便我可以根据类型调整渲染.

sup*_*cuo 27

您还可以将一般模板过滤器实现为type()内置的等效过滤器:

# app/templatetags/util.py
from django import template

register = template.Library()

@register.filter
def get_type(value):
    return type(value)

# template.html
{% load util %}
{% if extra_column|get_type == 'str' %}
    String
{% elif extra_column|get_type == 'datetime.date' %}
    Date
{% else %}
    Oh no!
{% endif %}
Run Code Online (Sandbox Code Playgroud)

不过,我认为Ignacio和Dirk是对的.难道你不能只有两个键(你说"数组",但我认为你的意思是"字典",因为项目有名称)被称为datedetail

# views.py
...
actions = [{
    'some_property': 'some_value'
    'date': None,
    'detail': 'details'
},
{
    'some_property': 'some_value'
    'date': datetime.date.today(),
    'detail': None
}]
...

# template.html
{% for action in actions %}
<td>{% if action.date %}{{ action.date|date:"M d" }}{% endif %}{{ action.detail }}</td>
{% endfor %}

# output
<td>details</td>
<td>Aug 19</td>
Run Code Online (Sandbox Code Playgroud)

  • 我知道建议'getattribute`过滤器会很快回来咬我...我想在同一个模板中尝试使用两者都是**GIANT RED FLAG**你试图在模板中加入过多的逻辑层.只是我的'$ .02` (2认同)
  • 感谢您的回答。尽管如此,我将返回值更改为`type(value).__name__`,否则`get_type`返回`"&lt;class 'float'&gt;"`对于float而不是`"float"`,因此比较`{% if number|get_type == 'float' %}` 总是会触发 else-part... (2认同)

Dir*_*ler 4

就像 Ignacio Vazquez-Abrams 在第一条评论中指出的那样,这并不是编写逻辑的好方法。我会确保你的变量具有某种类型。这可以通过添加到上下文的附加变量或保存数据和描述数据类型的对象来解决。

如果您想坚持自己的逻辑,一种可能的方法是编写自己的模板过滤器(我们称之为date_or_string)。过滤器可以子类化内置date过滤器,格式参数是可选的。如果传递了参数,它的工作方式就像普通date过滤器一样,如果没有参数,它只会返回字符串。在更复杂的场景中,过滤器还可以进行一些类型检查。只是一个想法,我实际上不会将这种逻辑放入模板中。