如何在单个页面上显示帖子和相关评论?

时间:2019-07-02 17:53:27

标签: python django

我无法设计代码来呈现一个特定的帖子及其相关注释。问题可能出在views.py或url中。

我查看了多个来源,但没有任何结果。我是编码的新手,觉得缺少一些要点。正在正确创建帖子和评论,并且所有评论都分配了正确的post_id。

我的models.py设置如下:

class Post(models.Model):
title = models.CharField(max_length=1000)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)

def __str__(self):
    return self.title

def get_absolute_url(self):
    return reverse('blog-home')

class Comment(models.Model):
cid = models.AutoField(primary_key=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
comment = models.TextField()
comment_date = models.DateTimeField(default=timezone.now)

def save(self, *args, **kwargs):
    super(Comment, self).save(*args, **kwargs)

def __str__(self):
    return self.comment


def get_absolute_url(self):
    return reverse('blog-home')

我的views.py的设置如下:

class PostDetailView(DetailView):
model = Post

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['comment_list'] = Comment.objects.filter(post=WHAT SHOULD GO HERE?)
    return context

我需要在上面的过滤器中传递Post.id或帖子的主键。有人可以解释它应该是什么吗?

用于访问帖子详细信息的网址如下:

path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail')

当views.py中包含以下内容时,我将帖子详细信息视图显示为帖子的作者,标题和内容:

class PostDetailView(DetailView):
model = Post

其模板如下:

{% extends "blog/base.html" %}
{% block content%}
	
<article class="media content-section">
		<img class="rounded-circle article-img" src="{{object.author.profile.image.url}}">
		  <div class="media-body">
		    <div class="article-metadata">
		      <a class="mr-2" href="{% url 'user-posts' object.author.username %}">{{ object.author }}</a>
		      <small class="text-muted">{{ object.date_posted|date:"F d, Y P e" }}</small>
		      {% if object.author == user %}
		      <div><a class="btn btn-secondary btn-sm m-1 mb-1" href="{% url 'post-update' object.id%}">Update</a>
		      <a class="btn btn-danger btn-sm m-1 mb-1" href="{% url 'post-delete' object.id%}">Delete</a></div>
		      
		      {% endif %}
		    </div>
		    <h2 class="article-title">{{ object.title }}</h2>
		    <p class="article-content">{{ object.content }}</p>
		  </div>
</article>
{% for comment in comment_list %}
<div class='article-content'>
	<p>{{comment}}</p>
</div>
{% endfor %}
	
{% endblock %}

我应该如何获取Post的post.id或pk并使用它来过滤仅与该特定帖子相关的评论?

此外,设置呈现查询集的模板的好方法是什么?

2 个答案:

答案 0 :(得分:1)

您应该能够遍历模板中从Post对象到与其链接的Comment对象(默认为comment_set)的反向链接:

{% for comment in post.comment_set %}

如果您想要更大的控制权,可以将查询集注入到上下文中,类似这样,以仅获取最新的六个注释。

"comments": post.comment_set.order_by("-comment_date")[:6]

所选的发布对象应在self.object中以DetailView的形式提供,并且默认情况下将以object的形式注入渲染上下文中。 Classy CBV是用于导航基于Django Class的视图的结构的宝贵资源。 网站。

警告:这“不在我的头上”,所以不要以为这一切都是完美的。

答案 1 :(得分:0)

单个对象将有权访问其相关对象。 试试这个:

class PostDetailView(DetailView):
    model = Post

    # There's no need to define get_context_data() here

现在,您的模板将以post(还有object)的形式发布该帖子。 带有此post的所有注释都可以在模板上找到,如下所示:

{% for comment in post.comment_set.all %}
    <div class='article-content'>
        <p>{{ comment }}</p>
    </div>
{% endfor %}