呈现Django形式的多项选择

时间:2018-10-12 15:02:04

标签: html django forms render

我一直在网上搜索如何在django中将颜色/主题应用于复选框表单项,但是找不到该方法。

我想做的事可能很容易,但是尽管我引用了所有主题和博客,但我仍然无法做到。

这是我的表格简化了:

class MyForm(forms.Form):

    def __init__(self, data, *args, **kwargs):
        super(MyForm, self).__init__(data, *args, **kwargs)
        self.fields['checkbox'] = forms.MultipleChoiceField(
            label='Set of questions to know you better',
            required=True,
            widget=forms.CheckboxSelectMultiple(attrs={'disabled': 'disabled'}),
            choices=((1, 'Proposition 1'), (2, 'Proposition 2'), (3, 'Proposition 3'), (4, 'Proposition 4')),
            initial=(1, 2, 4,)
            )

我想知道如何修改当前的HTML格式

<form action="{% url 'dummy' %}" method="post">

    {% csrf_token %}
    {{ form.as_p }}

</form>

,以便将所有初始设置为 True 的选择都应用给定的css,而将其他设置为 False 的选择。

希望我的问题有道理。请不要犹豫。

最佳:

埃里克

当前渲染的添加: enter image description here

编辑:添加生成的html

<form action="/dummy" method="post">

    <input type='hidden' name='csrfmiddlewaretoken' value='LGZ0mwqrAKxb7CzFvOyYIyUIcDSARy4iwEtHVDjKPpnBd1AIXlk4UyxRuCSIEviY' />
    <p><label>Set of questions to know you better :</label> <ul id="id_checkbox">
    <li><label for="id_checkbox_0"><input type="checkbox" name="checkbox" value="1" disabled="disabled" id="id_checkbox_0" checked />
 Proposition 1</label>

</li>
    <li><label for="id_checkbox_1"><input type="checkbox" name="checkbox" value="2" disabled="disabled" id="id_checkbox_1" checked />
 Proposition 2</label>

</li>
    <li><label for="id_checkbox_2"><input type="checkbox" name="checkbox" value="3" disabled="disabled" id="id_checkbox_2" />
 Proposition 3</label>

</li>
    <li><label for="id_checkbox_3"><input type="checkbox" name="checkbox" value="4" disabled="disabled" id="id_checkbox_3" checked />
 Proposition 4</label>

</li>
</ul></p>

</form>

3 个答案:

答案 0 :(得分:1)

如果需要设置检查输入的样式,则可以使用CSS伪类:checked,方法是:

input:checked {
  /*some code here */
}

但是,如果需要有条件地将类添加到输入中,则可以在实例化表单并覆盖create_option方法的视图中进行操作,但是我认为创建自定义模板标签并使用它更容易它。您可以尝试以下操作:

from django import template

@register.filter
def add_css(checkbox_input):
    checkbox_input.data['attrs'].update({"class":"your-class"})
    return checkbox_input

然后在模板中

{% for x in form.checkbox %}
    {% if x.data.selected %}
        {{ x|add_css }}
    {% else %}
       {{ x }}
    {% endif %}
{% endfor %}

答案 1 :(得分:0)

尝试基于CheckboxSelectMultiple创建一个新的Widget,以覆盖create_option方法。

如果选择了选项,则添加新的类属性。

def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
    [..]
    if selected:
        option_attrs.update(self.checked_attribute)
        # add your class here to option_attrs
    [..]

答案 2 :(得分:-1)

好吧,您也可以使用jQuery或Vanilla js动态添加类,因为我一直使用jQuery(而且您也应该使用它,所以代码要比Vanilla js少得多),我将提供jQuery解决方案:

<script "src={% static 'jquery.js' %}" type="text/javascript"></script> // provide path to jquery or use cdn, whatever just add jquery
<script>
$(document).ready(function() {
    // On document ready add relevant classes to each checkbox
    $('input[name=checkbox]').each(function(){
        if($(this).is(':checked')){
            $(this).addClass('checked');
        }
        else{
          $(this).addClass('unchecked');
        }
        console.log(this);
    });
    // On checkbox change, remove classes and add new class based on if its checked or not
    $('input[name=checkbox]').change(function(){
        $(this).removeClass('checked unchecked');
        if($(this).is(':checked')){
            $(this).addClass('checked');
        }
        else{
            $(this).addClass('unchecked');
        }
        console.log(this);
    });
});
</script>

jsFiddle演示。