0

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

目前我正在为我的投资组合在 Django 中开发一个项目管理器应用程序。

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

我想创建这样的东西:

项目_1

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

项目_2

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

项目_3

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

目前我有以下内容:

视图.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)

项目.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 %}

模型.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]}..."

我得到的结果是:

项目_1

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

项目_2

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

项目_3

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

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

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

4

1 回答 1

0

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

您已经建立了从 Tasks 到 Project 的外键关系。所以一个项目有很多任务。您可以使用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 %}

希望这会有所帮助,如果有什么需要澄清的,请告诉我。

于 2020-07-17T19:28:09.310 回答