Blog
Ampliar la aplicación – Django
- Publicado por: Rafael Fernandez
- Categoría: Curso Desarrollo Web Django
-Aprenderemos a elaborar un enlace entro de la plantilla, con su código de ejemplo.
-Veremos como solventar errores sobre la marcha en las plantillas.
-Mostraremos como se hace su implementacion.
Elaborar un enlace dentro de la plantilla
Se comenzará primeramente agregando un link dentro del archivo de
Vamos a empezar añadiendo un enlace dentro del blog/templates/blog/post_list.html. Por ahora tendría que tener el siguiente aspecto:
</pre> {% extends 'blog/base.html' %} {% block content %} {% for post in posts %} <div class="post"> <div class="date"> {{ post.published_date }} </div> <h1><a href="">{{ post.title }}</a></h1> <p>{{ post.text|linebreaksbr }}</p> </div> {% endfor %} {% endblock %} <pre>
Si se desea cargar un enlace a otro sitio con detalles en cuanto al título del artículo (post). Se deberá cambiar <h1><a href=””>{{ post.title }}</a></h1> dentro del enlace:
<h1><a href="{% url 'blog.views.post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
Es momento de enseñar el misterio que existe en {% url ‘blog.views.post_detail’ pk=post.pk %}. Quizás se sospeche, toda notación {% %} sugiere que se está manejando Django template tags. Es momento de manejar uno que se debe crear con una dirección URL para mayor comodidad. blog.views.post_detail se trata de una ruta que va hacia post_detail view el cual se debe elaborar.
Tener consideración que: blog es como se ha designado la aplicación (el blog de directorio), views vendría siendo el nombre del views.py y post_detail se designó el view.
En el momento que se accede a: http://127.0.0.1:8000/ existirá una falla (como es normal, debido a que no hay una URL o vie para post_detail). Se vería de esta forma:
Es por ello que se creará una URL en urls.py para el view post_detail
URL: http://127.0.0.1:8000/post/1/
Lo que se pretende es ir creando la URL que señale a Django a esa view designada como post_detail, se encargará de mostrar una entrada en el blog.
Añadir la línea url (r’^post/(?P<pk>[0-9]+)/$’, views.post_detail), al archivo blog/urls.py. Tendría que tener el siguiente semblante:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.post_list), url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail), ]
Es posible que dé un tanto de miedo, pero no hay por qué inquietarse ya que se explicará ahora mismo:
- Empieza nuevamente con ^, “desde el comienzo”.
- post/Esto sugiere que luego del inicio, la dirección URL debería cargar con la palabra post (artículo) y /. Por ahora, todo bien.
- (?P<pk>[0-9]+)– Es la parte compleja del proceso. Sugiere que Django tendrá que cargar todo lo que se ponga allí y lo lleve a una vista siendo lo más semejante a una variable desinada pk. [0-9] también, asimismo, sugiere que sólo debe ser un digito y no una letrea (es decir que debiese estar entre 0 y 9). + quiere decir que debe existir uno o más números. Es allí donde algo parecido a http://127.0.0.1:8000/post// no es correcto, sin embargo, http://127.0.0.1:8000/post/1234567890/ es completamente aceptable.
- /- Es allí donde se necesitará / nuevamente
- $- ¡”la meta”!
Es decir que si se accede a http://127.0.0.1:8000/post/5/ desde el navegador, Django comprenderá que se está en la búsqueda de la view designada post_detail y pasará todos los datos de pk que es lo mismo a 5 a esa view.
pk vendría siendo la abreviatura de primary key. Dicho nombre es utilizado usualmente en diversos trabajos en Django. Sin embargo, se le puede designar la variable como se prefiera (tener presente que se usan minúsculas y _ en vez de utilizar espaciados) Es decir que en vez de (?.¿P<pk>[0-9]+) se puede usar la variable y se vería más o menos así: (?P <post_id>[0-9]+).
Lo que sigue es actualizar el sitio: http://127.0.0.1:8000/ ¡y listo! No obstante, se apreciará otro error como era obvio.
Hay que hacer memoria y recordar el siguiente paso el cual es añadir la view.
post_detail view
En esta ocasión la view cogerá un ajuste anexo pk.
La view requiere recibirla, ¿verdad? Lo que hay que hacer es definir la función como def post_detail (request, pk):. Hay que tener en cuenta que se debe utilizar el mismo nombre que se concretó en las urls (pk). Asimismo, hay que omitir la variable porque es incorrecta y terminará siendo un error. Por ahora, se pretende que únicamente existe un post (artículo) en el blog. Para eso se podrá usar la querysets, parecido a este:
Post.objects.get(pk=pk)
Sin embargo, dicho código carga con un inconveniente. En caso de que no exista algún Post con llave primaria (pk) aparecerá un error bastante malo.
Y eso es lo que menos se pretende, pero claro, Django trae consigo algo para poder solucionar dicho inconveniente y hacer el trabajo más fácil: get_object_or_404. Para que no exista algún Post con el dado pk se exhibirá una más atractiva página (Page Not Found 404).
Lo bueno de todo esto es que se puede hacer la misma página de Not Found y añadir el diseño que se desee. Sin embargo, eso no es tan relevante, por lo que se omitirá.
Ahora es el momento de añadir una view al archivo de views.py
Se debería abrir blog/views.py para poder añadir el código mostrado a continuación:
from django.shortcuts import render, get_object_or_404
Próxima a otras líneas from. Y en la culminación de dicho archivo se agregará la view:
def post_detail(request, pk): post = get_object_or_404(Post, pk=pk) return render(request, 'blog/post_detail.html', {'post': post})
Ahora es el momento de actualizar el sitio: http://127.0.0.1:8000/
Todo en orden, sin embargo ¿Qué sucede en el momento que se hace clic en algún link del título de un artículo (post)?
Pues, aparecerá otro error. Sin embargo, ya se sabe la manera de tratarlo ¿no? Lo que hay que hacer es agregar una plantilla.
Se creará un archivo en blog/templates/blog designado post_detail.html.
Y se vería de la siguiente forma:
{% extends 'blog/base.html' %} {% block content %} <div class="post"> {% if post.published_date %} <div class="date"> {{ post.published_date }} </div> {% endif %} <h1>{{ post.title }}</h1> <p>{{ post.text|linebreaksbr }}</p> </div> {% endblock %}
Cuando ya se haya expandido la base.html. Dentro del bloque content se desea exhibir el periodo en el que fue publicado (en caso de existir), el título y todo el contenido existente en los artículos (posts).
Sin embargo, se debería parlamentar varios puntos relevantes, ¿no?
{% if … %} … {% endif %} se trata de un template tag el cual se puede utilizar en el momento que se desee y ver algo. Dentro del contexto siguiente se pretende corroborar si el campo de published_date de un artículo (post) no permaneció vacío.
Lo que sigue será actualizar el sitio web para ver si Page Not Found se marchó.
Listo, ya todo marcha bien.
Una última cosa, es momento de la implementación
Lo mejor para esto es corroborar que la página web todavía trabaja perfectamente en PythonAnywhere, ¿verdad? Así que se intentará desplegar nuevamente.
$ git status $ git add --all . $ git status $ git commit -m "Added views to create/edit blog post inside the site." $ git push
- Después, en la consola Bash de PythonAnywhere
$ cd my-first-blog $ git pull [...]
- Para terminar, ve a la pestaña web y hacer clic en Reload.
Con eso todo debería estar en orden y has completado este tema.