Я пытаюсь просто добиться того, чтобы голосование по сообщению получало +1, если пользователь нажимал кнопку «Нравится» на моем сайте, но по какой-то причине оно считалось не +1, а +2, если я нажимал URL-адрес этого сообщения:
просмотры.py
def post_up_vote (request, pk):
post = get_object_or_404(Post, pk=pk)
try:
if request.method == 'GET':
if post.author == request.user:
messages.error(request, 'You are trying to vote on a Post you created by your own. Thats not possible.')
return redirect('post_detail', pk=post.pk)
if Post_Vote.objects.filter(voter=request.user, voted=post).exists():
messages.error(request, 'You already Voted this Post. Double votes are not allowed.')
return redirect('post_detail', pk=post.pk)
else:
post.up_vote = F('up_vote') + 1
post.save()
Post_Vote.objects.create(voter=request.user, voted=post)
messages.success(request, 'You have successfully Provided an Up-Vote for this Post.')
return redirect('post_detail', pk=post.pk)
else:
messages.error(request, 'Something went wrong, please try again.')
return redirect('post_detail', pk=post.pk)
except:
messages.error(request, 'Something went wrong, please try again.')
return redirect('post_detail', pk=post.pk)
модели.py
class Post(models.Model):
...
up_vote = models.IntegerField(default=0)
down_vote = models.IntegerField(default=0)
...
class Post_Vote(models.Model):
voter = models.ForeignKey(User, on_delete=models.CASCADE)
voted = models.ForeignKey(Post, on_delete=models.CASCADE)
published_date = models.DateField(auto_now_add=True, null=True)
class Meta:
unique_together = ('voter', 'voted')
def publish(self):
self.published_date = timezone.now()
self.save()
urls.py
url(r'^post/(?P<pk>\d+)/up-vote/$', app.post_up_vote, name='post_up_vote'),
шаблон.html
<a href = "{% url 'post_up_vote' pk=post.pk %}"> <i class = "btn success fa fa-thumbs-up"></i></a>
если я создам новый пост на своем сайте и проголосую за этот пост с другим пользователем, а не с исходным автором поста, тогда голосование будет +2, а не +1, и я не вижу причин для этого.
Хорошо, я нашел кое-что глубоко внутри следующей строки объектов: post.up_vote = F('up_vote') + 1 Менеджер недоступен через экземпляры Post
Теперь следующий вопрос, почему его нет в наличии?!
хорошо, может быть, вы можете попробовать post.up_vote += 1
.
Это снова работает. Но почему, до сих пор остается магией для меня. Спасибо, но разве в этом случае post.refresh_from_db() не нужен?
Если вы создадите это как есть, я отмечу это как решенное
Объекты F(), назначенные полям модели, сохраняются после сохранения экземпляра модели и будут применяться при каждом сохранении().
post.up_vote = F('up_vote') + 1
post.save()
post.refresh_from_db()
Все еще считается +2
Если это вызов ajax, убедитесь, что он вызывается только один раз.
Нет, это не вызов AJAX, и я не обращался к этому вопросу раньше ... Мне кажется, что это призрачная магия.
Есть ли какие-либо сигналы для моделей?
можно попробовать post.up_vote += 1
.
Эй, можете ли вы проверить, какое значение
post.up_vote
в началеelse
и послеpost.save()
? Никакого глюка пока найти не удалось.