python - 为什么我的表单 URL 为所有帖子传递相同的主键?

标签 python jquery django ajax

我有一个 HTML 模板,我在其中一一列出帖子,出于某种原因,

模板:

{% for post in posts %}
...
<form class='bookmark-form' method='POST' action="{% url 'add_bookmark' post.pk %}" 
          data-url='{{ request.build_absolute_uri|safe }}'> {% csrf_token %}
      <input type="text" value="{{post.pk}}" class="post-pk" hidden>
      <button type='submit'><img src="/img/bookmark.svg" alt=""></button>
</form>
...
{% endfor %}

Javascript:

  $('.bookmark-form').submit(function(event){
      event.preventDefault() 
      var $formData = $('.post-pk').val()
      var postData = {csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val(), 'post-pk': $formData}
      var $thisURL = $('.bookmark-form').attr('data-url') || window.location.href 
      var form_action =  $('.bookmark-form').attr('action')
      console.log($formData)
      $.ajax({
          method: "POST",
          url: form_action,
          data: postData,
          success: function (data) {console.log(data)},
          error: function(data) {console.log("Something went wrong!");}
      })
      return false;
  })

Views.py添加书签功能

def add_bookmark(request, pk):
    if request.method=='POST' and request.is_ajax():
        post = Post.objects.get(pk=pk)
        print(pk)
        user = request.user 
        user.bookmarks.add(post)
        user.save()
        print(user.bookmarks.all())
        return JsonResponse({'result': 'ok'})
    else:
        return JsonResponse({'result': 'nok'})

HTML 渲染页面: HTML Rendered Page

无论我点击哪个书签按钮,我总是在终端和控制台日志中得到相同的输出。

终端:

10
<QuerySet [<Post: Hogwarts, a History>, <Post: The Truth: My Parents are Dentists>, <Post: How to Organize Money: An Easy 10000 Steps>, <Post: Reallllllllly Old Post>, <Post: My First Serious Post>]>

控制台日志:

10
{'result': "ok"}

其中 10 是“我的第一篇严肃帖子”帖子的主键。我似乎找不到为什么我得不到 10 以外的任何其他主键的原因。

最佳答案

您的问题是您选择的表单数据不在提交它的表单范围内;

试试这个:

var $formData = $(this).val()

您必须像这样更改所有选择

编辑: 解释一下,当您按类选择时,jquery 会获取与您提供的类匹配的第一个元素的值。这就是为什么您始终获得相同数据的原因,它采用了第一个数据的值。

当您想要查找由事件触发的值时,使用 this 关键字很有用,因为这将保持事件的范围。您可以使用 $(this).find('.eg')$(this).closest('.eg') 访问变量

关于python - 为什么我的表单 URL 为所有帖子传递相同的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60944366/

相关文章:

python - 如何在不下载文件的情况下获取重定向的 URL

javascript - 选择选项时隐藏 Div

javascript - 粘贴事件未按预期工作

python - 在 HTML 电子邮件 Django 中显示内嵌图像

python - 如何避免在 Django 1.6 的功能测试中多次创建管理员?

python - 为什么我在这段代码中遇到语法错误?

python - Django CSRF 验证失败。即使使用@csrf_exempt 请求也中止

python - y 轴上有双方 block 的一维热图

javascript - 使用 ng-repeat 和 ng-options 处理来自多个下拉菜单的 selectedValues

python - Django 为 FloatRangeField 指定小数位