2010-10-13 14 views
6

He creado una nueva plantilla para la prestación de los campos del formulario:Django: ¿Cómo comprobar si el widget de campo es una casilla de verificación en la plantilla?

<tr class="{{field.field.widget.attrs.class}}"> 
    <th class="label"> 
     <label for="{{field.auto_id}}"> 
      {{field.label}} 
      {% if not field.field.required %}<span class="optional">(optional)</span>{% endif %} 
     </label> 
    </th> 
    <td class="field"> 
     {{field}} 
     {% if field.errors %}<label class="error" for="{{field.auto_id}}">{{field.errors.0}}</label>{% endif %} 
     {% if field.help_text %}<small class="help-text">{{field.help_text}}</small>{% endif %} 
    </td> 
</tr> 

Pero quiero comprobar si el widget es una casilla de verificación, y si es así, la hacen diferente. ¿Cómo puedo hacer eso en la plantilla?

+0

Hola: He aquí un ejemplo para hacer casillas de verificación para los Componentes de la izquierda y otras a la derecha ? –

+1

@stevejalim: puedo crear un widget personalizado, pero no resuelve el problema. Quiero establecer colspan = 2 y tener la etiqueta en el lado derecho. Este es un problema con la distribución de la fila de la tabla, no con la forma en que se representa el widget. – mpen

+0

gotcha. Una forma (hacky) de hacerlo es pasar una lista de campos que se sabe que son casillas de verificación y cada vez que renderiza el campo, verifique si su nombre está en esa lista, y si es así, configure su colspan allí. Icky, sin embargo; o) –

Respuesta

12

Utilice un custom template filter!

En yourapp/templatetags/my_custom_tags.py: Nota al margen

{% load my_custom_tags %} 

{% if field|is_checkbox %} 
    do something 
{% endif %} 

sobre la aplicación::

from django import template 
from django.forms import CheckboxInput 

@register.filter(name='is_checkbox') 
def is_checkbox(field): 
    return field.field.widget.__class__.__name__ == CheckboxInput().__class__.__name__ 

En su plantilla cuando no lo crea un CheckboxInput, el nombre de clase es MediaDefiningClass.

>>> form django.forms import CheckboxInput 
KeyboardInterrupt 
>>> CheckboxInput.__class__.__name__ 
'MediaDefiningClass' 
+4

Y hoy hay una aplicación de utilidad Django especial que tiene un comprobador similar y otras cosas: https://pypi.python.org/pypi/django-form-utils#is-checkbox – rudyryk

+0

Diría que es más limpio usar algo como esto: 'return isinstance (field.field.widget, CheckboxInput)'. –

6

{{ field.field.widget.input_type }} obtendrá esta información para una gran cantidad de widgets, pero no todos. No estoy seguro si funcionará para el widget de casilla de verificación predeterminado o no. Merece un intento.

+1

No creo que CheckboxInput tenga este atributo ... sin embargo, parece tener un atributo 'check_test' ... No sé si es exclusivo de la entrada de la casilla ... pero está funcionando por ahora. .. un poco de un truco sin embargo. – mpen

6

Es un poco tarde para responder, pero he implementado algo similar a lo que se hace en el administrador de Django.

En primer lugar, he añadido un nuevo atributo a la clase is_checkbox Campo:

# forms.py 
from django import forms 
from django.forms.fields import Field 
setattr(Field, 'is_checkbox', lambda self: isinstance(self.widget, forms.CheckboxInput)) 

Entonces, puedo detectar fácilmente un widget CheckboxInput en la plantilla. Hay una razón particular por la que tiene que hacer en la plantilla, en lugar de establecer un widget personalizado en la clase de formulario -

{% if field.field.is_checkbox %} 
    {{ field }} {{ field.label_tag }} 
{% else %} 
    {{ field.label }} {{ field }} 
{% endif %} 
Cuestiones relacionadas