когда пользователю нравится сообщение, Мой код предполагает, что этому пользователю понравилось каждое сообщение для этой группы, необходимо исправить это - PullRequest
0 голосов
/ 10 мая 2018

В моем приложении посты принадлежат группам, и посты могут понравиться. это модель для постов:

from django.db import models
from django.contrib.auth.models import User
from groups.models import Group


class Post(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    likes_total = models.IntegerField(default=0)
    likers = models.ManyToManyField(User, related_name='likers')
    pub_date = models.DateTimeField()
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name= 'author')
    group = models.ForeignKey(Group, on_delete=models.CASCADE)


    def __str__(self):
        return self.title

    def summary(self):
        # return the 1st 100 chars
        return self.body[:100]

    def pub_date_pretty(self):
        # strftime is how to break down time
        return self.pub_date.strftime('%b %e %Y')

когда кому-то нравится сообщение, этот пользователь добавляется в отношения M2M "likers". Вот мнение, которое заботится об этом:

def like(request, post_id, group_id):
    group = get_object_or_404(Group, pk= group_id)
    post =  get_object_or_404(Post, pk= post_id)
    posts = Post.objects.filter(group__id = group_id)

if request.method == 'POST':
    if request.user in post.likers.all():
        return render(request, 'groups/detail.html', {'group':group, 'posts':posts} )
    else:
        post.likes_total += 1
        # with add, we are adding a liker to the likers relation, between a user and a post
        post.likers.add(request.user)
        post.save()
        return redirect('/groups/' + str(group_id) )
else:
    return render(request, 'groups/detail.html', {'group':group})

URL для просмотра лайков здесь:

from . import views
from django.urls import path


app_name = 'posts'

urlpatterns = [
    path('create/<int:group_id>/', views.create, name='create'),
    path('edit/<int:group_id>/<int:post_id>/', views.edit, name='edit'),
    path('delete/<int:group_id>/<int:post_id>/', views.delete, name='delete'),
    path('like/<int:group_id>/<int:post_id>/', views.like, name='like'),
]

URL для группы здесь:

from . import views
from django.urls import path, include


app_name = 'groups'
urlpatterns = [
    path('create/', views.create, name='create'),
    path('index/', views.index, name='index'),
    path('<int:group_id>/', views.detail, name='detail'),
    path('<int:group_id>/join/', views.join, name='join'),
    path('<int:group_id>/leave/', views.leave, name='leave'),

]

когда я вызываю функцию, мне кажется, что я передаю тот же post.id аналогичной функции, хотя это кажется правильным в моем шаблоне. вот шаблон:

{% for single_post in posts %}
    <div class="container">
        <div class="row">
            <div class="[ col-xs-12 col-sm-offset-1 col-sm-5 ]" style="margin:0 auto;">
                <div class="[ panel panel-default ] panel-google-plus">
                    <div class="panel-heading">
                        <img class="[ img-circle pull-left ]" src="https://lh3.googleusercontent.com/-CxXg7_7ylq4/AAAAAAAAAAI/AAAAAAAAAQ8/LhCIKQC5Aq4/s46-c-k-no/photo.jpg" alt="Mouse0270" />
                        <h3>{{single_post.author}}</h3>
                        <h5><span>Shared publicly</span> - <span>{{single_post.pub_date_pretty}}</span> </h5>
                    </div>
                    <div class="panel-body">
                        <b>{{single_post.title}}</b><br>
                        {{single_post.body}}
                    </div>
                    <div class="panel-footer">


                        <button type="button" name="button"><a href="{% url 'posts:edit' group.id single_post.id %}">Edit</a></button>
                        <button type="button" name="button"><a href="{% url 'posts:delete' group.id single_post.id %}">Delete</a></button>
                        <button type="button" name="button"><a href="{% url 'comments:create' single_post.id %}">Comment</a></button>
                        <br>


                        <div class="comments" style="text-align:center;text-decoration:underline;">
                          Comments
                          {{single_post.likers.all}}
                        </div>

                    </div>

                    <a href="javascript:{document.getElementById('like').submit()}"><button class="[ btn btn-default ]"> Like ({{single_post.likes_total}})</button></a>

                    <form method ='POST' id= 'like' action="{% url 'posts:like' group.id single_post.id %}" >
                      {% csrf_token %}
                      <input type="hidden" >
                    </form>


                    {% for comment in post.comment_set.all %}
                      <div class="row" >
                        <div class="col-sm-5" >
                          <div class="panel panel-default" style="width:31.7em;margin-bottom:0;">
                            <div class="panel-heading">
                              <strong> <a href="#">{{comment.author}}</a> </strong> <span class="text-muted">made on {{comment.pub_date_pretty}}</span>
                            </div>
                            <div class="panel-body">
                              {{comment.body}}<br>
                               <a href="{% url 'comments:delete' group.id post.id comment.id %}">Delete</a>
                            </div><!-- /panel-body -->
                          </div><!-- /panel panel-default -->
                        </div><!-- /col-sm-5 -->
                      </div><!-- /row -->
                    {%endfor%}

                  </div>
            </div>
  {% endfor %}

когда я нажимаю кнопку «Мне нравится», в URL-адресе всегда отображается один и тот же post.id (post.id первого сообщения), поэтому я каждый раз как-то передаю один и тот же идентификатор сообщения. Сначала я думал, что это потому, что у меня есть две переменные с именем post: одна инициирована в представлении, другая была переменной в цикле for в моем шаблоне, который я назвал 'post', но теперь я изменил его на 'single_post' и проблема сохраняется.

С другой стороны, проблема может заключаться в том, что я проверяю, понравился ли пользователь посту в режиме «лайк».

любая помощь будет очень признательна!

...