2011-02-09 18 views
5

Supongamos que tengo la siguiente plantilla:Django - ¿Cómo añadir atributos HTML a las formas en las plantillas

<div id="openid_input_area"> 
{{ form.openid_identifier }} 
    <input name="bsignin" type="submit" value="{% trans "Sign in" %}"> 
</div> 

¿Cómo puedo agregar una clase CSS para form.openid_identifier?

Como estoy adhiriendo a la SOC principios y espero que los diseñadores para mejorar las plantillas que hago NO quiere hacer esto en el modelo de la forma, sino en la propia plantilla.

No pude encontrar nada sobre esto en los documentos. ¿Hay alguna manera de hacer esto en la plantilla?

Respuesta

16

he logrado codificar una solución simple a mi problema:

me escribió una custom template tag:

from django import template 

register = template.Library() 

def htmlattributes(value, arg): 
    attrs = value.field.widget.attrs 


    data = arg.replace(' ', '') 

    kvs = data.split(',') 

    for string in kvs: 
     kv = string.split(':') 
     attrs[kv[0]] = kv[1] 

    rendered = str(value) 

    return rendered 

register.filter('htmlattributes', htmlattributes) 

Y todo lo que tiene que hacer en el la plantilla es:

{{ form.openid_identifier|htmlattributes:"class : something, id: openid_identifier" }} 
2

No conozco ningún otro camino en plan simple Django. Los accesos directos como form.field o form.as_p realmente le ayudan a comenzar, pero al final uno puede recurrir a html simple. Así es como lo veo. No quiere decir que no haya necesidad de más control sobre la representación. Recuerdo haber leído this discussion about form rendering en la lista de correo de Django.

Simon Willison estaba/estaba trabajando en una biblioteca para dar a los diseñadores más control, usted puede encontrar su fuente on github. Es un poco viejo, por lo que podría no funcionar más. Pero con respecto a su pregunta, este ejemplo parece que podría ser útil para usted:

{% field form.name class="myclass" %} 
<!-- renders as --> 
<input type="text" name="name" id="id_name" class="myclass"> 

En realidad esta funcionalidad debería ser fácil de lograr. Necesita una etiqueta de plantilla que acepte un campo de formulario, actualice los atributos de widgets (los que ya puede configurar en el formulario) y renderice el campo.

Al iterar sobre un formulario se producen instancias de BoundField, que se representa con el método __unicode__. Debería pasar todos los argumentos de palabra clave a la función de representación de widgets. Un proyecto de esta idea:

@register.simple_tag 
def field(boundfield, **kwargs): 
    if self.field.show_hidden_initial: 
     return self.as_widget(attrs=kwargs) + self.as_hidden(only_initial=True) 
    return self.as_widget(attrs=kwargs) 
Cuestiones relacionadas