cómo agregar la etiqueta en lugar de

forms.py

class TypeSelectionForm(forms.Form): checkbox_field = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple(), label="", required=False) def __init__(self, type_id, *args, **kwargs): super(TypeSelectionForm, self).__init__(*args, **kwargs) _type_checkbox = self.fields['checkbox_field'] MY_CHOICES=((type.id, type.title) for type in type) _type_checkbox.choices = MY_CHOICES initial_val = [] type_selection = Types.objects.filter(parent_type_id=type_id,is_active=True) for type_selection in type_selection: initial_val.append(type_selection.id) _type_checkbox.initial = initial_val 

vistas.py

 def types(method): """""""""""" types = TypeSelectionForm(type_id) return render(request,'types.html',{'types':types}) 

En la plantilla estoy renderizando el campo como este,

tipos.html

  {% for field in types.checkbox_field %} 
{{field}}
{% endfor %}

Se está produciendo el html de esta manera,

 

Quiero reemplazar la etiqueta

    y

  • con

    Necesitas ayuda.

    ¿Por qué no usar el poder de las tags de plantilla de Django?

     from django import template from django.utils.safestring import mark_safe register = template.Library() @register.filter("as_div") def as_div(form): form_as_div = form.as_ul().replace(" 

    Ponga eso en una etiqueta de plantilla y luego haga esto simplemente en su plantilla

     {% load ad_div %} {# some Code #} {{ form|as_div }} {# some other code #} 

    ============================

    Otro enfoque (Mejor Limpiador)

    Otro enfoque sería extender el modelo de formas django.

    como sigue

     from django.forms.forms import BaseForm Class AsDiv(BaseForm): def as_div(self): return self._html_output( normal_row = u'%(errors)s%(label)s %(field)s%(help_text)s', error_row = u'
    %s
    ', row_ender = '', help_text_html = u' %s', errors_on_separate_row = False)

    Entonces solo podrías hacer esto es tu plantilla

     {{ form.as_div }} 
  • De la documentación :

    Nuevo en Django 1.4.

    Para un control más granular sobre el marcado generado, puede pasar sobre los botones de radio en la plantilla. Suponiendo una forma de formulario con un campo beatles que utiliza un RadioSelect como su widget:

     {% for radio in myform.beatles %} 
    {{ radio }}
    {% endfor %}

    En tu plantilla, deberías tener esto:

     {% for radio in types.checkbox_field %} {{ radio }} {% endfor %} 

    También debe utilizar un ModelMultipleChoiceField :

     class TypeSelectionForm(forms.Form): checkbox_field = forms.ModelMultipleChoiceField(label="", queryset=Types.objects.none(), required=False) def __init__(self, *args, **kwargs): qs = kwargs.pop('queryset') super(TypeSelectionForm, self).__init__(*args, **kwargs) self.fields['checkbox_field'].queryset = qs 

    Inicialo así desde tu punto de vista:

     def types(method): """""""""""" qs = Types.objects.filter(parent_type_id=type_id,is_active=True) types = TypeSelectionForm(queryset=qs) return render(request,'types.html',{'types':'types'}) 

    Los widgets toman un atributo attrs, que debería agregar el atributo a cada entrada. Prueba esto:

     checkbox_field = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple(attrs={'class': 'my-image-class', }), label="", required=False) 

    ACTUALIZAR:

    Así que parece que el enfoque granular mencionado anteriormente solo funciona para los widgets de botones de radio. Pero lo que quieres es en realidad muy simple. Simplemente envíe sus casillas de verificación como de costumbre:

     {% for field in types.checkbox_field %} {{field}} {% endfor %} 

    Esto dará como resultado su lista de casillas de verificación según lo necesite. Luego, solo use un poco de CSS para diseñar la imagen de fondo de cada elemento de la lista:

     form ul li { background:url("") no-repeat center; width:20px; height:20px; 

    }

    ACTUALIZAR

    Si desea representar las casillas de verificación de manera diferente, necesita una clase de widget personalizado, ya que ese es el trabajo de los widgets. Algo como esto te pondrá en marcha. Personalmente, uso la opción attrs en el widget para agregar una clase, pero la he codificado aquí para mostrarte que lo que pides es posible, pero no bonito:

     class CheckboxDivSelectMultiple(CheckboxSelectMultiple): '''renders the checkboxes as divs with a hard coded class''' def render(self, name, value, attrs=None, choices=()): if value is None: value = [] has_id = attrs and 'id' in attrs final_attrs = self.build_attrs(attrs, name=name) output = [u'
    '] # Normalize to strings str_values = set([force_unicode(v) for v in value]) for i, (option_value, option_label) in enumerate(chain(self.choices, choices)): # If an ID attribute was given, add a numeric index as a suffix, # so that the checkboxes don't all have the same ID attribute. if has_id: final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i)) label_for = u' for="%s"' % final_attrs['id'] else: label_for = '' cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values) option_value = force_unicode(option_value) rendered_cb = cb.render(name, option_value) option_label = conditional_escape(force_unicode(option_label)) output.append(u'
    %s %s
    ' % ('new-class', label_for, rendered_cb, option_label)) output.append(u'
    ') return mark_safe(u'\n'.join(output))

    Úsalo en tu forma:

     checkbox_field = forms.MultipleChoiceField(widget=forms.CheckboxDivSelectMultiple(), label="", required=False) 

    Esto es similar a la solución de @bhappy. La solución general es definir un método as_div personalizado y utilizarlo como un filtro de plantilla en sus plantillas. Eche un vistazo a esta publicación de fragmentos de django: Ejemplo de formulario personalizado: Formularios para Bootstrap Html – Kit de herramientas CSS