簡體   English   中英

將模型中所有DateField的日期與當前日期進行比較

[英]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並將每個字段與當前日期進行比較?

我們做了類似的事情。 在我們的代碼中,我們使用了模板標簽(請參閱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)

    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  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM