有人可以告诉我如何使用Django表单为包含下拉菜单的复选框组编写CustomWidget / CustomField吗?
实施例。案例:文本框将显示维度,每个维度都应包含一个下拉列表,其中包含聚合函数列表。
答案 0 :(得分:1)
我使用MultiValueField和MultiWidget。
您可以使MultiValueField init 方法接受您要构建所有选项的任何选项,并使用MultiWidget中的自定义逻辑来呈现所有复选框,并选择和压缩/解压缩由用户使用合适的表示形式,如dict {checkbox_name:operation}。
答案 1 :(得分:0)
如果我理解正确的话,应该这样做。
根据您在视图中的内容,只需将一些列表放在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/
答案 2 :(得分:0)
在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
})
在templates / 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