Saltar a contenido

Sexta App [Pages] Gestor de Páginas

En este punto tenemos nuestro proyecto bastante encaminado, sólo nos falta desarrollar la app para gestionar páginas de contenido secundario (políticas, avisos legales…) y la de contacto para manejar el formulario de contacto.

La app Pages es muy sencilla, pues la estructura de una página consta únicamente de un título y un contenido. Vamos a crearla:

(django2) python manage.py startapp pages

Traducimos el nombre:

pages/apps.py

from django.apps import AppConfig

class PagesConfig(AppConfig):
    name = 'pages'
    verbose_name = 'Gestor de páginas'

Añadimos la configuración extendida:

webempresa/settings.py

'pages.apps.PagesConfig',

Y ahora el modelo Page:

pages/models.py

from django.db import models

class Page(models.Model):
    title = models.CharField(max_length=200, 
        verbose_name="Título")
    content = models.TextField(
        verbose_name="Contenido")
    created = models.DateTimeField(auto_now_add=True, 
        verbose_name="Fecha de creación")
    updated = models.DateTimeField(auto_now=True, 
        verbose_name="Fecha de edición")

    class Meta:
        verbose_name = "página"
        verbose_name_plural = "páginas"
        ordering = ['title']

    def __str__(self):
        return self.title

Creamos un admin básico:

pages/admin.py

from django.contrib import admin
from .models import Page

class PageAdmin(admin.ModelAdmin):
    pass

admin.site.register(Page, PageAdmin)

Migramos:

(django2) python manage.py makemigrations pages
(django2) python manage.py migrate pages

Perfecto, ahora tenemos que desarrollar las vistas. Seguiremos una lógica parecida a la del blog y sus categorías, de manera que estas páginas secundarias tengan el path /page/<page_id>.

Vamos a hacerlo:

pages/views.py

from django.shortcuts import render, get_object_or_404
from .models import Page

def page(request, page_id):
    page = get_object_or_404(Page, id=page_id)
    return render(request, 'pages/sample.html', {'page':page})

Ahora movemos el template sample.html en la propia app de páginas y borramos la view y url sample de Core:

Creamos las urls:

pages/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('<int:page_id>/', views.page, name="page"),
]

webempresa/urls.py

urlpatterns = [
    path('', include('core.urls')),
    path('blog/', include('blog.urls')),
    path('page/', include('pages.urls')),
    path('services/', include('services.urls')),
    path('admin/', admin.site.urls),
]

Probamos si nos aparece alguna página con id 1:

Perfecto, parece que funciona. Vamos a realizar la fusión, respetando los saltos de línea:

pages/templates/pages/sample.html

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

{% load static %}

{% block title %}{{page.title}}{% endblock %}

{% block content %}
<section class="page-section about-heading">
    <div class="container">
        <div class="about-heading-content mbtm">
            <div class="row">
                <div class="col-xl-9 col-lg-10 mx-auto">
                    <div class="bg-faded rounded p-5 forced">
                        <h2 class="section-heading mb-4">
                            <span class="section-heading-lower">
                                {{page.title}}</span>
                        </h2>
                        <div class="section-content">
                            {{page.content|linebreaks}}
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</section>
{% endblock %}

Lo tenemos listo, ya sólo falta mostrar los enlaces de las páginas en la parte inferior. Podríamos hacerlo añadiéndolas a un procesador de contexto como con las redes sociales, pero os comenté que se podía hacer de otra forma, os lo explico en la próxima lección.


Última edición: 31 de Octubre de 2018