Метод удаления поля Django m2m не работает - PullRequest
0 голосов
/ 31 августа 2018

У меня есть модель:

class Vote(models.Model):
    text = models.CharField(max_length=300)
    voters = models.ManyToManyField(CustomUser, blank=True, related_name="voters")
    voters_voted = models.ManyToManyField(CustomUser, blank=True, related_name="voted")
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    in_favour = models.PositiveIntegerField(default=0)
    against = models.PositiveIntegerField(default=0)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        queryset = self.game.players
        for player in queryset:
            self.voters.add(player)

И форма голосования, которая имеет следующий метод form_valid:

def form_valid(self, form):
        game = Game.objects.get(id=foo)
        vote = Vote.objects.get(id=bar)
        if form.cleaned_data['choice'] == 'Y':
            vote.in_favour += 1
        else form.cleaned_data['choice'] == 'N':
            vote.against += 1

        vote.voters.remove(self.request.user) #This line doesn't work
        vote.voters_voted.add(self.request.user)
        vote.save()
        return super().form_valid(form)

Цель этого состоит в том, чтобы отследить, за кого проголосовали пользователи, кто имеет право голосовать и каково голосование (за / против).

Все в этом коде работает отлично, за исключением строки, которая удаляет пользователей из группы избирателей при отправке формы (vote.voters.remove(self.request.user)). Следующая строка, добавляющая пользователя в группу, за которую проголосовали (vote.voters_voted.add(self.request.user)), работает отлично.

Я пытался поместить вторую vote.save() между этими двумя строками, но это не имело никакого значения. Я не понимаю, почему вторая строка работает, а первая нет!

1 Ответ

0 голосов
/ 31 августа 2018

Сохраните объект перед удалением user.

Решение

vote.save() # call this first, because it adds the game players which could include the user you are removing
vote.voters.remove(self.request.user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...