Отображение Todo в его категории [Django].
Я не уверен, как задать этот вопрос, но я попробую.
Я пишу приложение Todo и хочу отображать каждое Todo под соответствующей категорией в шаблоне. Например
Display each category
{% for category in categories %}
<h2>{{ category.name }}</h2>
Now show each todo that falls under the above category
{% for todo in todos %}
<p>{{ todo.description }}</p>
{% endfor %}
{% endfor %}
Как создать набор запросов, который даст мне такой тип структуры? Или есть другой способ достичь этого?
Если что-то неясно или требуется дополнительная информация, дайте мне знать, и я добавлю это в пост
Любая помощь будет оценена по достоинству, спасибо.
Модели
class Category(models.Model):
name = models.CharField(max_length=20)
class Meta:
verbose_name_plural = "Categories"
def __str__(self):
return self.name
class Todo(models.Model):
# Priority choices
PRIORITY_CHOICES = (
("bg-danger", "High"),
("bg-info", "Normal"),
("bg-warning", "Low"),
)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
description = models.CharField(max_length=255)
priority = models.CharField(max_length=200, choices=PRIORITY_CHOICES, null=True)
completed = models.BooleanField(default=False)
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
category = models.ManyToManyField(Category)
def __str__(self):
return self.description
View
def todo_listview(request):
template_name = "todos/listview.html"
context = {
"todos": get_users_todos(user=request.user),
"categories": Category.objects.all(),
}
return render(request, template_name, context)
Вы можете предварительно получить данные пользователя Todo
, с помощью:
from django.db.models import Prefetch
def todo_listview(request):
template_name = 'todos/listview.html'
context = {
'categories': Category.objects.prefetch_related(
Prefetch('todo_set', queryset=get_users_todos(user=request.user), to_attr='user_todos')
)
}
return render(request, template_name, context)
и затем отобразите это с помощью:
Display each category
{% for category in categories %}
<h2>{{ category.name }}</h2>
{% for todo in category.user_todos %}
<p>{{ todo.description }}</p>
{% endfor %}
{% endfor %}
Поскольку между Category
и Todo
существует поле "многие ко многим", возможно, что одно и то же Todo
будет напечатано несколько раз: один раз для каждой категории.
Примечание: документация советует использовать
.AUTH_USER_MODEL
настройки [Django-doc] вместоget_user_model()
[Django-doc]. Это безопаснее, так как если приложение аутентификации еще не загружено, настройки все еще могут указывать имя модели. Поэтому лучше написать:from django.conf import settings class Todo(models.Model): # … user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE )