【问题标题】:Ajax / jQuery Django refresh class of elementsAjax/jQuery Django 刷新类元素
【发布时间】:2020-01-29 22:43:23
【问题描述】:

我无法想出更合适的标题,但我的问题如下:

我会生成一个帖子列表,其中包含喜欢和不喜欢它们的选项,具体取决于它们是否已经被喜欢。

{% for post in posts %}
        <hr>
        <strong>{{ post.owner }}</strong> </br>
        {{ post.content }} </br>
        <i>{{ post.post_date }}</i> </br>
        <form action="{% url 'like' %}" method="post" class="likeform">
            {% csrf_token %}
            <input type="hidden" id="post_id" value="{{ post.id }}">
            {% if post.id not in liked_posts_ids %}
                <button type="submit" >Like</button>
            {% else %}
                <button type="submit" >Dislike</button>

            {% endif %}
        </form>
    {% endfor %}

现在,就像所有使用此类内容的网站一样,我不想在每次有人点击喜欢/不喜欢按钮时刷新整个网站。

我当前的 JS 如下所示:

 $(document).on('submit','.likeform',function(e){
        e.preventDefault();

        $.ajax({
            type:'POST',
            url:'{% url 'like' %}',
            data:{
                post_id: $('#post_id').val(),
                    csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
                },
        success:function(){
            $(".likeform").load(" .likeform > *");
        }
    });

POST 请求工作正常,但 success:function()part 不能。它刷新所有按钮,这不是很好,但它也将所有按钮置于所有形式中。目前我的数据库中有 6 个帖子,在 $(".likeform").load(" .likeform &gt; *"); 完成后,每个帖子下都有 6 个喜欢/不喜欢按钮。

如何只刷新按钮的正确实例,同时保留在 for 循环中生成的按钮? 有没有办法利用#post_id来识别相关按钮?

【问题讨论】:

  • 您可以在success 回调中发回post_id 并使用它来选择正确的输入元素。
  • 感谢您的快速回复!您可能会说,我对 JS/JQ/AJAX 很陌生 - 这是如何完成的?
  • 您打算用 CSS 显示和隐藏按钮,还是从 HTML 中完全删除和替换按钮?
  • 我的想法基本上是通过对后端的新请求来刷新它们(在views.py中,生成了跟随的post_ids列表并将其传递给模板,其中按钮文本根据此列表确定. 我不确定这是否可能,因为它基本上必须重新渲染整个模板才能工作,还是我错过了什么?
  • 不,你做得很好。幸运的是,您不必重新渲染所有内容。作为来自服务器的响应,您可以发送应该替换旧按钮的按钮的 HTML。如果您能够修改响应以在字符串上发送按钮,例如:"&lt;button type="submit" &gt;Dislike&lt;/button&gt;",那么这将非常容易。甚至只是LikeDislike 的文本也可以。

标签: javascript python jquery django ajax


【解决方案1】:

由于您说您的页面上有多个这样的表单,请丢失input 上的id 属性并将其更改为name 属性。

<input type="hidden" name="post_id" value="{{ post.id }}">

id 必须是唯一的,如果出现多次则无效。而name 属性是输入元素的更好标识符。

在您的$.ajax 函数中,您需要从您提交的当前表单中获取值。在该表单中,您要选择所需的所有元素。

现在对于请求,您需要做一些不同的事情。该请求应该转到服务器上的一个函数,该函数使用我们发送的 id 更新这篇文章的值,如果它被喜欢或不喜欢。没有进一步的了。然后,它应该作为响应发送一个文本字符串,这将是提交按钮的新文本值。

在您的success 处理程序中,您需要将接收到的文本字符串设置为提交表单中的按钮。所以当你点击Like时,服务器会发送请求,帖子会在服务器上被点赞,服务器会发回Dislike,也就是现在按钮上的文字。当点击不喜欢它应该做同样的事情,不喜欢帖子并返回Like字符串。

$(document).on('submit', '.likeform', function(e) {
  e.preventDefault();

  // Get the currently submitted form and find the inputs
  // inside the form necessary to send the data with.
  var $form = $(this); 
  var $postId = $form.find('input[name="post_id"]');
  var $csrf = $form.find('input[name="csrfmiddlewaretoken"]');
  var $button = $form.find('button');

  $.ajax({
    type: 'POST',
    url: '{% url 'like' %}',
    dataType: 'text',
    data: {
      post_id: $postId.val(),
      csrfmiddlewaretoken: $csrf.val()
    },
    success: function(response) {

      // Replace the current text of the button with a new
      // text based on if it was liked or disliked.
      $button.text(response);

    }
  });

});

【讨论】:

  • 好的,到目前为止,我可以关注您,但是要设置buttonText,必须如何响应?我可以在我的功能上使用return 'Like'吗? liked_post.save() return 'Dislike' 喜欢吗?进一步解释:/like/是接收ajax POST的端点,我的views.py中的函数应该只返回一个字符串还是我该怎么做?
  • 响应应该是"Like""Dislike",具体取决于您发送的带有post_id 的帖子现在是否被喜欢。如果喜欢,请发送不喜欢。如果是不喜欢的发送喜欢。这就像一个开关。
  • 我编辑了我的评论以更具体 - 我在质疑是否必须发回 json 对象或字符串或 HttpResponse 或其他任何东西,因为我不知道 @987654339 的确切方式@part 获取响应数据
  • 在本例中为字符串。因为我们只需要一个值:按钮的文本。 success 回调函数有几个参数,第一个是响应的主体。这就是您可以访问响应值的方式。我已将回调中的参数更新为更清晰。
  • 我做了一些实验——我从 Django 得到了一个例外的字符串,使用 HttpResponse('Like') 它可以工作——我非常感谢你。像你这样的人让世界变得更美好。
猜你喜欢
  • 1970-01-01
  • 2014-09-25
  • 2015-12-18
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多