Для того чтобы сделать вывод комментариев только для одной записи в Django, вам потребуется создать связь между моделями записи и комментариев, а затем использовать фильтрацию для вывода только комментариев, относящихся к данной записи.
1. Создайте две модели: Post
(запись) и Comment
(комментарий).
from django.db import models class Post(models.Model): title = models.CharField(max_length=255) content = models.TextField() class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments') author = models.CharField(max_length=100) body = models.TextField() created_at = models.DateTimeField(auto_now_add=True)
В модели Post
мы указываем связь ForeignKey
с моделью Comment
, чтобы каждый комментарий имел ссылку на родительскую запись, а related_name
позволяет обращаться к комментариям, связанным с записью.
2. Создайте представление, которое будет выводить комментарии только для одной записи.
from django.shortcuts import render from .models import Post def post_detail(request, post_id): post = Post.objects.get(id=post_id) comments = post.comments.all() return render(request, 'post_detail.html', {'post': post, 'comments': comments})
В этом представлении мы получаем запись с помощью метода get
и фильтруем комментарии, связанные с этой записью, с помощью обратного связывания по related_name
. Затем передаем в шаблон объекты записи и комментарии.
3. Создайте шаблон post_detail.html
, в котором вы можете отображать запись и комментарии.
<h1>{{ post.title }}</h1> <p>{{ post.content }}</p> <h2>Комментарии</h2> {% for comment in comments %} <div> <p>{{ comment.author }}</p> <p>{{ comment.body }}</p> <p>{{ comment.created_at }}</p> </div> {% empty %} <p>Нет комментариев.</p> {% endfor %}
В этом шаблоне мы выводим содержимое записи и затем перебираем через цикл for
комментарии, отображая автора, текст комментария и дату создания. Если комментариев нет, выводим сообщение об их отсутствии.
4. Настройте маршрут для представления в файле urls.py
.
from django.urls import path from .views import post_detail urlpatterns = [ path('post/<int:post_id>/', post_detail, name='post_detail'), ]
В этом примере мы создаем динамический маршрут <int:post_id>
, который будет передавать post_id
в качестве параметра в представление post_detail
.
Теперь, когда пользователь открывает URL вида /post/1/
, он увидит запись с комментариями, относящимися только к этой записи. При необходимости вы можете добавить дальнейшие функциональные возможности, такие как возможность добавления новых комментариев или пагинацию для большого количества комментариев.