【问题标题】:Refresh content in a for loop using jquery in Django在 Django 中使用 jquery 在 for 循环中刷新内容
【发布时间】:2019-05-24 15:05:31
【问题描述】:

我正在创建一个允许用户搜索论文列表的网站。一旦返回论文列表,用户可以对一篇或多篇论文点击“喜欢”或“不喜欢”。当用户点击like按钮时,like count应该动态更新。

我正在使用 jquery 来处理点赞数的动态更新。但是,我不确定如何告诉 ajax 中的 success 函数要更新哪个 id。原因是id 是动态生成的,它取决于哪些论文作为搜索结果返回给用户。

到目前为止,我在模板中有以下内容:

{% for result in results %}
 <li >
{{ result.title}},
<a href="#" class="like_button" data-pid="{{ result.pk }}"> <span class="like_span fa fa-thumbs-up"></span> </a>

 <strong id="like_count_{{ result.pk }}">{{result.likes}} </strong> 
</li> 
{% endfor %}

如您所见,我将希望动态更新发生的部分的 id 指定为"like_count_{{ result.pk }}"。我不确定这是否是最好的方法。

jquery 部分如下所示:

    <script>
        $(document).ready(function(){
          $(".like_button").click(function(){
                $.ajax({
                    type: "GET",
                    data: {'pk': $(this).data('pid'),
                           'liked': $("span").hasClass('fa fa-thumbs-up') },
                    url: "{% url 'search:paperpreference' %}",
                    success: function(response) {
                        var pk  = $(this).data('pid');
                        $(?????).html(response.likes )
                    },
                    error: function(response, error) {
                        alert(error);
                    }
                });
            });
          });
    </script>

简单地说,我不知道如何指定 ?????部分这样,当成功时,新的喜欢计数仅更新到该特定论文,而不是循环中的第一篇论文。

views.py 目前有以下内容:

def paperpreference(request):
   # if request.method == "GET":
    pid = request.GET['pk']
    paper = Paper.objects.get(pk=pid)
    likes = paper.likes + 1
    paper.likes = likes
    paper.save()
    data = {'likes': paper.likes}

    return JsonResponse(data)

我是 Jquery 的新手,任何帮助将不胜感激!

【问题讨论】:

  • $("#like_count_" + pk)?
  • 试过了,但不幸的是这不起作用..
  • 添加console.log(pk) 语句和console.log("#like_count_" + pk)。然后调试您的页面,在您的控制台中,自己键入$("#like_count_2") 以查看结果。或者在你的成功函数中设置一个断点并直接在那里检查你的变量。
  • 感谢您的建议!我在控制台中遇到了这个错误:Uncaught ReferenceError: pk is not defined。显然,pk 值没有通过
  • 抱歉让我澄清一下 - 如果我在成功函数中留下var pk = $(this).data('pid');#like_count_undefined 会打印在控制台中。当我在成功函数中删除var pk = $(this).data('pid'); 时,我得到Uncaught ReferenceError: pk is not defined

标签: javascript jquery ajax django


【解决方案1】:

感谢@dirkgroten 的建议,现在可以通过以下 jquery 函数动态更新点赞数。诀窍是将 pk 声明移到 ajax 之前。

    <script>
        $(document).ready(function(){
          $(".like_button").click(function(){
                var pk = $(this).data('pid')
                $.ajax({
                    type: "GET",
                    data: {'pk': pk,
                           'liked': $("span").hasClass('fa fa-thumbs-up') },
                    url: "{% url 'search:paperpreference' %}",
                    success: function(response) {
                        $("#like_count_"+ pk).html(response.likes )
                    },
                    error: function(response, error) {
                        alert(error);
                    }
                });
            });
          });
    </script>

【讨论】:

    【解决方案2】:

    另一个选项是从服务器返回 id。

    def paperpreference(request):
       # if request.method == "GET":
        pid = request.GET['pk']
        paper = Paper.objects.get(pk=pid)
        likes = paper.likes + 1
        paper.likes = likes
        paper.save()
        data = {'likes': paper.likes,'pid':pid}
    
        return JsonResponse(data)
    
    <script>
            $(document).ready(function(){
              $(".like_button").click(function(){
                    var pk = $(this).data('pid')
                    $.ajax({
                        type: "GET",
                        data: {'pk': pk,
                               'liked': $("span").hasClass('fa fa-thumbs-up') },
                        url: "{% url 'search:paperpreference' %}",
                        success: function(response) {
                            $("#like_count_"+ response.pid).html(response.likes )
                        },
                        error: function(response, error) {
                            alert(error);
                        }
                    });
                });
              });
        </script>
    

    【讨论】:

    • 是的,这是我没想到的一个选项!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2019-02-09
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2017-02-08
    相关资源
    最近更新 更多