Я пытаюсь отфильтровать объект комментария поста, но я продолжаю получать все комментарии, как мне передать каждый отдельный комментарий этому пользователю?

#django #django-models #django-rest-framework #django-templates

Вопрос:

Вот мой список сообщений, в котором я хочу, чтобы комментарий каждого пользователя был назначен их сообщению, но у меня возникла проблема с тем, как получить комментарий каждого пользователя, вместо этого я получаю все комментарии в одном сообщении пользователя?

 def post_listview(request,*args,**kwargs):
    context =  {}
    cart = Cart(request)
    user_id = kwargs.get("user_id")
    user = request.user
    post_comment = Comment.objects.filter()

    if request.method == 'POST':
        form = NewCommentForm(request.POST)
        if form.is_valid():
            data = form.save(commit=False)
            data.post = post
            data.username = user
            data.save()
            return redirect('feed', pk=user_id)
    else:
        form = NewCommentForm()
    for user in Post.objects.all():
            if request.user.is_authenticated:
                friend_list = FriendList.objects.get(user=request.user )
                friends = friend_list.friends.all()

                context['friends'] = friends
    

    context['posts'] = Post.objects.all()
    context['cart'] = cart
    context['post_comment'] = post_comment
    

    return render(request,'feed/feed.html',context)

 

Вот мой URL — адрес для просмотра списка сообщений!

 path('', views.post_listview, name="feed"),

 

Это тег шаблона, который я использую в своем шаблоне для отображения комментариев

 {% for comment in post_comment %}

{{ comment.body }}

{% endfor %} But it shows all the comment in one post, 
which is not the desire result i want, how best do i got about this ?
 

Моя почтовая модель

 class Post(models.Model):
    description = models.CharField(max_length=5000, blank=True)
    pic = models.ImageField(upload_to='path/post/img' ,blank=True)
    date_posted = models.DateTimeField(auto_now_add=True)
    user_name = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    users = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name="users") 
    tags = models.CharField(max_length=100, blank=True)
    

    @property
    def pic_url(self):
        if self.pic and hasattr(self.pic, 'url'):
            return self.pic.url

    

    def __str__(self):
        return self.description

    def get_absolute_url(self):
        return reverse('feed', kwargs={'pk': self.pk})

    def get_date_posted(self):
        time = datetime.now()
        if self.date_posted.day == time.day:
            return str(time.hour - self.date_posted.hour)   " hrs"
        else:
            if self.date_posted.month == time.month:
                return str(time.day - self.date_posted.day)   "d"
            else:
                if self.date_posted.year == time.year:
                    return str(time.month - self.date_posted.month)   " months ago"
        return self.date_posted
 

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
    username = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='comments', on_delete=models.CASCADE)
    body = models.CharField(max_length=5000)
    comment_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.body

class Like(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='likes', on_delete=models.CASCADE)
    post = models.ForeignKey(Post, related_name='likes', on_delete=models.CASCADE)
    like_date  = models.DateTimeField(auto_now=True)
 

Это мой шаблон, которым я хочу, чтобы были комментарии.

   {% for post in posts %}
              <div class="card lg:mx-0 uk-animation-slide-bottom-small">
      
                  <!-- post header-->
                  <div class="flex justify-between items-center lg:p-4 p-2.5">
                      <div class="flex flex-1 items-center space-x-4">
                          <a href="#">
                              <img src="{{post.user_name.profile_pic.url}}" class="bg-gray-200 border border-white rounded-full w-10 h-10">
                          </a>
                          <div class="flex-1 font-semibold capitalize">
                              <a href="#" class="text-black dark:text-gray-100"> {{ post.user_name.get_full_name }} </a>
                              <div class="text-gray-700 flex items-center space-x-2">  <span> {{ post.date_posted|timesince }}  </span> <ion-icon name="people"></ion-icon></div>
                          </div>
                      </div>
                    <div>
                      <a href="{% url 'feed:post-detail' post.id %}"> <i class="icon-feather-more-horizontal text-2xl hover:bg-gray-200 rounded-full p-2 transition -mr-1 dark:hover:bg-gray-700"></i> </a>
                      <div class="bg-white w-56 shadow-md mx-auto p-2 mt-12 rounded-md text-gray-500 hidden text-base border border-gray-100 dark:bg-gray-900 dark:text-gray-100 dark:border-gray-700" 
                      uk-drop="mode: click;pos: bottom-right;animation: uk-animation-slide-bottom-small">
                    
                          <ul class="space-y-1">
                            <li> 
                                <a href="#" class="flex items-center px-3 py-2 hover:bg-gray-200 hover:text-gray-800 rounded-md dark:hover:bg-gray-800">
                                 <i class="uil-share-alt mr-1"></i> Share
                                </a> 
                            </li>
                            <li> 
                                <a href="#" class="flex items-center px-3 py-2 hover:bg-gray-200 hover:text-gray-800 rounded-md dark:hover:bg-gray-800">
                                 <i class="uil-edit-alt mr-1"></i>  Edit Post 
                                </a> 
                            </li>
                            <li> 
                                <a href="#" class="flex items-center px-3 py-2 hover:bg-gray-200 hover:text-gray-800 rounded-md dark:hover:bg-gray-800">
                                 <i class="uil-comment-slash mr-1"></i>   Disable comments
                                </a> 
                            </li> 
                            <li> 
                                <a href="#" class="flex items-center px-3 py-2 hover:bg-gray-200 hover:text-gray-800 rounded-md dark:hover:bg-gray-800">
                                 <i class="uil-favorite mr-1"></i>  Add favorites 
                                </a> 
                            </li>
                            <li>
                              <hr class="-mx-2 my-2 dark:border-gray-800">
                            </li>
                            <li> 
                                <a href="#" class="flex items-center px-3 py-2 text-red-500 hover:bg-red-100 hover:text-red-500 rounded-md dark:hover:bg-red-600">
                                 <i class="uil-trash-alt mr-1"></i>  Delete
                                </a> 
                            </li>
                          </ul>
                      
                      </div>
                    </div>
                  </div>
                  <div class="p-3 border-b dark:border-gray-700">
                    {{ post.description }}
                   </div>
                  <div uk-lightbox>
                      <div class="grid grid-cols-2 gap-2 p-2">
      
                          <a href="{{ post.pic_url }}" class="col-span-2">  
                              <img src="{{ post.pic_url }}" alt="" class="rounded-md w-full lg:h-76 object-cover">
                          </a>
                         
                         
                      </div>
                  </div>
      
                  <div class="p-4 space-y-3"> 
                     
                      <div class="flex space-x-4 lg:font-bold">
                          <a href="{% url 'feed:post-like' %}"  id="likebtn{{ post.id }}" class="flex items-center space-x-2">
                              <div class="p-2 rounded-full  text-black lg:bg-gray-100 dark:bg-gray-600">
                                  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="22" height="22" class="dark:text-gray-100">
                                      <path d="M2 10.5a1.5 1.5 0 113 0v6a1.5 1.5 0 01-3 0v-6zM6 10.333v5.43a2 2 0 001.106 1.79l.05.025A4 4 0 008.943 18h5.416a2 2 0 001.962-1.608l1.2-6A2 2 0 0015.56 8H12V4a2 2 0 00-2-2 1 1 0 00-1 1v.667a4 4 0 01-.8 2.4L6.8 7.933a4 4 0 00-.8 2.4z" />
                                  </svg>
                              </div>
                              <div> Like</div>
                          </a>
                          <a href="#" class="flex items-center space-x-2">
                              <div class="p-2 rounded-full  text-black lg:bg-gray-100 dark:bg-gray-600">
                                  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="22" height="22" class="dark:text-gray-100">
                                      <path fill-rule="evenodd" d="M18 5v8a2 2 0 01-2 2h-5l-5 4v-4H4a2 2 0 01-2-2V5a2 2 0 012-2h12a2 2 0 012 2zM7 8H5v2h2V8zm2 0h2v2H9V8zm6 0h-2v2h2V8z" clip-rule="evenodd" />
                                  </svg>
                              </div>
                              <div> Comment</div>
                          </a>
                          <a href="#" class="flex items-center space-x-2 flex-1 justify-end">
                              <div class="p-2 rounded-full  text-black lg:bg-gray-100 dark:bg-gray-600">
                                  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="22" height="22" class="dark:text-gray-100">
                                      <path d="M15 8a3 3 0 10-2.977-2.63l-4.94 2.47a3 3 0 100 4.319l4.94 2.47a3 3 0 10.895-1.789l-4.94-2.47a3.027 3.027 0 000-.74l4.94-2.47C13.456 7.68 14.19 8 15 8z" />
                                  </svg>
                              </div>
                              <div> Share</div>
                          </a>
                      </div>
                      <div class="flex items-center space-x-3 pt-2"> 
                          <div class="flex items-center">
                              <img src="{{user.profile_pic.url}}" alt="" class="w-6 h-6 rounded-full border-2 border-white dark:border-gray-900">
            
                          </div>
                          <div class="dark:text-gray-100">
                              Liked <strong> Johnson</strong> and <strong> 12 Others </strong>
                          </div>
                      </div>
      
                      <div class="border-t py-4 space-y-4 dark:border-gray-600">
                          <div class="flex">
                              <div class="w-10 h-10 rounded-full relative flex-shrink-0">
                                  <img src="{{user.profile_pic.url}}" alt="" class="absolute h-full rounded-full w-full">
                              </div>
                              <div>
                                  <div class="text-gray-700 py-2 px-3 rounded-md bg-gray-100 relative lg:ml-5 ml-2 lg:mr-12 dark:bg-gray-800 dark:text-gray-100">
                                      {% for comment in posts.username.comments.all %}
                                      <p class="leading-6">{{ comment.body }} <urna class="i uil-heart"></urna>
                                         <i class="uil-grin-tongue-wink"> </i>
                                         </p>
                                        {% endfor %}
                                      <div class="absolute w-3 h-3 top-3 -left-1 bg-gray-100 transform rotate-45 dark:bg-gray-800"></div>
                                  </div>
                                  <div class="text-sm flex items-center space-x-3 mt-2 ml-5">
                                      <a href="#" class="text-red-600"> <i class="uil-heart"></i> Love </a>
                                      <a href="#"> Replay </a>
                                      <span> 3d </span>
                                  </div>
                              </div>
                          </div>
                         
                      </div>
                      
                      <a href="#" class="hover:text-blue-600 hover:underline">  Veiw 8 more Comments </a>
      
                      <div class="bg-gray-100 rounded-full relative dark:bg-gray-800 border-t">
                          <input placeholder="Add your Comment.." class="bg-transparent max-h-10 shadow-none px-5">
                          <div class="-m-0.5 absolute bottom-0 flex items-center right-3 text-xl">
                              <a href="#">
                                  <ion-icon name="happy-outline" class="hover:bg-gray-200 p-1.5 rounded-full"></ion-icon>
                              </a>
                              <a href="#">
                                  <ion-icon name="image-outline" class="hover:bg-gray-200 p-1.5 rounded-full"></ion-icon>
                              </a>
                              <a href="#">
                                  <ion-icon name="link-outline" class="hover:bg-gray-200 p-1.5 rounded-full"></ion-icon>
                              </a> 
                          </div>
                      </div>
      
                  </div>
      
              </div> 
              {% endfor %}
 

