Django 3 объединяет DetailView и элементы (ListView) из отношений ManyToMany в одном шаблоне - PullRequest
0 голосов
/ 28 января 2020

Я работаю над проектом Django 3, где я пытаюсь связать людей с продуктами, которые они используют. Конечной целью является отображение подробного представления о человеке (DetailView) и включение списка продуктов, которые они используют (ListView?). Вот что у меня есть в моих моделях, представлениях и шаблонах:

# models.py (omitting non-relevant fields)
class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=75, db_index=True)
    products = models.ManyToManyField('Product', through='PersonProduct')
class Product(models.Model):
    name = models.CharField("Product Name", max_length=75)
class PersonProduct(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    created = models.DateTimeField(default=timezone.now)

# views.py
class PersonDetailView(DetailView):
    model = Person
    queryset = Person.objects.all()
    template_name = 'person_detail.html'

# person_detail.html (simplified for clarity)
{% extends 'base.html' %}
{% block content %}

<div class="person-detail">
    <h2>{{ person.first_name }} {{ person.last_name }}</h2>
</div>

<div class="gear-list">
    <ul>

<!--
This is where I'm stuck. I know I need to iterate over the products
that are associated with the person, but I can't figure out how to do it.
-->

    </ul>
</div>
{% endblock content %}

Страница отображает подробную информацию о человеке просто отлично, но там нет ничего для продуктов, которые он / она использует. Я подтвердил, что в соединительной таблице PersonProduct есть записи о продуктах для конкретного человека, которого я тестирую.

Я знаю, что в моем понимании того, как это должно работать, есть большой пробел, но я могу ' не могу найти ответ где угодно. Предложения по решению этой проблемы и другим ресурсам для чтения / изучения приветствуются.

1 Ответ

1 голос
/ 28 января 2020

Вы можете сделать это следующим образом:

{% for product in person.products.all %}
  <li>{{ product.name }}</li>
{% endfor %}

Или, если вам нужна дата из таблицы through:

{% for personproduct in person.personproduct_set.all %}
  <li>{{ personproduct.products.name }} - {{ personproduct.created }}</li>
{% endfor %}
...