Para lograr esto tenemos los widgets y los podemos definir al momento de hacer la clase de formulario en nuestra aplicación.
Comportamiento del HTML
Como mencionamos, Django muestra los campos de formulario en código HTML y para ello dependiendo del tipo de campo definido será el elemento HTML que se mostrará al momento de generar el formulario, si queremos funcionalidades adicionales en nuestros campos Django nos ofrece los widgets para poder incorporar dichas funcionalidades extra.
Widgets Personalizados
Otro aspecto que podemos tener en cuenta es que si no nos es suficiente con los widgets de Django, al igual que sucede con los tipos de campos, podemos personalizarlos, de forma que podamos lograr comportamientos específicos que se ajusten a nuestra aplicación.
Por ejemplo podemos crear un tipo de widget que se integre con un calendario Javascript que hayamos desarrollado o que sea solicitado en específico para nuestro formulario.
Aplicación práctica
Veamos a continuación un ejemplo donde vamos a generar un formulario utilizando los widgets para definir algunos aspectos de los campos, este ejercicio lo vamos a realizar en la consola interactiva de Python:
Vemos en la imagen entonces que en la consola hemos definido una clase de formulario y dentro hemos colocado dos campos, así evitamos instanciar desde un modelo, el primero campo cod le decimos que es un campo IntegerField, con ello será validado a solo números al momento del submit, pero lo que nos interesa es el segundo campo, este le decimos que tiene un widget y que es un forms.Textarea, si nos fijamos lo hemos definido como un CharField, esto nos indica que en el HTML debería ser un input text sin embargo con el widget lo hemos cambiado, al ver el HTML resultante tenemos que es un textarea de HTML.
Si queremos definir un campo con un widget personalizado podemos declarar una clase con un tipo de input y este luego colocarlo dentro del formulario, veamos este código para que entendamos:
class PorcentajeInput(forms.TextInput): def render(self, name, value, attrs=None): return '%s %%' % super(PorcentajeInput, self).render(name, value, attrs)
Luego en el formulario lo llamamos:
descuento = forms.IntegerField(widget=PorcentajeInput())
Como pudimos ver es bastante sencillo agregar nuevos tipos de widgets a nuestra aplicación.