【问题标题】:show reply button not working fine for comments显示回复按钮不适用于评论
【发布时间】:2021-02-26 13:16:23
【问题描述】:

显示回复按钮应针对不同的 cmets 。当我按下显示回复按钮时,它会打开不属于该评论的不同回复。

  1. views.py
from django.shortcuts import render, HttpResponse, redirect,reverse
from fitness.models import Post, BlogComment
from django.contrib.auth.models import User
from fitness.templatetags import extras

# Create your views here.
def fitness(request):
    everypost=Post.objects.all()
    context={"everypost":everypost}
    return render(request, "fitness/fit.html", context)


def blogfit(request, slug):
    post=Post.objects.filter(slug=slug).first()
    comments= BlogComment.objects.filter(post=post, parent=None)
    replies= BlogComment.objects.filter(post=post).exclude(parent=None)
    replyDict={}
    for reply in replies:
        if reply.parent.sno not in replyDict.keys():
            replyDict[reply.parent.sno]=[reply]
        else:
            replyDict[reply.parent.sno].append(reply)

    context={"post":post, 'comments': comments, 'user': request.user, 'replyDict': replyDict}
    return render(request, "fitness/blogfit.html", context)

def postComment(request):
    if request.method == "POST":
        comment=request.POST.get('comment')
        user=request.user
        postSno =request.POST.get('postSno')
        post= Post.objects.get(sno=postSno)
        parentSno= request.POST.get('parentSno')
        if parentSno=="":
            comment=BlogComment(comment= comment, user=user, post=post)
            comment.save()

        else:
            parent= BlogComment.objects.get(sno=parentSno)
            comment=BlogComment(comment= comment, user=user, post=post , parent=parent)
            comment.save()
    return HttpResponse(reverse('fitness:fitness'))
  1. Models.py
from django.db import models
from ckeditor.fields import RichTextField
from django.contrib.auth.models import User
from django.utils.timezone import now
# Create your models here.

class Post(models.Model):
    sno=models.AutoField(primary_key=True)
    title=models.CharField(max_length=255)
    author=models.CharField(max_length=14)
    slug=models.CharField(max_length=130)
    timeStamp=models.DateTimeField(blank=True)
    content=RichTextField(blank=True, null=True)

    def __str__(self):
        return self.title + " by " + self.author
class BlogComment(models.Model):
    sno= models.AutoField(primary_key=True)
    comment=models.TextField()
    user=models.ForeignKey(User, on_delete=models.CASCADE)
    post=models.ForeignKey(Post, on_delete=models.CASCADE)
    parent=models.ForeignKey('self',on_delete=models.CASCADE, null=True )
    timestamp= models.DateTimeField(default=now)

    def __str__(self):
        return self.comment[0:13] + "..." + "by" + " " + self.user.username
  1. HTML页面

               <h2 class="blog-post-title">{{post.title}}</h2>
                <p class="blog-post-meta">{{post.timeStamp}} by <a href="#">{{post.author}}</a></p>
    
    
           <p>{{post.content|safe}}</p>
    
           <hr>
         </div>
         </div>
      </div>
    
         {% if user.is_authenticated %}
        <form action="{% url 'fitness:postComment' %}" method="post">
            {% csrf_token %}
            <div class="form-group">
                <label for="exampleInputEmail1">Post Comment </label>
                <input type="text" class="form-control" name="comment" placeholder="Enter comment here">
            </div>
            <input type="hidden" name="postSno" value="{{post.sno}}">
            <input type="hidden" name="parentSno" value="">
            <button type="submit" class="btn btn-primary">Submit</button>
        </form>
        {% else %}
        Please login to post a comment
        {% endif %}
    </div>
    {% for comment in comments %}
    <div class="row my-3">
        <div class="col-md-1  ">
            <img class="rounded mx-auto d-block w-100 border border-dark p-2" src="http://i9.photobucket.com/albums/a88/creaticode/avatar_1_zps8e1c80cd.jpg" alt="user">
    
        </div>
        <div class="col-md-11 ">
          <h6 class="comment-name by-author"> {{comment.user.username}} </h6> <span class="badge badge-secondary "></span>
       <b> {{comment.comment}} </b> <span class="badge badge-secondary "></span><br>
       <button class="btn btn-sm btn-primary" type="button" data-toggle="collapse" data-target="#replyBox{{comment.sno}}" aria-expanded="false" aria-controls="replyBox{{comment.sno}}">
           Reply
       </button>
       <button class="btn btn-sm btn-primary" type="button" onClick="myFunction()" id= "show-hide" >
           Show Replies
       </button>
    
    
            <div class="reply mx-0" >
    
    
                <div class="collapse" id="replyBox{{comment.sno}}">
                    <div class="card card-body my-2" >
                        <form action="{% url 'fitness:postComment' %}" method="post">
                            {% csrf_token %}
                            <div class="form-group" >
                                <label for="comment">Post a reply </label>
                                <input type="text" class="form-control" name="comment" placeholder="Enter comment here">
                                <input type="hidden" name="parentSno" value="{{comment.sno}}">
                            </div>
                            <input type="hidden" name="postSno" value="{{post.sno}}">
                            <button type="submit" class="btn btn-primary">Submit</button>
                        </form>
                    </div>
                </div>
    
                <div class="replies bg-danger my-2" id = "replies" >
                {% for reply in replyDict|get_val:comment.sno %}
                <div class="replies">{{reply}}</div>
                <br>
                {% endfor %}
                </div>
            </div>
     </div>
    </div>
    {% endfor %}
    
    <!-- Contenedor Principal -->
    
    <script>
       function myFunction(){
         var x = document.getElementById("replies");
         if(x.style.display === "none"){
           x.style.display = "block";
    
         }
         else{
           x.style.display = "none";
         }
       }
    </script>
    

我认为这是一个逻辑错误。有人可以帮我找出这个错误吗?虽然一切正常,但我的回复按钮无法正常工作。

【问题讨论】:

  • replies= BlogComment.objects.filter(post=post)..这是问题所在..您收到的所有回复都是帖子..不是评论

标签: python django show-hide


【解决方案1】:

更改models.py。在BlogComment 中更新parent(添加related_name

parent=models.ForeignKey('self', on_delete=models.CASCADE, null=True, related_name='replies' )

views.py 中更改您获得comments 的位置

comments= BlogComment.objects.filter(post=post, parent=None).prefetch_related('replies')

您不需要单独查询回复。

html(仅供回复。请根据您的要求更改)

{% for comment in comments %}
      {% for reply in comment.replies.all %}
        {{ reply.comment }}
      {% endfor %}
{% endfor %}

这会奏效。记住related_name=replies

(抱歉,回答不清楚。现在是办公室下班时间,我要走了。祝你好运)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多