首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >确定django模板中的变量类型

确定django模板中的变量类型
EN

Stack Overflow用户
提问于 2012-08-19 07:47:05
回答 5查看 29K关注 0票数 17

我有一个变量,我把它放到一个表中,这个表有时是日期,有时是字符串。如果变量是日期,我想要更改格式:

代码语言:javascript
运行
复制
<td>{{ action.extra_column|date:"M d" }}</td>

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

代码语言:javascript
运行
复制
<td>{{ action.extra_column }}</td>

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-19 23:17:07

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

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

票数 4
EN

Stack Overflow用户

发布于 2012-08-20 02:21:11

您还可以实现一个与type()内置等效的通用模板筛选器:

代码语言:javascript
运行
复制
# 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

代码语言:javascript
运行
复制
# 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>
票数 37
EN

Stack Overflow用户

发布于 2016-07-09 15:45:54

我知道我在这方面落后了很多(落后了三年),但我只是来到这里,希望做一些类似的事情,并提出我认为是一个像样的解决方案。

只需向get_model_type等模型添加一个函数,并让它返回您期望从每个模型返回的内容,如下所示:

代码语言:javascript
运行
复制
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"

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

代码语言:javascript
运行
复制
{% 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 %}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12023112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档