【问题标题】:compare the date of all DateFields in a model to the current date将模型中所有 DateField 的日期与当前日期进行比较
【发布时间】:2015-10-12 07:41:17
【问题描述】:

如果我的模型中有

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 并将每个字段与当前日期进行比较?

【问题讨论】:

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


    【解决方案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) 您不会使用仅与显示方式相关的代码来弄乱您的模型。

    【讨论】:

      【解决方案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 %}
      

      这应该会让你走上正轨,但可能需要进行一些编辑才能正常工作。

      【讨论】:

      • 你正在迭代的fields是谁?
      • 只是一个组成的变量,您需要自己定义它,因为我不确定您的字段被称为什么等等。它将是您希望检查的日期字段
      • 很好的解决方案!以及如何访问 is_past 函数中每个字段的详细名称。我想使用append([verbose_name, field, True]) 所以我可以在我的模板中测试如果 True 然后显示 verbose_name: field
      【解决方案3】:

      在你的模型上定义这个方法

      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  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-24
        • 1970-01-01
        相关资源
        最近更新 更多