Tal es el control, que podemos aplicar algunas técnicas de programación en las cuales nos permitiremos almacenar y procesar datos de diferentes widgets y dárselos a Django como si fuese un dato de una sola fuente.
Dividir los datos entre varios Widgets
El funcionamiento de esto se puede lograr utilizando el método render() del widget, entonces podemos tener un campo y al procesarlo lo dividimos en varios inputs HTML, cada uno conteniendo una pieza del valor que necesitamos almacenar.
MultiWidget
Como el ejemplo que indicamos anteriormente es algo bastante tedioso ya que tendríamos que ocuparnos de escribir demasiadas rutinas y métodos que nos ayuden con la validación, en Django ya se ha pensado en esto y tenemos unas utilidades que nos hacen gran parte de este trabajo.
Este método está hecho para trabajar en conjunto con MultiWidget quien se encargará de traducir a HTML todo lo que hemos definido previamente en la clase del formulario.
Veamos a continuación un la imagen de un código de ejemplo donde hemos implementado estos conceptos:
Aquí vemos como primero hemos definido una clase que hereda de MultiWidget, en ella indicamos que vamos a tener dos campos InputText asociados y establecemos un método decompress() que es el que va a separar los valores para su presentación.
En la siguiente clase establecemos un poco más de elementos, primero le indicamos que debe heredar de MultiValueField luego le indicamos que widget debe utilizar y por supuesto le vamos a indicar que use el widget ya definido anteriormente.
Luego en su método __init__ le indicamos los tipos de campos que llevará y por último definimos el método compress(), vemos que aparte del self recibe también un parámetro data_list, en este vamos a pasar la lista de los datos que deben ser combinados y los regresamos como una tupla, aprovechamos también de validarlos para evitar recibir datos erróneos que puedan atentar contra nuestra aplicación.
Con esto finalizamos este tutorial viendo como tenemos una herramienta bastante avanzada que nos permite personalizar un poco más nuestros formularios en nuestra aplicación en tan solo sencillos pasos.