有人能告訴我如何使用Django窗體爲其下拉框選擇CustomWidget/CustomField的複選框組?Django窗體 - 帶下拉框的複選框組
- 所有複選框應具有相同的名稱(複選框組)
- 每個複選框應該有一個下拉作爲子元素(相同下拉爲所有複選框)
- CustomWidget /的CustomField應該接受選項= [] PARAM生成複選框組
- 複選框組需要=真驗證
Ex。案例:文本框將顯示維度,每個維度都應該有一個下拉列表,其中包含聚合函數。
有人能告訴我如何使用Django窗體爲其下拉框選擇CustomWidget/CustomField的複選框組?Django窗體 - 帶下拉框的複選框組
Ex。案例:文本框將顯示維度,每個維度都應該有一個下拉列表,其中包含聚合函數。
在forms.py
class DynamicForm(forms.Form):
options = [
('Textbox1', 'Textbox1'),
('Textbox2', 'Textbox2'),
...
]
dynamic_data = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=options)
def __init__(self, *args, **kwargs):
super(DynamicForm, self).__init__(*args, **kwargs)
for i in range(1,len(self.options)+1):
self.fields['dd_func_'+str(i)] = forms.ChoiceField(widget=forms.Select, choices= [
('average', 'average'),
('sum', 'sum')], initial='sum', required=False)
def __getitem__(self, name):
try:
field = self.fields[name]
except KeyError:
raise KeyError('Key %r not found in Form' % name)
return forms.forms.BoundField(self, field, name)
在views.py
from app.forms import DynamicForm
def create_form(request):
if request.method == 'POST':
dynamic_form = DynamicForm(request.POST)
...
...
else:
dynamic_form = DynamicForm()
return render(request, 'form.html', {
'dynamic_form': dynamic_form
})
在模板/ form.html
{% load myfilters %}
{{ dynamic_form.dynamic_data.errors }}
{% for checkbox in dynamic_form.dynamic_data|checkboxiterator %}
{{ checkbox }}
{% with c=forloop.counter|stringformat:"s" %}
{% with c='dd_func_'|add:c %}
{{ dynamic_form|lookup:c }}
{% endwith %}
{% endwith %}
{% endfor %}
在templatetags/myfilters.py
https://djangosnippets.org/snippets/2159/
和
@register.filter
def lookup(f, name):
try:
return f[name]
except KeyError:
return None
如果我理解正確,這應該做到這一點。
根據您在視圖中的內容,只需將一些列表放在your_list中作爲上下文。根據列表中有多少項目,它將爲每個項目創建其中一個複選框列表組合。
{% for number in your_list %}
<div class="check_box" id="check_box_{{ number }}">
<input id="cb_{{ number }}" name="cb_{{ number }}" type="checkbox"><label for="cb_{{ number }}">textbox {{ number }}</label>
<select class="some_class">
<option value="1">Sum</option>
<option value="2">Difference</option>
<option value="3">Whatever</option>
</select>
</div>
{% endfor %}
輸出將是這樣的: http://jsfiddle.net/3vetooLp/1/
我明確指定使用表單字段 – 2014-10-27 10:04:29
我會使用MultiValueField和MultiWidget。
可以使MultiValueField 初始化方法接受你想建立的所有選項,並使用自定義邏輯在MultiWidget渲染所有的複選框,並選擇和壓縮/由用戶輸入的數值解壓縮到一個合適的任何選項表示形式,如字典{checkbox_name:operation}。
你能在這裏粘貼你的代碼嗎? – 2014-10-27 10:05:00
我可以在大約8小時內......所以這是在寬限期之後,對不起。 – dukebody 2014-10-27 10:29:02
這實在是不清楚。什麼是「複選框組下拉列表」?你的照片中的盒子與選擇有什麼關係? – 2014-10-17 14:08:46
每個複選框字段應包含一個下拉菜單 – 2014-10-17 14:34:47
這些下拉菜單應該做些什麼?一個使用示例將是(沒有雙關語意圖)有用。 – frnhr 2014-10-21 08:00:51