【问题标题】:How to call a django method from template without using a form?如何在不使用表单的情况下从模板调用 django 方法?
【发布时间】:2017-06-02 06:54:34
【问题描述】:

我正在构建一个评论系统,并希望实现 upvoting/downvoting,类似于 SO 和 reddit。我的问题是,我如何才能准确地检测到点击我的赞成或反对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 函数。有什么想法吗?

【问题讨论】:

    标签: javascript jquery python django django-templates


    【解决方案1】:

    我会回答你的问题,但首先你真的有点不对劲。您构建此结构的方式没有一个很好的方法来监督一个人投票的次数。即使人们从不故意玩弄这个,也不可避免地会出现导致人们多次投票给某件事的错误。

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

    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 中,使用正常的 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>
    

    (在你的页面上把这个放在&lt;/body&gt;之前)

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

    【讨论】:

    • 谢谢,我没有考虑将img 嵌套在a 标记中,这样应该可以工作。至于模型,我对 ForeignKey 不太熟悉,但我查阅了文档,但找不到 ForeignKeyField。您是要编写 ForeignKey 还是另一种语法?还有什么是 REST API 做的我还不能做的?或者它具体使什么变得更容易?
    • 这是外键...当您从内存编码并且没有代码检查器时会发生这种情况。如果您只是在做这样一两件小事,那么 REST API 可能有点矫枉过正,但养成做“正确的事”的习惯是个好主意。 REST API 可让您构建更多功能,并且更加结构化和标准化。您在混合 javascript/django 应用程序中构建的功能越多,您就越会欣赏在两者之间交换数据的标准化方式。
    猜你喜欢
    • 2019-12-07
    • 2012-03-04
    • 1970-01-01
    • 2016-11-16
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多