Curso Python DGA 2011/django/forms

Primer formulario
Vamos a actualizar la plantilla del detalle (encuesta/detalle.html) para que tenga una etiqueta Mirando el código:
 * Se usa un radio button para cada opción de la encuesta. El valor de cada opción está asociado al de su id. El nombre de los radio es opcion, así cuando un usuario selecciona una opción y pulsa el botón de votar, envia por POST la información opcion=3 (con el número de id elegido)
 * La acción del formulario es /encuestas//votar. Los datos se envían por POST. Muy importante porque enviar datos al servidor puede alterar el estado (a diferencia de GET)
 * el forloop.counter indica cuántas veces ha entrado en el bucle.
 * Se usa {% csrf_token %} para evitar Cross Site Request Forgeries. Importante usarlo siempre con POST. Para permitir el trabajo de csrf hay que añadir un método a la vista detalle.

Acción del formulario
Según la entrada de URLconf, cuando ejecutamos la acción de votar, se llama a la función votar, que gestiona los datos enviados y hace algo con ellos: (r'^(?P\d+)/votar/$', 'votar')

La acción puede quedar así:

Algunas cosas que todavía no hemos visto:


 * request.POST es un objeto tipo diccionario que permite acceder a los datos enviados por su clave (request.POST['opcion'] devuelve el ID de la opción seleccionada como una cadena) Los valores de request.POST son siempre cadenas.
 * Django también proporciona request.GET para acceder a los datos pasados por GET.
 * request.POST['opcion'] lanza una excepción KeyError si no se envía esa información en POST. Por eso se trata la excepción.
 * Después de incrementar el contador de la opción, el código devuelve un HttpResponseRedirect en lugar de un HttpResponse como hace normalmente.
 * Se usa la función reverse para evitar escribir a mano la URL en la vista. Parámetros: vista y argumentos.

La vista resultado puede ser así: Y la plantilla resultado.html:

Vistas genéricas: ¡todavía menos código!!
Hay tareas muy repetitivas en el desarrollo web: obtener datos de la base de datos, según unos parámetros de una URL, cargar una plantilla y devolver la plantilla procesada. Django proporciona un atajo llamado sistema de generic views. Para convertir nuestra aplicación al uso de vistas genéricas hay que:
 * Convertir el URLconf.
 * Eliminar algunas vistas innecesarias.
 * Corregir la gestión de las URLs por la nuevas vistas

En un proyecto decidiremos antes si es conveniente el uso de vistas genéricas (mejor que refactorizar)

Modificar encuestas/urls.py URLconf
Vamos a usar dos vistas genéricas: ListView y DetailView. Cada vista tiene que conocer: return HttpResponseRedirect(reverse('resultado_encuesta', args=(enc.id,)))
 * el modelo sobre el que actúa (model)
 * DetailView necesita la clave primaria, llamada pk.(hay que cambiar encuesta_id a pk)
 * El nombre resultado_encuesta de la vista resultado sirve para referirse a esta URL después.
 * Por defecto la plantilla de DetailView se llama / _detail.html. en nuestro caso será: encuestas/encuesta_detail.html Se puede usar el argumento template_name
 * La plantilla de ListView se llama por defecto _list.html
 * El contexto lo gestiona de forma autmática generando encuesta_list. La copción context_object_name permite especificar ultimas_encuestas.
 * Podemos eliminar ya las vistas creadas: index, detalle, resultado.
 * Sobre la redicrección: