【问题标题】:how to know when an activity date has passed - django如何知道活动日期何时过去 - django
【发布时间】:2022-01-14 02:22:00
【问题描述】:

所以我仍在我的待办事项列表中,我想知道活动何时结束,以便将其标记为过期。

我的意见.py

def progress(request):
    activities = ToDo.objects.all()
    today = timezone.localtime(timezone.now())
    context = {
        'activities' : activities,
        'today' : today, 
    }
    return render(request, 'percent.html', context)
    

在我的模板中,我有它:

 {% for activity in activities %}
    {% if activity.end.date < today.date %}
    {{activity}} <br>
    {% endif %}
    {% endfor %}

我要添加我的 models.py 以供参考

class ToDo(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    todo = models.CharField(max_length=50)
    description = models.TextField(max_length=200, blank=True)
    created = models.DateField(auto_now=True)
    end = models.DateField()
    start = models.DateField()
    completed = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.owner} - {self.todo}'

或者向我的模型添加过期的布尔字段会更容易吗?我很困惑

【问题讨论】:

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


    【解决方案1】:

    注意:你需要使用Celery Beat作为调度器。

    import datetime
    
    def expired_activity():
        today = datetime.date.today()
        expired_activity = ToDo.objects.filter(end=today)
        if expired_activity:
                expired_activity.update(completed=True)
    

    【讨论】:

      【解决方案2】:

      如果您不想使用任何调度程序,您可以使用 ORM 管理器在另一个请求中获取过期项目:

      from django.db import models
      
      
      class ToDoManager(models.Manager):
          def active(self):
              return self.excude(end__lt=today().date)
      
          def expired(self):
              return self.filter(end__lt=today().date)
      
      
      class ToDo(models.Model):
          owner = models.ForeignKey(User, on_delete=models.CASCADE)
          todo = models.CharField(max_length=50)
          description = models.TextField(max_length=200, blank=True)
          created = models.DateField(auto_now=True)
          end = models.DateField()
          start = models.DateField()
          completed = models.BooleanField(default=False)
          
          objects = ToDoManager()
      
          def __str__(self):
              return f'{self.owner} - {self.todo}'
          
      

      在你看来,你会在不同的请求中得到它们:

      ToDo.objects.active()
      ToDo.objects.expired()
      

      或者您可以在从 db 请求数据时通过设置过期标志和保存结果来更改管理器

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 1970-01-01
        相关资源
        最近更新 更多