Saltar a contenido

Tercera App [Services] Modelo y admin

La app Services es en esencia lo mismo que la app portafolio de la web personal así que estoy seguro de que podréis implementarla sin ayuda. Para hacerlo más llevadero la crearás en dos partes. Empezarás por crear el modelo y configurando el panel de administrador. Aquí tienes las indicaciones:

  • Configura los ficheros media que funcionen en el servidor de desarrollo.
  • Crea una app Services y añádela a la lista INSTALLED_APPS en settings.py.
  • El modelo Service constará de 6 campos obligatorios, podéis utilizar de referencia el modelo Project de la app Portfolio del primer proyecto:
    • Title: Un título con 200 caracteres de longitud máxima.
    • Subtitle: Un subtítulo con 200 caracteres de longitud máxima.
    • Content: Un texto de tamaño indefinido.
    • Image: Una imagen para mostrar de fondo almacenada en el directorio media/services.
    • Created: Un campo automático para gestionar la fecha y hora de creación.
    • Updated: Un campo automático para gestionar la fecha y hora de última actualización.
  • Haz una migración completa (makemigrations y migrate a secas) y crea un superusuario para poder acceder al panel de administrador.
  • Ahora configura la app para ser manejable desde el panel de administrador. Debes mostrar los campos especiales Created y Updated en modo sólo lectura.
  • Toda la información de la app deberá aparecer en español (admin en general, nombre de la app, nombre del modelo y sus campos).

Solución

Creamos el directorio media en la raíz del proyecto:

Añadimos la configuración MEDIA al settings.py:

webempresa/settings.py

# Media config
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Configuramos el PATH en webempresa/urls.py para servir ficheros media en modo DEBUG:

webempresa/urls.py

from django.conf import settings

if settings.DEBUG:
    from django.conf.urls.static import static
    urlpatterns += static(settings.MEDIA_URL, 
        document_root=settings.MEDIA_ROOT)

Una vez preparados los ficheros media creamos la app y la añadimos a settings.py:

(django2) python manage.py startapp services

Creamos el modelo Service, podemos basarnos en el de Proyecto que hicimos para la app Portafolio:

services/models.py

from django.db import models

class Service(models.Model):
    title = models.CharField(max_length=200, 
        verbose_name="Título")
    subtitle = models.CharField(max_length=200, 
        verbose_name="Subtítulo")
    content = models.TextField(
        verbose_name="Contenido")
    image = models.ImageField(verbose_name="Imagen", 
        upload_to="services")
    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 = "servicio"
        verbose_name_plural = "servicios"
        ordering = ['-created']

    def __str__(self):
        return self.title

Creamos las migraciones:

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

Creamos un superusuario:

(django2) python manage.py createsuperuser

Activamos la app en el admin.py:

services/admin.py

from django.contrib import admin
from .models import Service

class ServiceAdmin(admin.ModelAdmin):
    readonly_fields = ('created', 'updated')

admin.site.register(Service, ServiceAdmin)

Ya podemos acceder al admin:

Finalmente tocaría acabar de traducir el nombre de la app y configurar django en español:

webempresa/settings.py

LANGUAGE_CODE = 'es'

services/apps.py

from django.apps import AppConfig

class ServicesConfig(AppConfig):
    name = 'services'
    verbose_name = 'Gestor de servicios'

Activamos la configuración extendida:

webempresa/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'core',
    'services.apps.ServicesConfig',
]

Y ya lo tenemos:


Última edición: 29 de Octubre de 2018