En el último artÃculo describÃamos Codenerix GenList para comenzar a usar los listados de CODENERIX. Ha llegado el momento de ver como crear, ver, actualizar y borrar la información de esos listados.
En primer lugar cabe decir que cada uno hereda de su equivalente en Django de tal modo que GenCreate hereda de CreateView, GenUpdate de UpdateView, GenDetail de DetailView y GenDelete de DeleteView.
Vamos a ver primero como serÃan el modelo de ejemplo que vamos a usar “Contact“:
y su formulario “ContactForm” que heredará de GenModelForm:
from codenerix.forms import GenModelForm
class ContactForm(GenModelForm):
class Meta:
model = Contact
exclude = ['created_by']
def __groups__(self):
return [
(
_(u'Principal'), 6,
['first_name', 6],
['last_name', 6],
['alias', 6],
),
(
_(u'Principal'), 6,
 ['organization', 6],
 ['borndate', 6],
 ['address', 6],
 )
]
@staticmethod
def __groups_details__():
return [
(
_(u'Contact'), 12,
['alias', 12],
['organization', 12],
['borndate', 12],
['address', 12],
)
]
Dado que GenModelForm es nuevo sólo voy a destacar que hereda de BaseModelForm de Django y que lo único que tiene nuevo frente a un ModelForm de Django son los grupos. Los grupos son la definición de cómo deseamos que se vea un formulario en la pantalla y se construye con una lista de tuplas que contienen:
De este modo el formulario indicado arriba quedarÃa como sigue:
Donde los campos están autovalidados en el lado del navegador del usuario y por lo tanto reduce mucho en llamadas al servidor. Dicho formulario explicado con su grupo quedarÃa como sigue:
Para poder hablar con GenCreate y GenUpdate, primero tenemos que hablar de GenModify que es el encargado de gestionar el funcionamiento cuando se crea y se actualiza un registro. No es una vista que usaremos directamente, sin embargo esta clase formará parte de forma indirecta de GenCreate y GenUpdate respectivamente. Dado que la creación y actualización de registro varÃa en cuestiones mÃnimas: el formulario coincide y las validaciones son las mismas, la clase GenModify se encarga de gestionar como actuan GenCreate y GenUpdate en cada caso precargando el formulario con el registro que se está editando en un GenUpdate y en ambos casos almacenando los cambios (nuevos o actualizados) en la base de datos.
Muestra los botones de acción debajo del formulario, por defecto a True.
Â
buttons_bottom = True
buttons_top
Muestra los botones de acción encima del formulario, por defecto a True.
Â
buttons_top = True
extends_base
Contiene la ruta del template base del que heredará el template de List. Generalmente acude a un “base/base.html“, pero cambiando esta variable se puede indicar que cargue otro fichero diferente para ofrecer al usuario una experiencia de entorno diferente.
Al especificar este atributo se añadirá un controlador extra al formulario que servirá para incluir funcionalidades extras accesorias al formulario estándar.
Cuando este atributo está activado se muestra la opción de trabajar los campos con relaciones externas mediante ventanas modales, por defecto este este atributo está a False. En el siguiente ejemplo se pueden ver 2 campos “Marca” y “CategorÃa” en el cual al no existir un elemento seleccionado en “Marca” el sistema muestra un sÃmbolo “+” para añadir un nuevo registro dado que sobre-entiende que ninguno de los que hay en la lista es válido para el usuario para rellenar dicho campo. En caso de existir un elemento seleccionado el sistema muestra un “lápiz” a fin de permitir editar el elemento seleccionado. Ambas “creación” y “edición” ocurren en una ventana modal.
Â
En algunas ocasiones no deseamos ver estos botones dado que no queremos que el usuario acceda a dichas ventanas modales, bien porque visualmente no lo deseamos o bien porque no tiene permisos o no están desarrolladas. Al marcar este atributo como “True” se ocultarán dichos botones.
hide_foreignkey_button = False
json
Devolverá una respuesta en formato JSON, por defecto True.
Â
json = True
json_details
Activará la respuesta detallada en las respuestas JSON, por defecto True.json_details = True
linkback
Muestra el botón “Volver“, por defecto a True.
Â
linkback = True
linkdelete
Muestra el botón “Borrar“, por defecto a True. Este atributo sólo está disponible en los formularios de edición (no está habilitado para los formularios de creación dado que no hay registro que borrar).
Â
linkdelete = True
linksavehere
Muestra el botón “Guardar aquÓ, por defecto a True.
Â
linksavehere = True
linksavenew
Muestra el botón “Guardar y Nuevo“, por defecto a True.
Â
linksavenew = True
show_details
Al finalizar la ejecución del formulario, el sistema tratará de volver al listado, sin embargo si show_details está activada, el sistema acudirá a la vista detalles en vez de al listado.
Â
show_details = True
show_internal_name
Cuando está a True mostrará un tÃtulo en el formulario. Por defecto está activado en los formularios normales y desactivado en los formularios “modales“.
Â
show_internal_name = True
success_url_keys
Un formulario correctamente completado siempre responde con un estado válido y además con un diccionario JSON que contiene al menos 2 claves:
Â
__pk__ que incluye el PK del objeto creado o actualizado
__str__ que contiene la representación en formato texto de dicho objeto creado o actualizado.
El atributo success_url_keys deberá ser una lista de cadenas que pueden tener el siguiente formato:
“key”: será evaluado como si fuese “key:key“
“key1:key2”: será evaluado como answer[key1]=object.key2
success_url_keys = ["id","name:title"]
title
Si show_internal_name está activado se mostrará un tÃtulo, el tÃtulo será calculado automáticamente mediante la mezcla de la acción que puede ser “Añadiendo” o “Editando” y el nombre del formulario. Sin embargo al modificar este atributo, se mostrará directamente el contenido de este atributo evitando que sea autocalculado.
Â
title = _("Nuevo tÃtulo para el formulario")
Estos atributos están disponibles tanto en las vistas de creación como en las de edicción.
GenCreate y GenCreateModal
from codenerix.views import GenCreate, GenCreateModal
class ContactCreate(GenCreate):
model = Contact
form_class = ConctactForm
class ContactCreateModal(GenCreateModal, ContactCreate):
pass
A las vistas a las que les incluyamos un GenCreateModal, conseguiremos que el render se ocupe de preparar el resultado para ser mostrado en una ventana modal. En el fondo lo que realmente ocurre es que añade la marquesita de las ventanas modales de Bootstrap y termina el renderizado en ese punto.
GenUpdate y GenUpdateModal
from codenerix.views import GenUpdate, GenUpdateModal
class ContactUpdate(GenUpdate):
model = Contact
form_class = ContactForm
class ContactUpdateModal(GenUpdateModal, ContactUpdate):
pass
A las vistas a las que les incluyamos un GenUpdateModal, conseguiremos que el render se ocupe de preparar el resultado para ser mostrado en una ventana modal. En el fondo lo que realmente ocurre es que añade la marquesita de las ventanas modales de Bootstrap y termina el renderizado en ese punto.
GenDetail y GenDetailModal
from codenerix.views import GenDetail, GenDetailModal
class ContactDetail(GenDetail):
model = Contact
groups = ContactForm.__groups_details__()
class ContactDetailModal(GenDetailModal, ContactDetail):
pass
GenDetail es una vista que hereda de DetailView de Django y de GenModify, usada para visualizar datos de un objeto. En sus mÃnimos necesita los mismos campos que DetailView, estos son “model” y “form_class“.
A las vistas a las que les incluyamos un GenDetailModal, conseguiremos que el render se ocupe de preparar el resultado para ser mostrado en una ventana modal. En el fondo lo que realmente ocurre es que añade la marquesita de las ventanas modales de Bootstrap y termina el renderizado en ese punto.
Tabla de atributos permitidos por GenDetail
Atributo
Descripción
exclude_fields
Es una lista de campos que serán excluÃdos al renderizar los datos del objeto. GenDetail mostrará siempre todos los campos del objeto, usará (al igual que los formularios) los grupos para mostrar la información organizada mediante estos y el resto de campos irán de forma consecutiva al final del grupo. Sin embargo, si un campo aparece en la lista de exclude_fields, este no será mostrado en la vista de detalles.
Â
exclude_fields = ["contact", "price"]
extra_context
Es un diccionario que contiene información extra que será enviada al template.
groups
Funcionan como los grupos de las vistas de GenCreate y GenUpdate.
linkback
Muestra el botón “Volver“, por defecto a True.
Â
linkback = True
linkedit
Muestra el botón “Editar“, por defecto a True.
Â
linkedit = True
linkdelete
Muestra el botón “Borrar“, por defecto a True. Este atributo sólo está disponible en los formularios de edición (no está habilitado para los formularios de creación dado que no hay registro que borrar).
Â
linkdelete = True
GenDelete
from codenerix.views import GenDelete
class ContactDelete(GenDelete):
model = Contact
Es la vista encargada de borrar los registros. La razón para heredar de GenDelete se debe a que el sistema hace ciertas comprobaciones de seguridad para el borrado del registro incluyendo permisos e integridad que el propio Django no hace. Además responde adecuadamente a los controladores que atienden a la gestión de los formularios.
Cada año durante las vacaciones, como buen informático, aprovecho para leer cosas diferentes y aprender algo nuevo, en esta ocasión he podido estudiar sobre la librerÃa...
It happened some time (years) while I was thinking about the problem of programming languages nowadays. I mean, I was asking questions myself like: – Is there some program...
Interesante y sobretodo bien explicado, buen trabajo 🙂