2015-01-04 52 views
0

我試圖用自動完成下拉菜單替換CheckBoxSelectMultiple字段。當選擇自動完成項目時,將隱藏的輸入附加到div,並選擇該項目的值,所以一旦表單被提交,看起來與複選框字段相同。在Django模板中訪問CheckBoxMultiple選擇的項目

但是,問題是在表單中存在錯誤時恢復這些列表項。理想情況下,我可以創建一個可以繼承CheckBoxSelectMultiple小部件的自定義小部件,但似乎沒有關於如何執行此操作的任何文檔。相反,我想我可以訴諸類似下面:

{% for box in checkboxes.selected %} 
<li> 
<span class="selectedItem"> 
    {{ box.field1 }} ({{box.field2}}) 
    <input type="hidden" value="{{box.id}}" name="selectedItems"/> 
</span> 
</li> 

{% endfor %} 

這是一個非常哈克解決方案,那一定是相當普遍的一個問題。我想像有一種相當優雅的方式來解決這個問題,我在這裏沒有看到。 我應該補充一點,這也將在一個formset中進行,所以如果我修改視圖,我需要捕獲formset中每個表單的前綴,因此爲什麼我要避免這樣做。

+0

你有沒有考慮過使用[Django的自動完成光(HTTP:/ /django-autocomplete-light.readthedocs.org/en/stable-2.xx/)它幾乎可以滿足你所問的一切? –

回答

0

的問題是與你輸入的name所以有錯誤很可能會在這條線的位置:

<input type="hidden" value="{{box.id}}" name="<<Name of the widget here>>"/> 

如果名稱不正確,這些值將不會被Django正確回升,這包括任何formset前綴。

但是,更簡單的解決方案是按原樣呈現HTML,然後適當地設置它的樣式。例如,您可以定位實際複選框關閉屏幕,然後使用顏色來高光什麼檢查,什麼是不喜歡這樣:

input[type="checkbox"] { 
    position: absolute; 
    left: -9999px; 
} 
[type="checkbox"]:checked + label { 
    color:red; 
} 
[type="checkbox"]:not(:checked) + label { 
    color:blue; 
}