如何在不使用表单的情况下从模板调用django方法?

时间:2017-01-18 02:02:02

标签: javascript jquery python django django-templates

我正在建立一个评论系统并希望实现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函数。有什么想法吗?

1 个答案:

答案 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>