我一直在网上搜索如何在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 的选择。
希望我的问题有道理。请不要犹豫。
最佳:
埃里克
编辑:添加生成的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>
答案 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演示。