17

我有一个变量,我将它放入一个有时是日期,有时是字符串的表中。如果变量是日期,我想更改格式:

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

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

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

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

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

4

5 回答 5

37

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>
于 2012-08-19T18:21:10.783 回答
4

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

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

于 2012-08-19T15:17:06.863 回答
2

我知道我在这方面落后了(三年),但我刚到这里想做类似的事情,并想出了我认为不错的解决方案。

只需向您的模型添加一个函数,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 %}
于 2016-07-09T07:45:53.550 回答
2

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

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

你能说这绝对不是正确的做法吗?大概。它会在不编写自己的模板过滤器并且需要维护更多代码的情况下完成工作吗?绝对地。

于 2020-08-20T12:01:45.160 回答
0

你可以试试这个来识别 String 和 List 类型:

{%if v_1.0.1|length == 0%}
    <!--STR-->
    {{v_1}}
{%else%}     
     <!--List-->                                           
    {{v_1.0}}
{%endif%}
于 2020-10-24T14:35:47.803 回答