Как узнать, что дата активности прошла - django

Итак, я все еще нахожусь в своем списке дел и хочу знать, когда деятельность прошла, чтобы отметить ее как просроченную.

my views.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}'

или проще добавить к моим моделям поле boolean с истекшим сроком действия? Я так запутался

Примечание: Вам необходимо использовать 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)

Если вы не хотите использовать какой-либо планировщик, вы можете получить просроченные элементы в другом запросе, используя ORM Manager:

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()

Или вы можете изменить менеджер с помощью установки флага expired и сохранения результатов при запросе данных из db

Вернуться на верх