Читать книгу Django 2 - Antonio Melé - Страница 51
Funcionamiento de ModelForms en vistas
ОглавлениеLa idea consiste en utilizar la vista de detalle de artículos para instanciar un formulario y procesarlo de una forma sencilla. Para ello, edite el fichero views.py, importe el modelo Comment y el formulario CommentForm, y modifique la vista post_detail del siguiente modo:
Revise lo que ha añadido a la vista. La vista post_detail muestra el artículo y los comentarios del mismo. Se ha añadido un QuerySet para recuperar todos los comentarios activos para este artículo con la siguiente sentencia:
Este QuerySet está construido a partir del objeto post. Se ha utilizado el gestor para objetos relacionados que se define como comments a través del atributo related_name de la relación con el modelo Comments.
Se ha usado la misma vista para permitir a los usuarios añadir nuevos comentarios. Por esta razón se inicializa la variable new_comment con valor None. Esta variable la utilizará con la creación de un nuevo comentario. En caso de que la petición sea tipo GET, se instancia un formulario con comment_form = CommentForm(). Si la petición es de tipo POST, la instanciación del formulario se realiza con los datos enviados y la validación se lleva a cabo con el método is_valid(). Si el formulario es inválido, en la renderización de la plantilla aparecerán la validación de errores. Si, por el contrario, es válido, se realizan las siguientes acciones:
1. Se crea un nuevo objeto Comment llamando al método save() del formulario y asignándolo a la variable new_comment:
El método save() crea una instancia del modelo con el que el formulario está relacionado y lo guarda en la base de datos. Si invocamos el método con el parámetro commit=False, se creará la instancia, pero no se salvará en la base de datos. Esto es útil cuando se quiere modificar el objeto antes de guardarlo definitivamente.
El método save() está disponible para ModelForm pero no para Form, ya que este último no está relacionado con un modelo.
2. Asignará el artículo actual al comentario que acaba de crear con:
3. Por último, guardará el nuevo comentario a través de la llamada al método save():
La nueva vista está lista para mostrar y procesar comentarios.