2009-09-10 3 views
1

Djangoで簡単な編集/削除フォームが必要です。Django複数の提出なしでフォームを追加/削除する

私はそれが見えるようにしたい:

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

私が編集したいとハイパーリンクであることを「ボタン」を削除、または少なくとも彼らのように見えます。

複数のボタンを提出せずに簡単な方法がある(全体POST/GETの事に違反せずには?)

答えて

2

(は何」からあるとしてあなたは、おそらくより良い、これを達成するためのフォームを使用していないでしょう記述されている)フォーム要素は必要ありません。

代わりに、あなたのurls.pyが2つのURL、

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

を持っており、あなたが上記のインタフェースは、単にハイパーリンクを作るためには、{%のurl%}タグを使用して、テンプレートによって生成された設定を持つことができますそれらのアドレスに。別のフォームを作成し

+1

ありがとうございました。私はこれを実装しました。それはGETを使用しているため、標準を少し破る(GETを使用してデータベースからの削除を行う)。それが難しいときにどのように基準に従うことができますか? (CSSで制御された送信ボタンを含む複数の送信フォームをコーディングせずに)... – geejay

1

...、たとえば、あなたがあなたのコンテキスト内の変数「アイテム」を渡している、あなたのテンプレートコードはすべてその旨をこの

<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> 

...か何かのようになりますと言います各エントリの要素。テンプレート内の各アイテムのフォームを繰り返し処理するときに、item.idを非表示フィールドとして含めます。

これは、CSRF攻撃を防止するために重要な、複数の項目にわたってPOSTベースの削除を使用する簡単な方法です。

1

私は同様の問題のために、このような何かをした: テンプレートにこの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>' 

基本的に、それぞれのite mはjs submit関数を呼び出す削除ハイパーリンクを持ち、削除する項目を渡します。 js関数submitは、この項目に隠れた入力値を設定し、その入力でフォームを送信し、POSTを介してurl/view_to_handle_delete /に値を渡し、通常の投稿要求のように処理します。ここでitem_idはitem_to_deleteと呼ばれます。