我正在建立一个评论系统并希望实现upvoting / downvoting,类似于SO和reddit。我的问题是,我怎样才能检测到我的upvote或downvote img
上的点击并从django调用一个函数?还是有另一种方式来解决这个问题吗?这是我的代码:
模板
...
<div class="vote_div">
<img src="upvote.png" class="upvote" />
<img src="downvote.png" class="downvote" />
</div>
...
models.py
class Comments(models.Model):
...
#score
upvotes = models.IntegerField(default=0)
downvotes = models.IntegerField(default=0)
我想在我的views.py中调用一个函数来处理投票,但正如我所说,我不知道该怎么做。因为我知道不可能从js / jquery调用django函数。有什么想法吗?
答案 0 :(得分:2)
我将回答你的问题,但首先你真的要对此有点不对劲。你的结构方式并不是一个很好的方法来监管一个人投票的次数。即使人们从不刻意游戏,也会有不可避免的蠢事让人们多次投票。
理想情况下,设置这样的第二个表(假设您仅轮询登录用户):
class Vote(models.Model):
user = models.ForeignKey("User")
comment = models.ForeignKey("Comments")
score = models.IntegerField(default=0)
然后你会有一个按钮,用+1或-1提交一个简单的一个字段表格视图。 “得分”将是一个简单的总和,或者您可以计算正值和负值,以获得有多少赞成票或票数的值。
如果这是一个有意义的应用,你应该使用REST api(我喜欢Tastypie,但还有其他的)。第一个API下降是一个小问题,但不是太糟糕,除非你的应用程序很简单,否则值得投资。
所以最后......死的简单黑客/傻瓜方式来做到这一点。您不需要表单,只需使用generic View
即可将此添加到urls.py,其中包含一个像normal一样的url,其中comment_id为kwarg
url(r'^vote/(?P<comment_id>\d+)/$', BoneheadView.as_view(), name='comments-vote'),
在views.py中:
class BoneheadView(View):
def post(self, comment_id):
if "vote" in self.request.POST:
vote = int(self.request.POST["vote"])
if vote_score in (-1, 0, 1):
# Do something to save your vote here like:
(vote,created) = Vote.objects.get_or_create(comment_id=comment_id)
vote.score = vote_score
vate.save()
return HttpResponse("Yay, a Vote")
else:
return HttpResponse("Invalid Vote", status=400)
else:
return HttpResponse("Invalid Vote", status=400)
最后,在您的页面上: 修订HTML
<div class="vote_div">
<a href="{% url 'comments-vote' comment.id %}" data-score="1" class="vote"><img src="upvote.png" /></a>
<a href="{% url 'comments-vote' comment.id %}" data-score="-1" class="vote"><img src="downvote.png" /></a>
</div>
(在页面</body>
之前将其放在正确的位置)
<script>
$(".vote").click(function() {
var element = $(this); // grab the object that triggered the event
$.post(element.attr('href'), { score: element.data('score')});
return false;
})
</script>