Как показать несколько объектов в подробном представлении 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>