【问题标题】:Nested Loops in DjangoDjango中的嵌套循环
【发布时间】:2020-07-28 05:14:55
【问题描述】:

我的模型中有项目和任务。我想在模板上显示:

项目 1

  • 任务 1:1
  • 任务 1:2
  • 任务 1:n

项目 2

  • 任务 2:1
  • 任务 2:n

项目n

这是模型

class Projects(models.Model):
    slug_project = models.CharField(max_length=200)
    project_name = models.CharField(max_length=200)
    project_due_date = models.DateTimeField()
    project_lead_time = models.IntegerField()
    project_assignee = models.CharField(max_length=200)
    project_status = models.CharField(max_length=200)

    def __str__(self):
        return self.project_name


class Tasks(models.Model):
    slug_task = models.CharField(max_length=200)
    task_name = models.CharField(max_length=200)
    task_desc = models.TextField(null=True)
    task_channel = models.CharField(max_length=200)
    task_id = models.ForeignKey(Projects, on_delete=models.CASCADE)
    task_due_date = models.DateTimeField('Due Date')
    task_lead_time = models.IntegerField()
    task_assignee = models.CharField(max_length=200)

    def __str__(self):
        return self.task_name

我不确定如何正确构建视图,但这是我的代码:

class somePage(generic.ListView):
    template_name = 'dashboard/index.html'
    context_object_name = 'project_object'

    def get_queryset(self):
        """Return the last five published Coupons."""
        return Projects.objects.order_by('project_name')

    def get_context_data(self, **kwargs):
        context = super(somePage, self).get_context_data(**kwargs)
        # context['tasks'] = Tasks.objects.order_by('task_name') #this would display ALL tasks
        context.update({
            'all_project': Projects.objects.all(),
            'all_tasks': Tasks.objects.filter(task__id=self.object),
        })
        return context

而且我也不确定如何构建模板:

{% if project_object %}
{% for project_name in project_object %}
<div class="card_row_h1">
<a href="{% url 'dashboard:task_list' project_name.id %}">
{{ project_name }}
</a> 
</div>

{% if all_tasks %} 
{% for task_name in tasks %}
<div class="card_row_h2" style="width: 100%; padding-left: 30px;">
<small>{{ task_name }}</small>
</div>
{% endfor %}
{% else %}
<div class="card_row_h2" style="width: 100%;">
No Tasks for This Project
</div>
{% endif %}
{% endfor %}

结果是项目正确显示,但在每个项目下我没有得到任何“all_tasks”并且它显示“此项目没有任务”或者如果我使用“任务”(请参阅​​视图中的注释行),它会显示所有项目的所有任务一遍又一遍。

所以这里有两个问题:

  1. 如何构建视图,以及
  2. 如何构建模板?

我是新手,但我已经坚持了一天多。提前致谢。

【问题讨论】:

  • task_id = models.ForeignKey(Projects attr 名称的可怕选择。这是project
  • 对不起,我不熟悉这些约定。你能进一步解释一下吗?

标签: django python-3.x django-views django-templates


【解决方案1】:

好的开始!我认为您可以稍微简化一下。您可以使用反向查找外键来获取项目的任务集。如果不在任务模型 ForeignKey 中设置 related_name 参数,您可以使用 some_project.task_set.all() 访问与项目关联的任务。您甚至可以在模板中执行此操作,因此您无需担心覆盖视图的上下文数据:

views.py

class MainPage(ListView):
    template_name = 'dashboard/index.html'
    context_object_name = 'projects'

    def get_queryset(self):
        return Projects.objects.order_by('project_name')

index.html

{% for project in projects %}
    <div class="card_row_h1">
        <a href="{% url 'dashboard:task_list' project.id %}">
            {{ project.project_name }}
        </a>
    </div>
    {% if project.task_set.all %}
         {% for task in project.task_set.all %}
             <div class="card_row_h2" style="width: 100%; padding-left: 30px;">
             <small>{{ task.task_name }}</small>
         {% endfor %}
    {% else %}
        <div class="card_row_h2" style="width: 100%;">
            No Tasks for This Project
        </div>
    {% endif %}
{% endfor %}

如果您愿意,可以在您的任务模型中进行更改 task_id = models.ForeignKey(Projects, on_delete=models.CASCADE)

project = models.ForeignKey(Projects, on_delete=models.CASCADE, related_name="tasks"

这将使字段名称更直观一点,还可以让您访问项目的任务,只需执行以下操作: my_project_instance.tasks.all()

【讨论】:

  • 谢谢,这非常有帮助和清晰。有没有一个地方可以让我看到一些这样的示例代码?令人惊讶的是,尽管我进行了所有搜索,但仍然很难找到答案。
  • 很高兴它有帮助!您是否正在寻找特定部分的文档/示例?对于使用基于类的视图,django 文档非常有用:docs.djangoproject.com/en/3.0/topics/class-based-views/intro 也可以作为参考,ccbv 非常有用ccbv.co.uk(尤其是当事情变得更复杂时)
猜你喜欢
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2021-11-30
  • 2012-12-01
  • 1970-01-01
  • 2012-06-11
  • 2020-12-05
相关资源
最近更新 更多