как перечислить подполя полей модели в Django ListView?

#django #django-models #django-views

Вопрос:

В рамках моей модели work_allocation у меня есть поле под названием activity_name . Для всех activity_name есть вложенные поля, связанные, как показано на рисунке

здесь

В views.py Я написал простое представление на основе классов для отображения activity_task( get_task_list ), которое работает нормально. Но я не могу видеть соответствующие вложенные поля.

Не уверен, какие изменения я должен внести, чтобы это произошло. Ниже приведены детали моего проекта:

models.py

 from django.db import models


class Status_Code(models.Model):
    Types = models.CharField(max_length=50, blank=True)

    def __str__(self):
        return self.Types


class Assignee_Name(models.Model):
    emp_name = models.CharField(max_length=50, blank=True)

    def __str__(self):
        return self.emp_name


class Priority(models.Model):
    priority = models.CharField(max_length=50, blank=True)

    def __str__(self):
        return self.priority


class work_allocation(models.Model):
    activity_name = models.CharField(max_length=100)
    JIRA_tkt = models.CharField(max_length=100)
    Assignee_name = models.ForeignKey(Assignee_Name, on_delete=models.CASCADE)
    Status_code = models.ForeignKey(Status_Code, on_delete=models.CASCADE)
    Description = models.TextField()
    Planned_start_date = models.DateField(auto_now_add=True)
    Planned_end_date = models.DateField(auto_now_add=True)
    actual_start_date = models.DateField(auto_now_add=True)
    actual_end_date = models.DateField(auto_now_add=True)
    priority = models.ForeignKey(Priority,on_delete=models.CASCADE)

    def __str__(self):
        return self.activity_name
 

views.py

 def createTask(request):
    if request.method == 'POST':
        form = Work_alloc_Form(request.POST)
        if form.is_valid():
            data_to_db = work_allocation()
            data_to_db.activity_name = form.cleaned_data['activity_name']
            data_to_db.JIRA_tkt = form.cleaned_data['JIRA_tkt']
            data_to_db.Assignee_name = form.cleaned_data['Assignee_name']
            data_to_db.Status_code = form.cleaned_data['Status_code']
            data_to_db.Planned_start_date = form.cleaned_data['Planned_start_date']
            data_to_db.Planned_end_date = form.cleaned_data['Planned_end_date']
            data_to_db.actual_start_date = form.cleaned_data['actual_start_date']
            data_to_db.actual_end_date = form.cleaned_data['actual_end_date']
            data_to_db.Description = form.cleaned_data['Description']
            data_to_db.priority = form.cleaned_data['priority']
            data_to_db.save()
            messages.success(request, f'Profile has been updated successfully')
            return redirect('/home')
        else:
            messages.error(request, AttributeError)
    else:
        form = Work_alloc_Form()
    return render(request, 'tasks/create_work_allocation.html', context={'form': form})


class get_task_list(ListView):
    model = work_allocation
 

Например, на веб-странице с видом «ПОЛУЧИТЬ» я должен увидеть «новую задачу» и связанные с ней поля, такие как JIRA, assignee name, status code и т. Д.

Надеюсь, я ясно выразился в своем вопросе.

Пожалуйста, предложите

Ответ №1:

Поскольку вы уже определили __str__ для каждого класса, все, что нам нужно сделать, это просто создать HTML-шаблон для ListView этого и отобразить каждое поле соответствующим образом.

Допустим, у нас есть 2 записи:

 >>> from my_app.models import *
>>> for item in work_allocation.objects.values():
...     print(item)
... 
{'id': 1, 'activity_name': 'new task', 'JIRA_tkt': '1234', 'Assignee_name_id': 1, 'Status_code_id': 1, 'Description': 'qwerty', 'Planned_start_date': datetime.date(2021, 9, 20), 'Planned_end_date': datetime.date(2021, 9, 20), 'actual_start_date': datetime.date(2021, 9, 20), 'actual_end_date': datetime.date(2021, 9, 20), 'priority_id': 1}
{'id': 2, 'activity_name': 'another task', 'JIRA_tkt': '56', 'Assignee_name_id': 2, 'Status_code_id': 2, 'Description': 'asd', 'Planned_start_date': datetime.date(2021, 9, 20), 'Planned_end_date': datetime.date(2021, 9, 20), 'actual_start_date': datetime.date(2021, 9, 20), 'actual_end_date': datetime.date(2021, 9, 20), 'priority_id': 2}
 

Теперь создайте файл my_app/templates/my_app/work_allocation_list.html

 {% for item in object_list %}
    <hr/>
    {{ item.activity_name }}<br/>
    {{ item.JIRA_tkt }}<br/>
    {{ item.Assignee_name }}<br/>
    {{ item.Status_code }}<br/>
{% endfor %}
<hr/>
 

ListView будет автоматически использовать его для отображения списка work_allocation объектов:

введите описание изображения здесь