Django 2. Antonio Melé

Чтение книги онлайн.

Читать онлайн книгу Django 2 - Antonio Melé страница 19

Автор:
Серия:
Издательство:
Django 2 - Antonio Melé

Скачать книгу

inapropiados de manera manual. El campo created lo utilizará para ordenar los comentarios de manera cronológica por defecto.

      El nuevo modelo Comment que acaba de crear no está sincronizado con la base de datos. Va a ejecutar el siguiente comando para generar una nueva migración que refleje la creación de un nuevo modelo:

Illustration

      A continuación debería ver por salida:

Illustration

      Django ha generado el fichero 0002_comment.py dentro del directorio migrations/ de la aplicación blog. Ahora es necesario crear un esquema y aplicar los cambios a la base de datos. Para ello ejecute:

Illustration

      La salida obtenida debería ser semejante a esta:

Illustration

      La migración que acaba de crear se ha aplicado, apareciendo la tabla blog_comment.

      Ya puede añadir el nuevo modelo al panel de administración para poder gestionar comentarios a través de esta sencilla interfaz. Abra el fichero admin.py de la aplicación blog, importe el modelo Comment y añada la clase ModelAdmin:

Illustration

      Arranque el servidor con el comando python manage.py runserver y abra la URL http://127.0.0.1:8000/admin/ en el navegador. En este punto debería aparecer la sección BLOG como se muestra en la imagen:

Illustration

      El modelo está registrado en el panel de administración y puede gestionar instancias Comment a través de la interfaz.

      Seguirá necesitando elaborar un formulario para que los usuarios puedan escribir comentarios de un artículo del blog. Recuerde que Django dispone de dos clases base para construir formularios: Form y ModelForm. Ya ha utilizado la primera anteriormente para permitir a los usuarios compartir artículos vía email. En este caso, va a utilizar la clase ModelForm para crear un formulario dinámicamente a partir del modelo Comment. Edite el fichero forms.py de la aplicación blog con las siguientes líneas:

Illustration

      Para crear un formulario a partir de un modelo, necesitamos indicar qué modelo usar para la construcción del formulario en la clase Meta de este último. Django inspecciona el modelo y construye un formulario dinámicamente por usted. Cada tipo de campo del modelo tiene su correspondiente tipo de campos de formulario. La manera en que defina los campos de los modelos se tendrá en cuenta para la validación de los formularios. Por defecto, Django construye un campo de formulario por cada campo del modelo. Sin embargo, puede indicar explícitamente qué campos quiere incluir en el formulario con la lista fields o definir qué campos quiere excluir con la lista exclude. Para el formulario CommentForm, ha usado los campos name, email y body porque estos son los campos que los usuarios podrán rellenar.

      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:

Illustration Illustration

      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:

Illustration

      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:

Illustration

      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.

      Illustration 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:

Illustration

      3. Por último, guardará el nuevo comentario a través de la llamada al método save():

Illustration

      La nueva vista está lista para mostrar y procesar comentarios.

      Una vez creada la funcionalidad para gestionar comentarios para un artículo, es necesario adaptar la plantilla post/detail.html para:

      • Mostrar el total de comentarios relacionados con artículos.

      • Mostrar la lista de comentarios.

      • Mostrar un formulario a los usuarios para añadir un comentario nuevo.

      Lo primero que hará será añadir el número total de comentarios. Para ello editará la plantilla post/detail.html y añadirá el siguiente contenido al bloque content:

Illustration

Скачать книгу