Голосование за Django приводит к двойному подсчету

Я пытаюсь просто добиться того, чтобы голосование по сообщению получало +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 в начале else и после post.save()? Никакого глюка пока найти не удалось.

Dharanidhar Reddy 07.04.2019 12:59

Хорошо, я нашел кое-что глубоко внутри следующей строки объектов: post.up_vote = F('up_vote') + 1 Менеджер недоступен через экземпляры Post

user10000033 07.04.2019 14:13

Теперь следующий вопрос, почему его нет в наличии?!

user10000033 07.04.2019 14:14

хорошо, может быть, вы можете попробовать post.up_vote += 1.

Dharanidhar Reddy 07.04.2019 14:14

Это снова работает. Но почему, до сих пор остается магией для меня. Спасибо, но разве в этом случае post.refresh_from_db() не нужен?

user10000033 07.04.2019 14:17

Если вы создадите это как есть, я отмечу это как решенное

user10000033 07.04.2019 14:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
132
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Объекты F(), назначенные полям модели, сохраняются после сохранения экземпляра модели и будут применяться при каждом сохранении().

post.up_vote = F('up_vote') + 1
post.save()
post.refresh_from_db()

Все еще считается +2

user10000033 07.04.2019 13:32

Если это вызов ajax, убедитесь, что он вызывается только один раз.

HariHaraSudhan 07.04.2019 13:36

Нет, это не вызов AJAX, и я не обращался к этому вопросу раньше ... Мне кажется, что это призрачная магия.

user10000033 07.04.2019 13:44

Есть ли какие-либо сигналы для моделей?

HariHaraSudhan 07.04.2019 14:30
Ответ принят как подходящий

можно попробовать post.up_vote += 1.

Другие вопросы по теме