首页 > 解决方案 > Django,如何仅在登录用户的帖子模板中显示博客帖子的评论

问题描述

Django,如何仅在登录用户的帖子模板中显示博客帖子的评论,我制作了下面提到的模型和视图。现在我的评论已成功存储在用户名的数据库中,但问题是它没有显示在帖子中。到目前为止,仅显示计数以查看到目前为止发布了多少评论!

def get_comments(self):
    return self.comments.all().order_by('-timestamp')

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)
    commentfield = models.TextField()
    post = models.ForeignKey(Blogpost, related_name='comments', on_delete=models.CASCADE)

    def __str__(self):
        return self.user.username

**My Forms**

from django import forms
from .models import Blogpost, Comment


class CommentForm(forms.ModelForm):
    commentfield  = forms.CharField(widget=forms.Textarea(attrs={
        'class': 'form-control',
        'placeholder': 'Type your comment',
        'id': 'usercomment',
        'rows': '4'
    }))
    class Meta:
        model = Comment
        fields = ("commentfield",)

**My Blog Post Views**

def blogpost(request, year, month, day, post):
    category_count= get_category_count()
    latest = Blogpost.objects.order_by('-publish')[0:4]
    post = get_object_or_404(Blogpost, slug= post)
    form = CommentForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            form.instance.user = request.user
            form.instance.post = post
            form.save()
            return redirect('.')
    context = {'post':post,
    'latest': latest,
    'category_count': category_count,
    'form': form,
    }
    return render(request, 'blog/blogpost.html', context)

**My Templates** 
<div class="post-comments">
                            <header>
                                <h3 class="h6">Post Comments<span class="no-of-comments">
                                    ({{ post.comments.count }})</span></h3>
                            </header>
                            {% for comment in post.get_comments %}
                            <div class="comment">
                                <div class="comment-header d-flex justify-content-between">
                                    <div class="user d-flex align-items-center">
                                        <div class="image">
                                            {% if comment.user.author %}
                                            <img src="{{ comment.user.author.profile_picture.url }}" alt="..."
                                                class="img-fluid rounded-circle">
                                            {% else %}
                                            <img src="" alt="..."
                                                class="img-fluid rounded-circle">
                                            {% endif %}
                                        </div>
                                        <div class="title"><strong>{{ comment.user.username }}</strong><span
                                                class="date">{{ comment.timestamp|timesince }} ago</span></div>
                                    </div>
                                </div>```

标签: djangoformsdjango-modelsdjango-views

解决方案


在您blogpost 看来,尝试手动获取注释并在上下文中传递它们,而不是在模板中调用类方法。模板的目的是展示业务逻辑,而不是编写或定义它。

def blogpost(request, year, month, day, post):
    category_count= get_category_count()
    latest = Blogpost.objects.order_by('-publish')[0:4]
    post = get_object_or_404(Blogpost, slug=post)
    comments = post.comments.all() # here
    form = CommentForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            form.instance.user = request.user
            form.instance.post = post
            form.save()
            return redirect('.')
    context = {'post':post,
    'latest': latest,
    'category_count': category_count,
    'form': form,
    'comments': comments
    }
    return render(request, 'blog/blogpost.html', context)

然后在您的模板中使用:

{% for comment in comments %}
    {{ comment }}
{% endfor %}

推荐阅读