【问题标题】:Django forms - checkbox group with dropdownsDjango 表单 - 带有下拉菜单的复选框组
【发布时间】:2014-10-17 12:19:38
【问题描述】:

谁能告诉我如何使用 Django 表单为带有下拉菜单的复选框组编写 CustomWidget/CustomField?

  1. 所有复选框都应具有相同的名称(复选框组)
  2. 每个复选框都应该有一个下拉菜单作为子元素(所有复选框的下拉菜单相同)
  3. CustomWidget/CustomField 应该接受 options= [] 参数来生成复选框组
  4. 具有 required=True 验证的复选框组

例如。案例:文本框将显示维度,并且每个维度应该有一个下拉列表,其中包含聚合函数列表。

【问题讨论】:

  • 这个真的不清楚。什么是“下拉复选框组”?您图片中的框与选择有什么关系?
  • 每个复选框字段都应该包含一个下拉菜单
  • 这些下拉菜单应该做什么?一个使用示例会(不是双关语)有用。
  • 文本框将显示维度和下拉菜单用于选择聚合函数。因此,我必须同时获取选定维度及其功能的列表。希望这会有所帮助。

标签: python django django-forms django-templates django-views


【解决方案1】:

我会使用MultiValueFieldMultiWidget

您可以使 MultiValueField init 方法接受您想要构建所有选项的任何选项,并使用 MultiWidget 中的自定义逻辑来呈现所有复选框并选择并压缩/解压缩由用户使用合适的表示形式,例如 dict {checkbox_name: operation}。

【讨论】:

  • 我可以,但大约 8 小时后...所以这是在宽限期之后,抱歉。
【解决方案2】:

如果我理解正确,应该这样做。

根据您在视图中的内容,只需在 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/

【讨论】:

    【解决方案3】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 2017-05-14
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 2021-09-01
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多