Комментарии:

1. Поделитесь своей моделью комментариев.

2. Я только что поделился своей моделью @WillemVanOnsem.

Ответ №1:

Вы получаете доступ к Comment s, связанным с a Post , с помощью:

 {% for comment in post.comments.all %}
    {{ comment.body }}
{% endfor %} 

Вы можете эффективно извлекать связанные комментарии с помощью одного дополнительного запроса (а не одного запроса на Post ), с:

 context['posts'] = Post.objects.prefetch_related('comments') 

Комментарии:

1. Ну, я просто сделал то, что предлагало ваше решение, но оно вернуло пустой объект. комментарии не отображаются в соответствующем сообщении.

2. @AbubakariUmarblacKrussainUma: тогда для этого поста нет комментария, ссылающегося на данный пост. my_post конечно, следует переименовать в ту переменную, которую вы используете для Post объекта, который вы визуализируете.

3. @AbubakariUmarblacKrussainUma: если вы таким образом использовали {% for post in posts %}...{% endfor %} , то вы используете {% for comment in post.comments.all %} ... {% endfor %} (не my_post ).

4. я сделал именно это, все еще получая пустой комментарий к сообщению! но если сделать что-то подобное ( post_comment = Comment.objects.filter ()), то контекст[‘post_comment’] = post_comment, я получаю все комментарии, но тогда они не связаны с каждым сообщением. Поэтому мне интересно, откуда берется эта проблема ?

5.@AbubakariUmarblacKrussainUma: вы уверены, что в сообщении, которое вы показываете, есть соответствующие комментарии, поэтому Comment post указывайте на Post то, что вы визуализируете?

Ответ №2:

 {% for comment in posts.comments.all %}

{{ comment.body }}

{% endfor %}
 

Комментарии:

1. Спасибо, что дали ответ. Не могли бы вы, пожалуйста, отредактировать свой ответ, чтобы включить объяснение вашего кода? Это поможет будущим читателям лучше понять, что происходит, и особенно тем членам сообщества, которые новички в языке и изо всех сил пытаются понять концепции.