В моем приложении посты принадлежат группам, и посты могут понравиться. это модель для постов:
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' и проблема сохраняется.
С другой стороны, проблема может заключаться в том, что я проверяю, понравился ли пользователь посту в режиме «лайк».
любая помощь будет очень признательна!