Вложенные циклы в Django - PullRequest
0 голосов
/ 15 апреля 2020

У меня в моделях есть проекты и задачи. Я хотел бы отобразить в шаблоне:

Проект 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. как создать шаблон?

Я новичок ie, но я застрял на этом более дня. Заранее спасибо.

1 Ответ

0 голосов
/ 15 апреля 2020

Хорошее начало! Я думаю, вы можете немного упростить это. Вы можете получить набор задач для проекта, используя обратный поиск внешних ключей. Не устанавливая аргумент related_name в моделях задач ForeignKey, вы можете получить доступ к задачам, связанным с проектом, используя 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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...