Отображение 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
    )
Вернуться на верх