Javascript Ajax/jQuery Django元素刷新类

Javascript Ajax/jQuery Django元素刷新类,javascript,python,jquery,django,ajax,Javascript,Python,Jquery,Django,Ajax,我没能想出一个更合适的标题,但我的问题如下: $(document).on('submit','.likeform',function(e){ e.preventDefault(); $.ajax({ type:'POST', url:'{% url 'like' %}', data:{ post_id: $('#post_id').val(),

我没能想出一个更合适的标题,但我的问题如下:

 $(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 > *");
        }
    });
我生成了一个帖子列表,可以选择喜欢和不喜欢它们,这取决于它们是否已经被喜欢

{% 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 %}
POST请求可以正常工作,但success:functionpart不能。它刷新所有按钮,这不是很好,但它也把所有的按钮以各种形式。目前,我的数据库中有6篇文章,在$.likeform.load.likeform>*之后的每篇文章下都有6个喜欢/不喜欢按钮;已经完成了

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

因为您说页面上有多个这样的表单,所以请丢失输入上的id属性并将其更改为name属性

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

您可以将post_id发送回成功回调,并使用它选择正确的输入元素。感谢您的快速响应!正如你可能知道的,我对JS/JQ/AJAX很陌生-这是怎么做到的?你打算用CSS显示和隐藏按钮,还是完全从HTML中删除和替换按钮?我的想法基本上是通过在views.py中向后端发送一个新的请求来刷新按钮。随后的post_id列表将生成并传递到确定按钮文本的模板基于此列表。我不确定这在当时是否可行,因为基本上需要重新渲染整个模板才能工作,或者我遗漏了什么?不,你做得很好。幸运的是,您不必重新渲染所有内容。作为服务器的响应,您可以发送按钮的HTML,以替换旧按钮。如果您能够修改响应,以发送字符串上的按钮,例如:厌恶,那么这将非常简单。或者甚至只是喜欢和不喜欢的文字就可以了。好吧,到目前为止我可以跟你说,但是buttonText的设置需要怎样的反应呢?我可以在函数中返回'Like'吗?喜欢你的帖子。保存返回像这样的“不喜欢”吗?为了进一步解释:/like/是接收ajax帖子的端点,my views.py中的函数是否应该只返回一个字符串,或者如何返回该字符串?响应应该是喜欢还是不喜欢,取决于您发送的具有帖子id的帖子现在是否喜欢。如果喜欢,就发不喜欢。如果不喜欢就发喜欢。这就像一个开关。我编辑我的评论是为了更具体——我质疑是否必须发回json对象、字符串、HttpResponse或其他任何东西,因为我不知道成功部分是如何获得响应数据的——在本例中是字符串。因为我们只需要一个值:按钮的文本。success回调函数有两个参数,第一个是响应的主体。这是访问响应值的方法。我已经更新了回调中的参数,使其更清晰。我做了一点实验——用一个字符串,我从Django那里得到了一个异常,用一个HttpResponse“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);

    }
  });

});