【问题标题】:Comparing dates using a comparator inside Django template使用 Django 模板中的比较器比较日期
【发布时间】:2026-02-23 01:20:13
【问题描述】:

我正在尝试将活动的结束日期与今天的日期进行比较,以查看活动是否已结束。如果活动已经结束,网站用户将没有注册按钮,如果活动尚未开始或正在进行,用户将有一个 html 注册按钮。

我已经在我的 html 模板中尝试过这个:

{% if event.end_date|date:"jS F Y H:i" <= today|date:"jS F Y H:i" %}
          {% include 'event/includes/enroll.html' %}

但按钮显示事件是否已经结束。

我想在我的 django 模型中添加一个方法,如下所示:

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

但是我不确定如何导入该方法并在html模板中使用它。

我想尝试在我的视图中添加一个变量,如下所示:(Django - Checking datetime in an 'if' statement)

is_today = model.end_date >= datetime.today()
return render_to_response('template.html', {'is_today': is_today})

但是一位同事编写了基于类的视图来渲染模板,但不确定如何添加变量以使用基于类的视图进行渲染。我也遇到了一个错误:

TypeError: '>=' not supported between instances of 'DeferredAttribute' and 'datetime.datetime'

如果有人能就如何最好地实现我的需要提出建议,我将不胜感激:D

【问题讨论】:

    标签: python django date django-templates comparator


    【解决方案1】:

    您好,您为什么不使用 custom_filter,它会在您的模板中返回 TrueFalse? (https://docs.djangoproject.com/fr/3.1/howto/custom-template-tags/):

    import datetime
    from django import template
    from django.conf import settings
    
    
    register = template.Library()
    
    
    @register.filter
    def event_ended(date_event):
        return date_event >= datetime.date.today()
    
    {% load poll_extras %}
    {% if event.end_date | event_ended %}
        {% include 'event/includes/enroll.html' %}
    

    文档中的链接告诉您自定义模板的放置位置

    【讨论】:

    • 谢谢@maximeK 我刚刚尝试使用 my_tags.py 中的模板标签和模板中的 {% load my_tags %} 来实现这一点。但它仍然忽略了我打印和测试的结束日期,并且没有显示注册按钮,无论活动是否结束
    • 我居然搞定了,忘了在date_event后面加上.date()来去掉时间。现在都在工作!再次感谢