Saltar a contenido

Tercera App [Services] Vista y template

En esta segunda parte te enfocarás en crear la vista y su respectivo template:

  • Crea algunos servicios de prueba utilizando el panel de administrador, puedes utilizar los servicios del frontend y sus imágenes (directorio img) del frontend.
  • Traslada el template services.html a un directorio templates/services en su propia app.
  • Traslada la vista services a su propia app (no olvides borrar su path en las urls de core) y renderiza el template anterior. Llámala como quieras pero evita el nombre services ya que es redundante con el de la propia app y puede llevar a errores.
  • Configura la vista que has creado en un fichero urls.py de app (services/urls.py) tal como hicimos con la app Core en las urls del proyecto, de manera que funcione en la url /services de la web.
  • Finalmente fusiona el template para que muestre los servicios creados en el panel de administrador.

Solución

Básicamente voy a hacer un copiar y pegar de lo que tengo en el frontend:

Me llevo el template a su propio directorio de la app:

Me llevo la vista a la nueva app y muestro el nuevo template: services/views.py

from django.shortcuts import render

def services(request):
    return render(request, "services/services.html")

Configuro las urls de app y en el proyecto (borro services de core/urls): services/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.services, name="services"),
]
webempresa/urls.py
urlpatterns = [
    path('', include('core.urls')),
    path('blog/', include('blog.urls')),
    path('services/', include('services.urls')),
    path('admin/', admin.site.urls),
]

Compruebo que todo funcione:

Finalmente realizo la fusión, tomando los servicios en la vista y pasándolos al template: services/views.py

from django.shortcuts import render
from .models import Service

def services(request):
    services = Service.objects.all()
    return render(request, "services/services.html", {'services':services})

Y con un bucle for muestro todos los servicios siguiente la plantilla. Por defecto aparecen ordenados de más nuevos a más antiguos, pero (podemos usar el reversed en el propio template para voltear la lista, cuestión de gustos):

services/templates/services/services.html

{% extends 'core/base.html' %}

{% load static %}

{% block title %}Servicios{% endblock %}

{% block content %}

{% for service in services reversed %}
    <section class="page-section">
    <div class="container">
        <div class="product-item">
        <div class="product-item-title d-flex">
            <div class="bg-faded p-5 d-flex mr-auto rounded">
                <h2 class="section-heading mb-0">
                    <span class="section-heading-upper">
                        {{service.subtitle}}
                    </span>
                    <span class="section-heading-lower">
                        {{service.title}}
                    </span>
                </h2>
            </div>
        </div>
        <img class="product-item-img mx-auto d-flex rounded img-fluid mb-3"
            src="{{service.image.url}}" alt="">
        <div class="product-item-description d-flex ml-auto">
            <div class="bg-faded p-5 rounded">
                <p class="mb-0">{{service.content}}</p>
            </div>
        </div>
        </div>
    </div>
    </section>
{% endfor %}

{% endblock %}

Con esto hemos completado nuestra tercera app del curso.


Última edición: 30 de Octubre de 2018