2010-07-10 23 views
5

Estoy tratando de pasar información adicional a los campos de un formulario de Django que se mostrarán en una plantilla. He intentado redefinir el constructor y añadir otra propiedad al campo de la siguiente manera:Adjuntando información adicional a los campos de formulario

self.fields['field_name'].foo = 'bar' 

pero en la plantilla siguiente:

{{ form.field_name.foo }} 

no se imprime nada. ¿Alguien sabe cómo agregar información adicional a un campo sin reescribir/heredar las clases de campo de formularios?

+0

relacionadas: http://stackoverflow.com/questions/2270550/warnings-or-even-info-messages-instead-of-only-errors-in-django – guettli

Respuesta

6

Según django.forms.forms, el método de un Form__getitem__() crea algo llamado BoundField fuera del campo antes de devolverlo, despojando así de cualquier cambio que ha realizado. Si realmente desea insertar más funcionalidad en eso, se sobrepase el método de hacer cosas para el campo enlazado antes de devolverlo:

class MyForm(forms.Form): 
    def __getitem__(self, name): 
     boundfield = super(forms.Form,self).__getitem__(name) 
     boundfield.foo = "bar" 
     return boundfield 

Entonces, "bar" aparecerá para todos los campos de esa forma. También puede hacer una función y llamarla en su lugar, para hacerla más que solo una cadena codificada.

Si bien es más estándar agregar más campos o agregar propiedades al formulario en sí, si tiene toda una nueva clase de información que debe contener cada campo, puede hacerlo por usted.


Otra forma de conseguir lo mismo es editar un atributo del campo, luego acceder a ella a través de la BoundField 's "field" atributo:

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs) 
     super(forms.Form, self).__init__(*args, **kwargs) 
     self.fields['field_name'].foo = "bar" 

A continuación, acceder a foo en una plantilla:

{{ form.field_name.field.foo }} 
+1

Gracias por t la explicación. Probé el último de los dos enfoques y funcionó a las mil maravillas, gracias de nuevo. – Max

Cuestiones relacionadas