gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:30:19 26 4
gpt4 key购买 nike

我知道我可以将当​​前日期设为 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com