【问题标题】:Django - Checking datetime in an 'if' statementDjango - 在“if”语句中检查日期时间
【发布时间】:2017-08-20 09:28:00
【问题描述】:

我有一个非常富有想象力的模型,名为“model”,其中有一个字段“datefinish”;用户可以在此处输入格式为 MM/DD/YYYY 的日期。在我的模板中,当所述模型的datefinish(日期)等于当前日期时,我需要显示一些文本。

HTML:

{% if model.datefinish == datetime.today %}
   <h5>It ends today</h5>
{% else %}
   <h5>It does not end today</h5>
{% endif %}

如何实现这一目标? 我正在使用 Django 1.10...谢谢!

【问题讨论】:

  • 你的标题很奇特:你绝对没有“设置”一个if等于某事的声明。
  • @khelwood 抱歉,不知道该怎么说 - 有什么建议吗?
  • 看起来更像是在if 语句中检查日期时间。
  • @khelwood 已更改,谢谢!

标签: python django


【解决方案1】:

不要在模板中这样做。在模型上编写一个方法 - 例如称为 finishes_today - 执行此检查并返回一个布尔值,然后在模板中调用它。

【讨论】:

  • 或添加模板标签
  • @bodolsog 建议也不错,如果您经常想在多个模型上进行检查
【解决方案2】:

我会避免使用逻辑重载模板并将此检查放入视图中(或作为 Daniel 建议的模型属性):

is_today = model.datefinish == datetime.today()

return render_to_response('template.html', {'is_today': is_today})

然后,在您的模板中简单地检查上下文中传递的变量:

{% if is_today %}
   <h5>It ends today</h5>
{% else %}
   <h5>It does not end today</h5>
{% endif %}

还有this option,不过看起来确实有点过于复杂了。

【讨论】:

    【解决方案3】:

    根据 Daniel 的建议,我更喜欢该模型选项,因为这样您在加载该模型时始终可以使用它

    在模式中:

    @property
    def is_today(self):
      return self.datefinish == datetime.today().date()
    

    这假设“datefinish”是一个 DateField,而不是 DateTimeField,对于 DateTimeField,你会这样做self.datefinish.date() == ...

    您还可以查看它是否在一个范围内,即

    return self.start_date <= datetime.today().date() <= self.end_date
    

    如果模型中有两个日期。

    或创建一个模板标签,如:

    @register.filter
    def is_today(dt):
      if isinstance(dt, datetime):
        return dt.date() == datetime.today().date():
      if isinstance(dt, date):
        return dt == datetime.today().date():
    

    然后在模板中就可以做

    {% if model.datetime_field|is_today %}
    

    过滤器可以处理DateField和DateTimeField

    【讨论】:

    • +1 但这会引发 'NoneType' 对象没有属性 'date' 错误......即使它是 DateTimeField - 有什么想法吗?
    • 可以修复我的代码以测试 NoneType,您可能在数据库中将 datetimefield 设置为 null。
    • 换句话说:我上面的代码假设你总是传递一个有效的对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多