Personalización de los comentarios de Django Comments Xtd Javascript Plugin

By Sergei Alekseev(Fullstack Developer) on Junio 16 2020

Views

9500

#django#tutorial#react

La introducción

Cuando alcancé el punto donde necesito integrar un sistema de comentarios a este blog he decidido elegir django-comments-xtd. Eso cumple todos mis requisitos: buena documentación, funcionalidad integral y tiene un plugin de javascript que funciona por api. Para personalizarlo necesitará descargar todo el repositorio como lo que se menciona en el tutorial de la documentación. Pero no quería descargar todo el repositorio a mi proyecto para editar solamente una pequeñita parte de eso para mis propósitos. Entonces en este tutorial aprenderemos a personalizarlo sin descargar todo el repositorio.

Si quiere saltarse el tutorial puede ir al repositorio y revisar el commit que se hizo para este tutorial.

La configuración

Necesitaremos node.js luego. Antes de empezar, por favor, asegúrate de tener npm instalado.

Usaré la base lista para el blog basada en este tutorial de Django Central. Totalmente te recomiendo estudiar el tutorial antes de empecemos trabajar aquí.

Puse un tag 'v1.0.0' a mi repositorio - la versión de la base en la que vamos a aplicar nuestros cambios para que django-comments-xtd funcione.

Clona el repositorio a tu PC por el comando de git de terminal:

git clone --branch v1.0.0 [<https://github.com/salvicode/django_test_blog.git>](<https://github.com/salvicode/django_test_blog.git>)

Y luego va a la carpeta creado por git django_test_blog:

cd django_test_blog

Vamos a crear un entorno virtual para este tutorial para aislar esto y para no mezclar con otras cosas en que probablemente estamos trabajando usando python. Si no tienes un entorno virtual y no sabes que es eso, te recomiendo que vayas a estudiar la información sobre esto. Para crear un entorno virtual ejecuta el siguiente:

virtualenv venv

Este comando creará un entorno virtual en la carpeta venv. Puedes ver el contenido de esa carpeta si te interesa. Ahora necesitamos activar este entorno:

source venv/bin/activate

Ahora en tu terminal deberías ver (venv) antes de tu cuenta o antes de la carpeta django_test_blog (es dependiente de tus configuraciones de terminal). En mi caso eso es así:

He personalizado mi terminal. Quizás escribe algo sobre esto luego.

Ahora vamos a instalar las dependencias para este proyecto. Ejecuta el comando siguiente:

pip install -r requirements.txt

Este comando instalara todos los requisitos necesarios. Probablemente notarás algunos errores sobre astroid 2.3.3. Simplemente ignóralo. Eso se usa para "linting" de python que no es importante en este tutorial.

Estamos listos. Pasemos a la carpeta test_blog:

cd test_blog

Y preparemos nuestros modelos de la aplicación de blog, etc con los comandos siguientes:

python manage.py migrate

Comprobemos si todo funciona bien:

python manage.py runserver

Si todo está bien deberías poder abrir nuestra aplicación en http://localhost:8000/:

Blog main page

Ahora para el servidor pulsando las teclas CTRL+C en el terminal.

Necesitamos crear un superuser para administrar nuestros artículos de blog. Ejecuta el siguiente:

python manage.py createsuperuser

Y luego ingrese el nombre de usuario, el email, la contraseña. Usualmente eso admin, admin@admin.com, admin como credenciales con fines de prueba. En este caso te avisará que la contraseña es demasiado debil. Simplemente ingresa Y.

Ahora ejecuta el servido otra vez

python manage.py runserver

Y va a http://localhost:8000/admin. Inicia sesión con los credenciales que hemos creado antes. Encuentra la sección "Blog", la fila "Posts" y haz clic "Add". O puedes ir aquí http://localhost:8000/admin/blog/post/add/. Crea tu post de ejemplo, pone estatus "Publish". Usé lorem ipsum para generar un contenido ficticio.

He creado el Post "My awesome post", así que el link debería ser http://localhost:8000/my-awesome-post/. O puedes encontrar tu post nuevo en la página principal.

Django first post

Estamos listos completamente. Vamos a integrar django-comments-xtd.

Django-comments-xtd

Primero, vamos a instalarlo:

pip install django-comments-xtd

Vamos a usar django-comments-xtd por api asi que instalemos Rest Framework:

pip install djangorestframework

Abra el archivo test_blog/settings.py, encuentra INSTALLED_APPS y agrega la aplicacion de comentarios:

INSTALLED_APPS = [
		...

		'django.contrib.sites',
		'rest_framework',
    'django_comments_xtd',
    'django_comments',
]

Los comentarios de Django requieren django.contrib.sites

Y en el algún lado al final del archivo settings.py:

...
COMMENTS_APP = 'django_comments_xtd'
COMMENTS_XTD_CONFIRM_EMAIL = False

Para propósitos de prueba, ahora deshabilité la confirmación por correo electrónico.

Abra el archivo test_blog/urls.py y agrega la ruta de la URL de la configuración para los comentarios:

from django.views.i18n import JavaScriptCatalog  # También agrega este import

urlpatterns = [
    path('admin/', admin.site.urls),
    path('comments/', include('django_comments_xtd.urls')),  # Esta línea se debe agregar
		path(r'jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'),  # Esta línea se debe agregar
    path('', include('blog.urls')),
    path('summernote/', include('django_summernote.urls')),
    path("sitemap.xml", sitemap, {"sitemaps": sitemaps}, name="sitemap"),
		#path('',views.index, name="homepage"),
]

Tenga en cuenta que las líneas de ruta agregadas deben estar arriba de path('', include('blog.urls')), de lo contrario, el solucionador de URL se perderá en blog.urls y no estará disponible para encontrar la ruta correcta.

Ahora vamos a modificar nuestro marcado. Abra el archivo templates/post_details.html. Borra todos los bloques div que se encuentran abajo.

{% block sidebar %} {% include 'sidebar.html' %} {% endblock sidebar %}

Nosotros borramos el sistema viejo de comentarios. Y vamos a agregar un bloque responsable del sistema nuevo de comentarios. Detrás del bloque card-body agrega el siguente:

<div id="comments"></div>

Reemplaza la línea {% load crispy_forms_tags %} con:

{% load static %}
{% load comments %}
{% load comments_xtd %}

Y agrega en el final de post_detail.html:

{% endblock content %}

{% block extra-js %}
<script crossorigin src="<https://unpkg.com/react@16/umd/react.production.min.js>"></script>
<script crossorigin src="<https://unpkg.com/react-dom@16/umd/react-dom.production.min.js>"></script>
<script>
 window.comments_props = {% get_commentbox_props for post %};
 window.comments_props_override = {
     allow_comments: true,
     allow_feedback: true,
     show_feedback: true,
     allow_flagging: true,
     poll_interval: 5000  // In milliseconds.
 };
</script>
<script
  src="<https://code.jquery.com/jquery-3.3.1.min.js>"
  crossorigin="anonymous"></script>
<script
  src="<https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js>"
  integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
  crossorigin="anonymous"></script>
<script
  src="<https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js>"
  integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy"
  crossorigin="anonymous"></script>
<script
  type="text/javascript"
  src="{% url 'javascript-catalog' %}"></script>
<script src="{% static 'django_comments_xtd/js/vendor~plugin-2.6.0.js' %}"></script>
<script src="{% static 'django_comments_xtd/js/plugin-2.6.0.js' %}"></script>
<script>
$(function() {
  $('[data-toggle="tooltip"]').tooltip({html: true});
});
</script>
{% endblock %}

Todo eso se tomó de la documentación oficial. La única cosa lo que modifique es yo cambie object a post, y puse allow_comments: true porque nuestro modelo de post no tiene el campo allow_comments.

Una cosa más. Abra el archivo templates/base.html y delante del elemento <footer> agrega el siguiente:

{% block extra-js %}
{% endblock extra-js %}

Y en el principio de base.html agrega:

{% load i18n %}

Vamos a comprobar si todo funciona. Ejecuta:

python manage.py migrate

Esto actualizará nuestra base de datos con nuevos modelos de comentarios y agregará nuevos modelos del sitio.

Y luego ejecuta el servidor:

python manage.py runserver

Comproba la pagina del articulo en http://localhost:8000/my-awesome-post/. Deberías ver la forma de comentario:

Post Comment Authenticated

La captura de pantalla anterior muestra la forma de usuario autenticado. Si no has cerrado la sesión de la página de admin deberías ver la misma forma.

Ahora vamos a agregar nuestro comentario de prueba, ingresa tu primer comentario y haz clic "send"(enviar):

First Comment

Si hicimos todo correctamente debería funcionar bien. El comentario se debería agregar. También puedes cerrar sesión de la página de admin. O simplemente va a http://localhost:8000/admin/logout/ y actualiza la página del articulo. Ahora deberías ver otra forma:

Post comment not authenticated

Intentemos agregar un comentario cuando estamos no autenticados. Ten en cuenta que el enlace aquí debe tener el formato http(s)://www.test.com. De otra manera te muestra un error que realmente no es claro que el enlace no es correcto.

Estamos listos para personalizar el marcado de los comentarios.

La personalización

Si abras post_detail.html puedes encontrar allí:

<script src="{% static 'django_comments_xtd/js/vendor~plugin-2.6.0.js' %}"></script>
<script src="{% static 'django_comments_xtd/js/plugin-2.6.0.js' %}"></script>

vendor~plugin-2.6.0.js y plugin-2.6.0.js son las versiones empacadas de la logica de comentarios que se escribieron en React framework. El código fuente se encuentra en la biblioteca django-comments-xtd :

django_test_blog/venv/lib/python3.7/site-packages/django_comments_xtd/static/django_comments_xtd/js/src

En mi caso la carpeta del proyecto se llama django_test_blog (lo mismo que el nombre del repositorio). Estoy usando python3.7. En tu caso la carpeta se puede llamar diferente dependiente de la version de python.

Déjame explicar la idea principal aquí: copiaremos el código fuente de los comentarios(la parte de front end) a nuestra aplicación, lo editaremos, lo compilaremos y lo usaremos.😉

Vamos a copiar la carpeta src a test_blog/frontend/django_comments_xtd/src . Si estás en la carpeta raíz del proyecto puedes ejecutar el comando:

mkdir -p "test_blog/frontend/django_comments_xtd" && cp -r "venv/lib/python3.7/site-packages/django_comments_xtd/static/django_comments_xtd/js/src" "test_blog/frontend/django_comments_xtd/src"

Ahora necesitamos robar algunos archivos del repositorio django-comments-xtd:

https://github.com/danirus/django-comments-xtd/blob/master/.babelrc

https://github.com/danirus/django-comments-xtd/blob/master/package.json

https://github.com/danirus/django-comments-xtd/blob/master/webpack.config.js

Cópialos a frontend/django_comments_xtd:

wget "<https://raw.githubusercontent.com/danirus/django-comments-xtd/master/.babelrc>" -P "test_blog/frontend/django_comments_xtd/" \\
&& wget "<https://raw.githubusercontent.com/danirus/django-comments-xtd/master/package.json>" -P "test_blog/frontend/django_comments_xtd/" \\
&& wget "<https://raw.githubusercontent.com/danirus/django-comments-xtd/master/webpack.config.js>" -P "test_blog/frontend/django_comments_xtd/"

Ahora tenemos la configuración para empacar el código fuente de los comentarios.

Vamos a estudiar y modificar webpack.config.js. Reemplacé el nombre STATIC_DIR a OUTPUT_DIR porque eso es más claro para mí y también yo cambié las rutas al siguiente:

const OUTPUT_DIR = path.resolve(__dirname, '../../static/django_comments_xtd/js');
const SOURCE_DIR = path.resolve(__dirname, 'src');

Y también no te olvides de reemplazar todos los STATIC_DIR a OUTPUT_DIR.

Acabamos de establecer las instrucciones para webpack para construir el código fuente de los comentarios que se encuentra en SOURCE_DIR y poner el resultado a OUTPUT_DIR.

npm, ¡ahora es tu turno! Va a test_blog/frontend/django_comments_xtd y ejecuta:

npm install

Ahora vamos a empacar nuestro código fuente de los comentarios. Ejecuta:

npm run build

Abra post_detail.html y reemplaza:

<script src="{% static 'django_comments_xtd/js/vendor~plugin-2.6.0.js' %}"></script>
<script src="{% static 'django_comments_xtd/js/plugin-2.6.0.js' %}"></script>

A:

<script src="{% static 'django_comments_xtd/js/vendor~plugin-2.6.1.js' %}"></script>
<script src="{% static 'django_comments_xtd/js/plugin-2.6.1.js' %}"></script>

Básicamente usaremos la versión que se creó por npm y webpack.

Para verificar que usamos nuestra versión vamos a hacer un cambio en el archivo frontend/django_comments_xtd/src/commentform.jsx. Desplácate hasta la parte inferior del archivo, debería haber el método render(). Busca la línea con

var label = django.gettext("Post your comment"); 

Y cámbialo a:

var label = django.gettext("Post your AWESOME comment");

En la carpeta test_blog/frontend/django_comments_xtd ejecuta:

npm run build

En la carpeta test_blog ejecuta:

python manage.py runserver

Ahora va a la pagina de tu articulo(http://localhost:8000/my-awesome-post/), Desplácate hasta la parte inferior y verifica si funciona:

Post Comment not modified

Ahora quiero cambiar el marcado un poco: poner Comment Text Area en la parte abajo de los campos Name, Mail y Link.

Va a commentform.jsx, encuentra render_form() :

return (
      <form method="POST" onSubmit={this.handle_submit}>
        <input type="hidden" name="content_type"
               defaultValue={this.props.form.content_type}/>
        <input type="hidden" name="object_pk"
               defaultValue={this.props.form.object_pk}/>
        <input type="hidden" name="timestamp"
               defaultValue={this.props.form.timestamp}/>
        <input type="hidden" name="security_hash"
               defaultValue={this.props.form.security_hash}/>
        <input type="hidden" name="reply_to"
               defaultValue={this.state.reply_to}/>
        <fieldset>
          <div style={{display:'none'}}>
            <input type="text" name="honeypot" defaultValue=""/>
          </div>
          {comment} {name} {mail} {url} {followup} // Here we have our order of layout
        </fieldset>
        
        <div className={btns_row_class}>
          <div className="offset-md-3 col-md-7">
            <button type="submit" name="post"
                    className={btn_submit_class}>{btn_label_send}</button>&nbsp;
            <button name="preview" className={btn_preview_class}
                   onClick={this.handle_preview}>{btn_label_preview}</button>
          </div>
        </div>
      </form>
    );

Vamos a mover {comment} después de followup y ejecutar:

npm run build

Luego va a la carpeta test_blog y ejecuta:

python manage.py runserver

Si ya lo estas ejecutando simplemente necesitas actualizar la pagina en tu browser:

Post Comment Plugin Modified

Básicamente eso es todo.

La conclusión

Eso fue los básicos de personalizar django-comments-xtd. Para continuar editando necesitarás algunos básicos conocimientos de React + javascript y HTML. Es muy sencillo realmente. En los comentarios abajo puedes ver como yo lo personalicé.

La cosa más compleja fue la integración de reCAPTCHA a los comentarios. Preparé un tutorial pequeño basado en eso.

El código fuente se encuentra aquí.

Bajo construcción

Usualmente un blogger pone aquí algunos artículos relativos. Estoy trabajando en crear más contenido interesante. Tan pronto como tengo algun contenido relativo implementaré algo de lógica aquí. A continuación puede encontrar algunos comentarios. Si no hay nada, es tu oportunidad de dejar el primer comentario:) PS.Me alegra que esté aquí y lea esto^^

Sergei Alekseev

Fullstack Developer

Discusión