将模型中所有DateField的日期与当前日期进行比较

时间:2015-07-22 12:21:03

标签: python django django-models django-templates django-views

如果我在我的模特中

class MyModel(models.model):
    field1 = models.ForignKey(AnotherModel)
    field2 = models.DateField(blank=True, null=True)
    field3 = models.DateField(blank=True, null=True)
    field4 = models.DateField(blank=True, null=True)
    field5 = models.DateField(blank=True, null=True)
    ...
    field10 = models.DateField(blank=True, null=True)

我想测试每个字段,如果过去的那一天,所以我可以在我的模板中使用类似的东西:

{% for field in context.datetime_fields %}
    {% if field.is_past %}
       <span class="past">{{ field}}</span>
    {% else %}
        <span class="active">{{ field}}</span>
    {% endif %}
{% endfor %}

我发现了一些其他类似的问题,但都是关于如何将一个DateField与当前日期进行比较。我要问的是如何迭代MyModel中的每个DateField并将每个字段与当前日期进行比较?

3 个答案:

答案 0 :(得分:1)

我们做了类似的事情。在我们的代码中,我们使用了模板标记(请参阅https://docs.djangoproject.com/en/1.8/howto/custom-template-tags/。在模板标记文件中,我们有:(注意,您可以删除有关处理日期时间的部分):

from django import template
from datetime import date, datetime, timedelta

register = template.Library()

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

@register.filter(expects_localtime=True)
def is_past(value):
    if isinstance(value, datetime):
        value = value.date()
    return value < date.today()

然后在模板中你可以这样做:

 {% if this_date_object|is_today  %} <span class="active">{{field}}</span> {% endif %}
 {% if this_date_object|is_past   %} <span class="past"> {{field}}</span> {% endif %}

这里的小优点是:1)您可以在其他地方重复使用日期比较,以及2)您的模型不会使用仅与其显示方式相关的代码来混淆您的模型。

答案 1 :(得分:0)

Haven未经过测试,但我相信以下内容应该有效。

如果你使用模型方法将字段与当前日期进行比较并返回一个数组,你应该能够在模板中循环它,所以像这样的东西

class MyModel(models.model):
    field1 = models.ForignKey(AnotherModel)
    field2 = models.DateField(blank=True, null=True)
    field3 = models.DateField(blank=True, null=True)
    field4 = models.DateField(blank=True, null=True)
    field5 = models.DateField(blank=True, null=True)
    field10 = models.DateField(blank=True, null=True)

    def is_past:
        past = []
        for field in fields:
            if field.date < datetime.now().date():
                past.append(True)
            else:
                past.append(False)
        return past

模板:

{% for field in context.is_past %}
    {% if field == True %}
       <span class="past">{{ field}}</span>
    {% else %}
        <span class="active">{{ field}}</span>
    {% endif %}
{% endfor %}

这应该让你走在正确的轨道上,但可能需要一些编辑才能为你正常工作。

答案 2 :(得分:0)

在模型上定义此方法

def is_past(self):
    fields = (
        self.field1, 
        self.field2, 
        self.field3, 
        self.field4, 
        self.field5, 
        self.field10,
    )
    for field in fields:
        if field.date < datetime.now().date():
            return True
    return False