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 を使用してリンクを作成し、そのクリック イベントを使用して Ajax POST 要求を作成することにより、リンクを使用してデータを削除することもできます。JavaScript を使用すると、隠しフィールドから ID を簡単に読み取ることもできます。フォームを JavaScript なしで使用できるようにする必要がある場合 (そうすべきである場合)、アイテムを削除するための別のフォームを作成する必要があります (おそらく削除ボタンのみ)。

Djangos 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 に答える