在 Django 中列出我的项目下的任务

Listing my tasks under my projects in Django

我是 Django(和一般编程)的新手,可以使用一些非常简单但我无法弄清楚的帮助。

目前我正在为我的作品集开发 Django 项目管理器应用程序。

但我一直坚持创建不同项目及其任务的列表。

我想创建这样的东西:

Project_1

  1. 任务项 1(共 project_1)
  2. 任务项目 2(共 project_1)

Project_2

  1. 任务项 1(共 project_2)
  2. 任务项 2(共 project_2)

Project_3

  1. 任务项 1(共 project_3)
  2. 任务项目 2(共 project_3)
  3. 任务项目 3(共 project_3)

目前我有:

view.py:

def project(request):
""" Show all Projects"""
projects = Project.objects.order_by('date_added')
project = Project.objects.get(id=1)
tasks = project.task_set.order_by('date_added')
context = {'projects': projects, 'tasks': tasks}
return render(request, 'tasks/project.html', context)

project.html

    {% extends "tasks/base.html" %}
{% block content %}
<p>Projects</p>
<ul>
    {% for project in projects %}
    <li>{{project}}</li>
        <ul>
            {% for task in tasks %}
            <li>{{task}}</li>
            {% empty %}
            <li>No tasks added </li>
            {% endfor %}
        </ul>
    {% empty %}
    <li>No projects have been added yet.</li>
    {% endfor %}
</ul>

{% endblock content %}

models.py

class Project(models.Model):
    """A project the user is working on."""
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """Return a string representation of the model."""
        return self.text


class Task(models.Model):
    """A task of a project to complete."""
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'tasks'

    def __str__(self):
        """Return a string representation of the model."""
        if(len(self.text) < 50 ):
            return f"{self.text}"
        else:
            return f"{self.text[:50]}..."

我得到的结果是:

Project_1

  1. 任务项 1(共 project_1)
  2. 任务项目 2(共 project_1)

Project_2

  1. 任务项 1(共 project_1)
  2. 任务项目 2(共 project_1)

Project_3

  1. 任务项 1(共 project_1)
  2. 任务项目 2(共 project_1)

我知道问题是我使用了 project = Project.objects.get(id=1),因此它只显示与项目一相关的任务。 而且我认为如果 id 与正确的项目 id 相关,这可能是解决方案。 我似乎不知道我是怎么做到的。或者我看错方向了。

欢迎任何帮助,提前致谢。

您应该能够对项目中的任务使用反向查找。请参阅 django 文档的这一部分:https://docs.djangoproject.com/en/3.0/topics/db/queries/#following-relationships-backward

您已经建立了从任务到项目的外键关系。所以一个项目有很多任务。您可以使用 project.task_set 引用使用反向查找来访问项目的任务。您也可以在模板中执行此操作。所以你的观点很简单:

def project(request):
   """ Show all Projects"""
   projects = Project.objects.order_by('date_added')
   context = {'projects': projects}
   return render(request, 'tasks/project.html', context)

模板中列出任务的部分应该是:

            {% for task in project.task_set.all %}
            <li>{{task}}</li>
            {% empty %}
            <li>No tasks added </li>
            {% endfor %}

希望这对您有所帮助,如果有任何需要澄清的地方,请告诉我。