2009-09-12 76 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 %} 

然後你可以顯示數據部分,就你的情況而言,就像你通常那樣顯示編輯網址。