【发布时间】:2015-12-30 18:50:55
【问题描述】:
我正在创建一个 Django 1.8.4 Web 应用程序来提交具有赞成票和反对票功能的链接。但是每次我点击赞成投票按钮时,它都会应用于最后提交的链接。我正在使用表格来做到这一点。形式很正常:
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。
【问题讨论】:
-
form.data["link"] 是否带有正确的 pk ?
-
您似乎没有将表单绑定到特定链接。
-
正是这个问题。我添加了
print link,无论我点击哪个投票按钮,它都会打印相同的link.title。我现在可以解决这个问题吗?我的意思是如何将正确的 pk 发送到视图? -
真是个愚蠢的问题!我忘了在我的模板中关闭
标签: django python-2.7 django-forms django-views django-database