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

2024-09-19 23:39:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个评论系统,并希望实现向上投票/向下投票,类似于SO和reddit。我的问题是,如何准确地检测到我的upvote或downpoistimg上的一次单击,并从django调用函数?或者有别的办法吗?我的代码是:

模板

...

<div class="vote_div">
   <img src="upvote.png" class="upvote" />
   <img src="downvote.png" class="downvote" />
</div>

...

模型.py

^{pr2}$

我想调用视图.py但正如我所说,我不知道该怎么做。我知道不可能从js/jquery调用django函数。有什么想法吗?在


Tags: djangopydivsrcimgsopng系统
1条回答
网友
1楼 · 发布于 2024-09-19 23:39:17

我要回答你的问题,但首先你真的有点做错了。你的组织方式没有一个很好的方法来监控一个人的投票次数。即使人们从来没有刻意地玩这个游戏,也不可避免地会出现让人们多次投票支持某一事物的愚蠢行为。在

理想情况下,设置第二个类似的表(假设您只轮询登录的用户):

class Vote(models.Model):
    user = models.ForeignKey("User")
    comment = models.ForeignKey("Comments")
    score = models.IntegerField(default=0)

然后您将有一个按钮来提交一个简单的单字段表单视图,其中包含+1或-1。“分数”可以是一个简单的总和,或者你可以计算正数和负数来得到有多少赞成票或反对票。在

如果这是一个有意义的应用程序,那么您应该使用restapi(我喜欢Tastypie),但是还有其他的应用程序。让第一个API运行起来有点费劲,但也不算太糟,而且值得投资,除非你的应用程序非常简单。在

所以最后。。。这是一个非常简单的黑客/傻瓜式的方法。您不需要表单,只需使用generic View

将此添加到网址.py有一个像普通的url,注释_id为kwarg

^{pr2}$

在视图.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>

相关问题 更多 >