代码之家  ›  专栏  ›  技术社区  ›  geejay

Django添加/删除表单,无需多次提交

  •  1
  • geejay  · 技术社区  · 15 年前

    我想在Django中使用一个简单的编辑/删除表单。

    我希望它看起来像:

    Item A   edit  /   remove
    Item B   edit  /   remove
    Item C   edit  /   remove
    

    我希望编辑和删除“按钮”是超链接,或者至少看起来像它们。

    有没有一个简单的方法没有多个提交按钮(并且没有违反整个post/get的事情?)

    3 回复  |  直到 14 年前
        1
  •  2
  •   T. Stone    15 年前

    您最好不要使用表单来实现这一点,因为(根据您所描述的)不需要表单元素。

    相反,您可以有一个设置,其中您的urls.py有两个url,

    url(r'^app/edit/(?P<id>.*)$', edit_view, name='item_edit'),
    url(r'^app/remove/(?P<id>.*)$', remove_view, name='item_remove'),
    

    上面描述的接口是由一个模板生成的,该模板只使用%url%标记来创建指向这些地址的超链接。例如,假设您在上下文中传递变量“items”,模板代码将如下所示

    <table>
    {% for item in items %}
        <tr>
          <td>{{item.name}}</td>
          <td>{% url 'item_edit' item.id %}</td>
          <td>{% url 'item_remove' item.id %}</td>
        </tr>
    {% endfor %}
    </table>
    

    …或者其他一些影响…

        2
  •  1
  •   kfarr    14 年前

    为每个条目创建单独的表单元素。在迭代模板中每个项的表单时,将item.id作为隐藏字段包含在内。

    这是在多个项目上使用基于帖子的删除的简单方法,如果您想防止CSRF攻击,这一点很重要。

        3
  •  1
  •   rsp    14 年前

    我这样做是为了解决类似的问题: 将此javascript放入模板中:

    <script language="javascript">function submit(item_id){
    document.myform.item_to_delete.value = item_id;
    document.myform.submit();
    }
    </script>
    

    使用模板为每个项目创建此删除超链接:

    <a href="javascript:submit({{ item_id }});">Delete</a>
    

    将此隐藏表单放到页面的某个位置:

    <form name="myform" method="post" action="/view_to_handle_delete/"><input name="item_to_delete" type="hidden" value=""></form>'
    

    基本上,每个项目都有一个删除超链接,它调用JS提交函数并传递要删除的项目。JS函数submit为该项设置一个隐藏的输入值,然后使用该输入提交表单,从而通过post将该值传递给url/view_to_handle_delete/,在那里您可以像处理普通的post请求一样处理它。在这里,项目ID将被称为要删除的项目。