确定django模板中的变量类型

时间:2012-08-18 23:47:05

标签: django django-templates

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

<td>{{ action.extra_column|date:"M d" }}</td>

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

<td>{{ action.extra_column }}</td>

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

如何确定类型,以便根据类型调整渲染。

5 个答案:

答案 0 :(得分:24)

您还可以将常规模板过滤器实现为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 %}
然而,我认为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>

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

该晚了,但是我遇到了这个问题。我寻求的解决方案是duck-typing,所以:

{% if action.extra_column.year %}
  {{ action.extra_column|date:"M y" }}
{% else %}
  {{ action.extra_column }}
{% endif %}

您能说这绝对不是正确的方法吗?大概。无需编写自己的模板过滤器并且无需维护更多代码,就可以完成工作吗?绝对。

答案 3 :(得分:0)

我知道我已经落后于此(三年),但我刚到这里寻找类似的东西,想出了我认为是一个不错的解决方案。

只需向您的模型添加一个功能,例如get_model_type,并让它返回您希望从每个模型中获得的内容,如下所示:

class MyModelOne(models.Model):
  date_created = models.DateTimeField(auto_now_add=True)
  first_name = models.CharField(max_length=255)
  def get_model_type(self):
    return "my_model_one"

class MyModelTwo(models.Model):
  date_created = models.DateTimeField(auto_now_add=True)
  other_field = models.CharField(max_length=255)
  def get_model_type(self):
    return "my_model_two"

然后在您的模板中,您可以轻松地调用该功能:

{% if model.get_model_type == 'my_model_one' %}
  <p>Model One</p>
{% elif model.get_model_type == 'my_model_two' %}
  <p>Model Two</p>
{% endif %}

答案 4 :(得分:0)

您可以尝试此方法来识别字符串与列表类型:

{%if v_1.0.1|length == 0%}
    <!--STR-->
    {{v_1}}
{%else%}     
     <!--List-->                                           
    {{v_1.0}}
{%endif%}