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

Javascript 如何在不使用表单的情况下从模板调用django方法?,javascript,jquery,python,django,django-templates,Javascript,Jquery,Python,Django,Django Templates,我正在构建一个评论系统,并希望实现向上投票/向下投票,类似于SO和reddit。我的问题是,我如何准确地检测到点击我的向上投票或向下投票img,并从django调用函数?还是有别的办法?这是我的密码: 模板 ... <div class="vote_div"> <img src="upvote.png" class="upvote" /> <img src="downvote.png" class="downvote" /> </div&g

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

模板

...

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

...

我想在我的views.py中调用一个函数来处理投票,但正如我所说的,我不知道怎么做。正如我所知,从js/jquery调用django函数是不可能的。有什么想法吗?

我会回答你的问题,但首先你在这方面确实有点做错了。按照你的组织方式,没有一个好办法来监控一个人的投票次数。即使人们从来没有故意玩过这个游戏,也不可避免地会有一些愚蠢的行为导致人们多次投票支持某件事

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

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

如果这是一个有意义的应用程序,你应该使用RESTAPI(我喜欢,但还有其他的)。下载第一个API有点费劲,但也不算太糟糕,值得投资,除非你的应用程序非常简单

所以最后。。。这是一个非常简单的方法。你不需要表格,只要使用

将其添加到url.py,url与普通url类似,注释id为kwarg

url(r'^vote/(?P<comment_id>\d+)/$', BoneheadView.as_view(), name='comments-vote'),
最后,在您的页面上: 修订的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>

(将此项放在页面的
前面)


$(“.vote”)。单击(函数(){
var element=$(this);//获取触发事件的对象
$.post(element.attr('href'),{score:element.data('score')});
返回false;
})

谢谢,我没有考虑将
img
嵌套在
a
标签中,这样应该可以工作。至于模型,我对ForeignKey不太熟悉,但我查阅了文档,找不到
ForeignKeyField
。你是想写ForeignKey还是另一种语法?还有,RESTAPI做了什么我还不能做的事情?或者说它让什么更容易呢?它是外键。。。当您从内存编写代码而没有代码检查器时,就会发生这种情况。如果您只是在做一两件像这样的小事,RESTAPI可能有点过头了,但是养成做“正确的事情”的习惯是个好主意。RESTAPI使您能够构建更多的功能,并且更加结构化和标准化。您在混合javascript/django应用程序中构建的功能越多,您就越喜欢在两者之间使用标准化的数据交换方式。
url(r'^vote/(?P<comment_id>\d+)/$', BoneheadView.as_view(), name='comments-vote'),
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)
<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>
<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>