我不确定标题是否能准确描述我想要的内容。我想要的是实现这样的目标:Django add / remove form without multiple submit。
但我没有列出我有表格和表格的项目。此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"> </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>
此视图的Urlconf是:
url(r'^removeitem/(?P<lisitem_id>\d+)/$', 'remove_list_item', name='remove_list_item')
那么有一些简单的方法从表单中获取项目(对象)的id吗?我是否必须为删除链接创建某种小部件?
艾伦。
答案 0 :(得分:8)
首先,您不应该使用链接(GET请求)来触发编辑或删除数据的操作,您应该使用POST请求。
您仍然可以使用链接删除数据,方法是通过JavaScript创建一个链接并使用他们的click-Event发出Ajax POST请求。使用JavaScript,您还可以轻松地从隐藏字段中读取ID。如果您的表单在没有JavaScript的情况下可以使用(它应该),那么您应该创建另一个表单来删除项目(可能只是一个删除按钮)。
您应该使用表单进行删除,因为要使Djangos CSRF-Middleware正常工作,您需要表单。 CSRF中间件应该在你的中间件堆栈中。
如果使用对象初始化Django表单(如您所见),则对象的字段存储在名为initial的字典中。您可以通过form.initial["id"]
或模板{{ form.initial.id }}
来访问它,但我不确定它是否有效或者是否是个好主意。
答案 1 :(得分:0)
你在模板中使用的for循环也可以处理列表或元组列表以及简单列表,所以我用来解决这个问题的解决方案,混合display和formset元素,就是在我的视图中创建一个元组列表。每个元组都是(形式,数据)
然后我将这个混合的表单和数据列表传递给模板,而不仅仅是formset
模板中的外部for循环变为
{% for form, data in forms_and_data_list % }
{% endfor %}
然后,您可以像往常一样显示数据部分,在您的情况下是编辑网址。