将模型中所有 DateFields 的日期与当前日期进行比较
compare the date of all DateFields in a model to the current date
如果我的模型中有
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 并将每个字段与当前日期进行比较?
还没有测试过,但我相信像下面这样的东西应该可以工作。
如果您使用模型方法将字段与当前日期和 return 数组进行比较,您应该能够在模板中循环遍历它,所以像这样
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 %}
这应该会让您走上正确的轨道,但可能需要进行一些编辑才能正常工作。
在您的模型上定义此方法
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
我们做了类似的事情。在我们的代码中,我们使用了模板标签(参见 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) 您不要用仅与显示方式相关的代码使您的模型混乱。
如果我的模型中有
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 并将每个字段与当前日期进行比较?
还没有测试过,但我相信像下面这样的东西应该可以工作。
如果您使用模型方法将字段与当前日期和 return 数组进行比较,您应该能够在模板中循环遍历它,所以像这样
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 %}
这应该会让您走上正确的轨道,但可能需要进行一些编辑才能正常工作。
在您的模型上定义此方法
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
我们做了类似的事情。在我们的代码中,我们使用了模板标签(参见 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) 您不要用仅与显示方式相关的代码使您的模型混乱。