2009-09-12 61 views
3

我不确定标题是否描述了我想要的内容。我想要的是实现这样的事情:Django add/remove form without multiple submitDjango:从formset中获取表单ID

但我没有列出我有formset和窗体的项目。这个formset的形式确实包含了我可以用来创建链接的信息{%url'item_edit'item.id%}。问题是它是一个隐藏字段的值。在这里(http://docs.djangoproject.com/en/dev/topics/forms/#looping-over-the-form-s-fields),您有一个选项列表如何使用模板中的表单字段,但没有一个是{{field.value}}。如果我尝试过,那就只是失败了。

无论如何。到代码。我所拥有的模板是:

<form enctype="multipart/form-data" method="post" action="/list/edit/{{ list.id }}/"> 
     <table> 
     {{ form.as_table }} 
     {{ formset.management_form }} 
     {% for form in formset.forms %} 
      {% if forloop.first %} 
       <tr> 
       {% for field in form.visible_fields %} 
        <td>{{ field.label }}</td> 
       {% endfor %} 
       </tr> 
      {% endif %} 
      <tr> 
       {% for field in form.visible_fields %} 
        {% if not forloop.last %} 
         <td>{{ field }}</td> 
        {% else %} 
         <td>{{ field }} 
        {% endif %} 
       {% endfor %} 
       {% for field in form.hidden_fields %} 
        {% if not forloop.last %} 
         {{ field }} 
        {% else %} 
         {{ field }}</td> 
        {% endif %} 
       {% endfor %} 
      </tr> 
     {% endfor %} 
     <tr><td><input type="submit" value="Submit"></td><td colspan="4">&nbsp;</td></tr> 
     </table> 
    </form> 

而这给了我直列形式行是这样的:

<tr> 
    <td><input type="text" maxlength="200" value="test2" name="shoppinglistitem_set-0-itemname" id="id_shoppinglistitem_set-0-itemname"/></td> 
    <td><input type="text" maxlength="200" value="http://www.xxx.ee" name="shoppinglistitem_set-0-link" id="id_shoppinglistitem_set-0-link"/></td> 
    <td><input type="text" maxlength="100" value="eepöäsdöäfsdfd" name="shoppinglistitem_set-0-store" id="id_shoppinglistitem_set-0-store"/></td> 
    <td><input type="text" id="id_shoppinglistitem_set-0-price" value="22134" name="shoppinglistitem_set-0-price"/></td> 
    <td><input type="checkbox" id="id_shoppinglistitem_set-0-DELETE" name="shoppinglistitem_set-0-DELETE"/><input type="hidden" id="id_shoppinglistitem_set-0-list" value="1" name="shoppinglistitem_set-0-list"/><input type="hidden" id="id_shoppinglistitem_set-0-listitem_ptr" value="5" name="shoppinglistitem_set-0-listitem_ptr"/></td> 
</tr> 

,我寻找一些方式来增加这样

<a href={% url 'remove_list_item' item.id %}>REmove</a> 

链接或者只是

<a href="http://localhost/list/removeitem/{{ id }}">REmove</a> 

Urlcon f对于这种观点是:

url(r'^removeitem/(?P<lisitem_id>\d+)/$', 'remove_list_item', name='remove_list_item') 

那么是否有一些简单的方法从窗体中获取该项目(对象)的ID?我是否必须为该删除链接创建某种小部件?

Alan。

回答

8

首先,您不应该使用链接(GET请求)来触发编辑或删除数据的操作,您应该使用POST请求。

您仍然可以使用链接删除数据,方法是通过JavaScript创建一个链接并使用它们的click-Event发出Ajax POST请求。使用JavaScript,您还可以轻松地从隐藏字段中读取ID。如果你的表单在没有JavaScript的情况下可以使用(它应该),那么你应该创建另一个表单来删除项目(可能只是一个删除按钮)。

您应该使用表单进行删除,因为对于Djangos CSRF-Middleware来说,您需要表单。 CSRF中间件应该放在你的中间件堆栈中。

如果您使用对象初始化Django表格(如您可能具有的),则对象的字段将存储在名为initial的字典中。您可能可以通过form.initial["id"]或模板说{{ form.initial.id }}访问它,但我不确定它是否有效,或者它是一个好主意。

+0

谢谢!我最终会使用ajax删除行,我只想知道是否有easyer方法来获取对象的id,因为我不想为此编写javascript。{{form.initial.id}}工作得很好! 整个想法是让这种形式可以使用JavaScript和不使用JavaScript。我想摆脱ajax的IE(6)用户,所以他们将有更多的理由升级:) 在这里写关于CSRF让我看起来跆拳道它是。谢谢 :)。我现在会阅读更多关于此的内容。 – 2009-09-12 12:32:41

+1

我很确定{{form.instance.pk}}有效,并且是一种更“适当”的方式。 (现在无法直接验证,所以对不起,如果我记错的话) – 2009-09-12 23:08:43

+0

Béres - 如果表单的实例对象尚未保存(您使用的是“创建”表单而不是更新表单),那么这会赢得'工作。另外,实例PK *不是*形式相同ID – Patrick 2014-10-26 12:18:40

0

您在模板中使用的for循环还可以处理列表或元组列表以及简单列表,所以我使用这个混合显示和formset元素的问题的解决方案是创建我的元组列表视图。每一个元组(表格数据)

我再通的形式和数据这混合列表的模板,而不是简单的表单集

模板中的for循环外就变成

{% for form, data in forms_and_data_list % } 
{% endfor %} 

然后你可以显示数据部分,就你的情况而言,就像你通常那样显示编辑网址。