Я создаю веб-приложение Django 1.8.4 для отправки ссылок с функциями голосования за и против. Но каждый раз, когда я нажимаю кнопку голосования, она применяется к последней отправленной ссылке. Я использую формы для этого. Форма вполне нормальная:
class VoteForm(forms.ModelForm):
class Meta:
model = Vote
exclude = ("vote_type", "vote_date",)
вот модель:
class Link(models.Model):
title = models.CharField(max_length=200)
...
up_votes = models.IntegerField(default=0, blank=True, db_index=True)
down_votes = models.IntegerField(default=0, blank=True, db_index=True)
...
class Vote(models.Model):
UP, DOWN = range(2)
TYPE_CHOICES = [(UP, "Upvote"), (DOWN, "DownVote")]
voter = models.ForeignKey(User)
link = models.ForeignKey(Link, related_name='votes')
vote_type = models.IntegerField(choices=TYPE_CHOICES, db_index=True, null=True)
vote_date = models.DateTimeField(db_index=True, auto_now=True)
и представление обрабатывает голосование: (это все еще так просто и глупо, я думаю)
class VoteFormView(FormView):
form_class = VoteForm
def form_valid(self, form):
link = get_object_or_404(Link, pk=form.data["link"])
user = self.request.user
prev_votes = Vote.objects.filter(voter=user, link=link)
has_voted = (prev_votes.count()>0)
if not has_voted:
Vote.objects.get_or_create(voter=user, link=link)
Link.objects.filter(pk=form.data["link"]).update(up_votes=F('up_votes')+1)
print("+voted")
else:
pass
return redirect("home")
Идея здесь заключалась в том, чтобы проверить, проголосовал ли текущий пользователь за ссылку, если нет, то увеличить поле up_votes соответствующего объекта ссылки. Но теперь он увеличивает только последний link.object.up_votes.
print link
, и он печатает один и тот же link.title независимо от того, какую кнопку голосования я нажимаю. hoc я могу исправить это сейчас? Я имею в виду, как я могу отправить правильный pk в представление? - person sheshkovsky   schedule 02.10.2015