Skip to content

Django Forms – Sobreescribiendo los valores iniciales de un formulario dinámicamente.

enero 26, 2009
tags: ,

Lo que se quiere:

Mantener el ítem seleccionado dentro de un dropdown list, después de que el usuario realice un submit, se requiere que el campo seleccionado por el usuario se mantenga seleccionado.

Lo que se nos provee por defecto:

Una vez que el cliente presiona submit, los valores de nuestro formulario son restablecidos a los por defecto (campos en blanco y sin selección).

Solución 1:

Guardar el ítem seleccionado en la sesión del usuario (para mayor seguridad), luego; cada vez que se cree el formulario, verificar si existe en la sesión el ítem seleccionado, si existe: entonces pasarlo dentro de los valores iniciales que tomara nuestro formulario.

Ejemplo:

Usaremos un formulario que permita seleccionar un usuario e ingresar/guardar sus horas de trabajo semanales, y que tambien pueda navegar a través de las semanas pasadas y posteriores, para dicha navegación requeriremos que el empleado seleccionado se mantenga seleccionado.

Dentro de nuestro ModelForm sobreescribimos nuestro init:

def __init__( self, request, *args, **kwargs ):
report = None
if ‘do’ in request.POST:
start_date = parsedate(request.POST[‘hidden_start_date’])
else:
if request.session.__contains__(‘employee’):

# En esta sección verifico si esta guardado nuestro empleado seleccionado en la sesión, si es así, obtengo el empleado seleccionado.

employee=request.session.get(‘employee’)
report = TimeReport.objects.extra(where=[‘employee_id=%s’, ‘company_id=%s’, ‘start_week_date=%s’], params=[employee, request.user.client.pk, start_date])

# A continuación sobreescribiremos los valores iniciales de nuestro formulario y le agregaremos como valor inicial que este seleccionado el empleado que sacamos de la sesión.

initial = {‘employee’: employee }
initial.update(kwargs.get(‘initial’, dict()))
kwargs[‘initial’] = initial
super( TimeReportForm, self ).__init__( *args, **kwargs )

Solución 2:

En la vista, verificar si el usuario ha seleccionado un cliente, si es así, crear el formulario y pasarle los valores iniciales (el empleado seleccionado):

if ‘employee’ in request.POST:
form = TimeReportForm(request)
form.initial = {‘employee’: request.POST[‘employee’] }

En esta segunda solución tan simple, existiría varias ventajas y solo una desventaja,

Ventajas:

Menos código, ya no es necesario guardar y recuperar una variable de sesión y tampoco sera necesario realizar operaciones extras.

Desventaja:

La selección del empleado no se recordara durante la vida de la sesión del usuario como ocurre en la primera solución.

DRY – Dont Repeat Yourself, Django esta pensado en facilitarte muchas necesidades muy comunes.

Anuncios
One Comment leave one →
  1. daylin permalink
    mayo 7, 2009 5:19 pm

    Este ejemplo está muy bueno

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: