Как отфильтровать задачи с датой создания в списке задач
Я пытаюсь показать дату создания задач в моем списке в HTML.
class Task(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
title = models.CharField(max_length=200)
description = models.TextField(max_length=1000, blank=True, null=True)
complete = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
А это мой HTML в Django
<div class="task-items wrapper">
{% for task in tasks %}
<div class="task-wrapper">
{% if task.complete %}
<div class="task-title">
<div class="task-complete-icon"></div>
<i><s><a class="task" href="{% url 'update-task' task.id %}">{{task}}</a></s></i>
<br></br>
</div>
<a class="delete-link" href="{% url 'delete-task' task.id %}"><i class="fa-solid fa-delete-left"></i></a>
{% else %}
<div class="task-title">
<div class="task-incomplete-icon"></div>
<a href="{% url 'update-task' task.id %}">{{task}}</a>
</div>
<a class="delete-link" href="{% url 'delete-task' task.id %}"><i class="fa-solid fa-delete-left"></i></a>
{% endif %}
</div>
<div class="emptylist">
{% empty %}
<h3 style="text-align: center; line-height: 3;">No task in list! Let's create your task</h3>
</div>
{% endfor %}
</div>
Например, для каждой задачи, которую я создаю, должно быть показано название с датой создания, и не имеет значения, завершена она или нет. Я могу показать только название, а как мне сделать, чтобы показывалась дата? 
created = models.DateTimeField(auto_now_add=True)
пожалуйста, удалите auto_now_add=True, тогда вы получите DateTime picker в вашем шаблоне.
<div class="task-items wrapper">
{% for task in tasks %}
<div class="task-wrapper">
{% if task.complete %}
<div class="task-title">
<div class="task-complete-icon"></div>
<i><s><a class="task" href="{% url 'update-task' task.id %}">{{task.title}}-{{task.created}}</a></s></i>
<br></br>
</div>
<a class="delete-link" href="{% url 'delete-task' task.id %}"><i class="fa-solid fa-delete-left"></i></a>
{% else %}
<div class="task-title">
<div class="task-incomplete-icon"></div>
<a href="{% url 'update-task' task.id %}">{{task.title}}-{{task.created}}</a>
</div>
<a class="delete-link" href="{% url 'delete-task' task.id %}"><i class="fa-solid fa-delete-left"></i></a>
{% endif %}
</div>
<div class="emptylist">
{% empty %}
<h3 style="text-align: center; line-height: 3;">No task in list! Let's create your task</h3>
</div>
{% endfor %}
</div>
В настоящее время вы отображаете строковое представление вашей Task модели, которая, как я предполагаю, настроена на отображение заголовка вашей задачи. Вам необходимо
- отображать заголовок и дату отдельно
- измените свое представление
Task, чтобы вернуть строку, отформатированную с заголовком и временем
Я бы предпочел (1), потому что он дает вам гораздо больше контроля. Если вы хотите использовать (2), вам нужно добавить метод __str__ или __repr__.
Мой рекомендуемый метод - использовать переменную "created" в шаблоне для отображения даты.
Например, у меня есть модель под названием "post_created_on",
class Profile(models.Model):
post_created_on = models.DateTimeField()
и я хочу показать это в моем шаблоне.
<h5>This is a post.</h5>
Тогда я просто использую переменную "post_created_on" в вашем шаблоне, чтобы показать дату.
<h5>This is a post. Created on: {{ task.post_created_on }}</h5>
Вы могли бы использовать DateField()django-doc напрямую. Но если вы определили DateTimeField, вы можете использовать декоратор @property и показать date в формате 1-7-2022, как показано на рисунке.
Создайте @property в вашей модели Task следующим образом:
class Task(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
title = models.CharField(max_length=200)
description = models.TextField(max_length=1000, blank=True, null=True)
complete = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
@property
def get_only_date(self):
date_object = self.created
year = date_object.year
month = date_object.month
day = date_object.day
return f"{day}-{month}-{year}"
Затем, используйте любое место в вашем template файле как свойство в цикле:
{% for task in tasks %}
{{task.get_only_date}}
{% endfor %}
class Task(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
title = models.CharField(max_length=200)
description = models.TextField(max_length=1000, blank=True, null=True)
complete = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
{% for task in tasks %}
{{task.created.date}}
{% endfor %}
Вы можете использовать этот способ без кодирования каких-либо других свойств.