Как показать несколько объектов в подробном представлении Django

У меня есть две созданные модели, одна Topic, другая Entries. В списке отображаются ссылки на все темы. При нажатии на ссылку каждой темы отображаются все записи, связанные с этой темой. Я создал несколько записей для каждой темы. В DetailView отображаются только отдельные записи для каждой темы. Как показать несколько записей для каждой ссылки темы с помощью DetailView?

Models.py

class Topic(models.Model):
    '''A topic that user will add the content about.'''
    title = models.CharField(max_length=200)

class Entries(models.Model):
    '''Entries and Topic will have many to one relationship'''
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    text = models.TextField()
    image = models.ImageField(upload_to='images', blank=True)
    date_added = models.DateTimeField(auto_now_add=True)

views.py

class TopicListView(ListView):
    model = Topic
    template_name = 'cms_app/topic_list.html'
    context_object_name = 'topic'

class ContentDetailView(DetailView):
    model = Entries

urls.py

urlpatterns = [
    path('', TopicListView.as_view(), name = 'all-topic'),
    path('content/<int:pk>', ContentDetailView.as_view(), name = 'all-content'),
]

Topic.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>All Topics</title>
</head>
<body>
    <h1>Topic List</h1>
    <h3>
    {% for data in topic %}
        <p><a href="{% url 'all-content' data.id %}">{{ data.title }}</a></p>
    {% endfor %}
    </h3>
</body>
</html>

Entries.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>All Contents</title>
</head>
<body>
        <p>{{object.text }}</p>
        <p>{{object.image }}</p>
        <p>{{object.date_added }}</p>
</body>
</html>

Вы сконфигурировали ContentDetailView с model = Entries. DetailView ищет только один объект из базы данных и делает его доступным в контексте, поэтому он предоставляет вам только один объект Entries. Кроме того, в URL вы передаете Topic значение идентификатора ContentDetailView. Это означает, что вы передаете в URL что-то вроде Topic ID 1, но затем он ищет Entries объект с ID 1 и отображает этот Entries объект, хотя этот Entries объект может быть даже не связан с Topic, на котором был сделан щелчок.

Вам нужно изменить ContentDetailView для поиска Topic, на который был нажат:

class ContentDetailView(DetailView):
    model = Topic
    context_object_name = 'topic'

А затем измените Entries.html на итерацию по Entries в выбранном Topic:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>All Contents</title>
</head>
<body>
    <div>Topic: {{ topic.title }}<div>

    {% for entry in topic.entries_set.all %}
        <p>{{object.text }}</p>
        <p>{{object.image }}</p>
        <p>{{object.date_added }}</p>
    {% endfor %}
</body>
</html>

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

Так, для моей модели Entries, если у меня создано 10 экземпляров. Приведенный ниже код позволит мне показать все эти 10 экземпляров на странице детального просмотра, что я хотел сделать, когда пользователь нажмет на ссылку Topic.

class ContentDetailView(DetailView):
    model = Entries

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        c_id = get_object_or_404(Topic, pk = self.kwargs['pk'])
        context['content'] =  Entries.objects.filter(topic_id = c_id)
        return context
 
Now we have to loop through this content key in the template to get all the instance data we have created for single model.

entries_detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>All Contents</title>
</head>
<body>
    {% for obj in content %}
        <p>{{ obj.text }}</p>
        <p>{{ obj.image }}</p>
        <p>{{ obj.date_added }}</p>
    {% endfor %}
</body>
</html>
Вернуться на верх