python - Django 模板 - 是否有内置方法可以将当前日期作为 'date' 类型而不是 'str' 类型获取?

标签 python django django-templates

我知道我可以将当​​前日期设为 str在 Django 模板中(使用 template tag now ),像这样:

{% now "Y-m-d" as today_str %}
<p>{{ today_str }}</p>

但我不能将其用于比较:
{% now "Y-m-d" as today_str %}

{% for elem in object_list %}
    {% if elem.date < today_str %}        {# WRONG: this compares 'date' and 'str' #}
        <p>{{ elem.pk }} before today</p>
        {# do some other rendering #}
    {% endif %}
{% endfor %}

可能的解决方案:
  • 我知道我可以将上下文变量传递给模板,但在我看来它需要代码:
    # in my class-based-view in 'views.py'
    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx['today'] = timezone.now()
        return ctx
    
  • 或者我可以创建一个自定义模板标签,但这是更多的附加代码。

  • 正如你所看到的,我有解决我的问题的方法,但我想知道是否有一种内置的方式来获取当前的 date (或 datetime )在模板中?

    最佳答案

    所以,我所有的搜索都没有产生一个简短的解决方案。问题的答案似乎是:不,没有内置方法可以将当前日期(或日期时间)作为模板中的变量。
    如果其他人正在搜索此主题,我将尝试总结我可以采用的以及其他用户建议的可能解决方法。

  • 我可以从我的角度将上下文变量传递给模板。在看起来像这样的基于类的 View 中(它甚至是 docs 中的一个例子):
     # file 'my_app/views.py'
     from django.utils import timezone as tz
     from django.views.generic import ListView
    
     class MyView(ListView)
         ...
    
         def get_context_data(self, **kwargs):
             ctx = super().get_context_data(**kwargs)
    
             now = tz.now()
             ctx['now'] = now
             ctx['today'] = tz.localtime(now).date()
    
             return ctx
    
  • 我可以创建一个自定义 context processor将该变量加载到每个模板。在可能如下所示的基于类的 View 中:
     # file 'context_processors.py'
     from django.utils import timezone as tz
    
     def now_and_today(request):
         now = tz.now()
         return {
             'now': now,
             'today': tz.localtime(now).date(),
         }
    
     # file 'settings.py'
     ...
     TEMPLATES = [
         {
             ...
             'OPTIONS': {
                 'context_processors': [
                     ...
                     'context_processors.now_and_today',
                 ],
             },
         },
     ]
     ...
    
  • 我可以创建一个 custom template tag , 像这样:
     # file 'my_app/custom_template_tags/custom_time_tags.py'
     from django.utils import timezone as tz
     from django import template
     register = template.Library()
    
     @register.simple_tag
     def get_now(request):
         return tz.now()
    
     @register.simple_tag
     def get_today(request):
         return tz.localtime(tz.now()).date()
    
    像这样使用:
     {% load 'custom_time_tags' %}
    
     {% get_today as today %}
     {% for per in person_list %}
         {% if per.brith_date > today %}
             <p>{{ per.name }} is from the future!!<p>
         {% endif %}
     {% endfor %}
    
  • 我还可以向模型添加一个属性(甚至是 cached_property ):
     # file 'models.py'
     from django.db import models
     from django.utils import timezone as tz
     from django.utils.functional import cached_property
    
     class Person(models.Model):
         ...
    
         @cached_property
         def is_from_future(self):
             # careful: for long-lived instances do not use 'cached_property' as
             # the time of 'now' might not be right later
             if self.birth_date > tz.localtime(tz.now()).date():
                 return True
    
             return False
    
  • 最后但并非最不重要的一点是,我可以在 View 中进行处理并向元素添加一个属性:
     # file 'my_app/views.py'
     from django.utils import timezone as tz
    
     def person_list(request):
         today = tz.localtime(tz.now()).date()
    
         person_list = []
         for p in Person.objects.all():
             p.is_from_future = self.birth_date > today
             person_list.append(p)
    
         return render(request, 'some_template.html', {'person_list': person_list})
    
  • 关于python - Django 模板 - 是否有内置方法可以将当前日期作为 'date' 类型而不是 'str' 类型获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52296306/

    相关文章:

    django - 如何将计算列添加到 django 模型的列表页面?

    django - 使用@require_POST 时如何在 Django 中显示 HTTP 状态 405(不允许的方法)的自定义错误页面

    单独文件中的 Javascript 在 Django 中不起作用

    java - 无法获取环境,+ java.lang.ExceptionInInitializerError,Traceback IOError : File not found -

    python - 如何将代码块聚类为级别 (Python)

    python - 拉直图像中最大的线

    python - Django 迁移。如何检查迁移中是否存在表?

    python - 需要从模板中的django获取实例id

    django - 如何检查用户是否已经在 Django 中喜欢博客文章

    python - Python 中的简单列表函数