1

(我正在使用 jquery 和 django)

假设我有一个待办事项列表,每个项目都有一个唯一的主键 (pk)。在模板中,我使用 for 循环列出这些项目,以便每个项目都是可点击的,以在页面的另一部分显示项目详细信息(当然无需重新加载整个页面)。

普遍接受的最佳方法是什么?

我已经尝试了多种“唯一化”每个 div 的方法,以及在 ajax 请求中传递这个 pk 的多种方法。

第 1 部分 - 获取独特的 div:

  • 我把 pk 作为每个项目 div 的 id 的后缀。例如 {% for item in todolist %} stuff $('body').on('click',"#item_{{item.pk}}", function(){var id = {{item.pk}}, .ajax 东西 }) {% endfor %}
  • 我没有添加 pk 后缀,而是添加了一个名为 data-id 的自定义 html 属性。这允许我使用 .attr("data-id") 从单击的 div 中获取 pk 并从 for 循环中删除 js。
  • 我没有添加自定义 html 属性,而是添加了一个隐藏的表单字段。

第 2 部分 - 将 pk 传递给 ajax 请求:

  • 在 $.ajax() 正文中,我将 url: id+"/details" 设置为空数据字段。在 Django 中,我从 url 正则表达式定义中获取 id。
  • 在 $.ajax() 正文中,我将 url: "/details" 设置为 data: {id:id}。在 Django 中,我使用 request.POST['id'] 从 views.py 中获取 id。
  • 在 js 中,我只是提交表单。Django 将 id 作为表单字段获取。

所以......有这么多(可能是坏的)这样做的方法,你会使用哪一种?

4

1 回答 1

0

我将使用单个 ajax 函数,它应该是:

{% for item in todolist %}
    <div id="{{item.id}}" class="item_ajax" >{{item.name}}</div>
{% endfor %}

<script>
    $('.item_ajax').click(function(){
        $.ajax({
              type: 'POST',
              url: '{% url item_url %}',
              data: {'id': $(this).attr('id'), 'csrfmiddlewaretoken': '{{csrf_token}}'},
              dataType: "text",
              success: function(response) {
                  // do something
              },
              error: function(rs, e) {
                  alert(rs.responseText);
              }
         }); 
    });
</script>

I have used a class selector, obviously you can choose what ever you like e.g. having a custom attribute but it should be common.

于 2012-12-30T19:42:03.973 回答