3

我不确定标题是否准确地描述了我想要的东西。我想要的是实现这样的目标:Django add / remove form without multiple submit

但我没有我有表单集和表单的项目列表。这个表单集的表单确实包含我可以用来创建链接的信息,例如 {% 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>

此视图的 Urlconf 为:

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

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

艾伦。

4

2 回答 2

8

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

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

您应该使用表单进行删除,因为要使 Django 的 CSRF-Middleware 工作,您需要表单。CSRF-Middleware 应该在你的中间件堆栈中。

如果你用一个对象初始化一个 Django 表单,就像你可能有的那样,对象的字段存储在一个名为 initial 的字典中。您可能可以通过form.initial["id"]或在模板中访问它 speak {{ form.initial.id }},但我不确定它是否有效或是否是个好主意。

于 2009-09-12T12:09:45.810 回答
0

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

然后,我将表单和数据的混合列表传递给模板,而不是简单地传递给表单集

然后模板中的外部 for 循环变为

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

然后,您可以像往常一样显示数据部分,在您的情况下是编辑 url。

于 2009-09-12T12:08:48.930 回答