Fundamentos de Django

1

Entornos Virtuales con Python: Gestión y Creación Eficaz

2

Django: Creación de Proyectos y Configuración Inicial

3

Modelos, Vistas y Templates en Django: Fundamentos Esenciales

4

Desarrollo de Aplicaciones Web con Django: Modelos, Vistas y Templates

La M en el Patrón: Modelo

5

Modelos y Migraciones en Django ORM

Manejo Avanzado de Modelos y Bases de Datos

6

Migraciones de Django: Creación y Aplicación en Base de Datos

7

Campo opcional en Django: manejo de bases de datos

8

Modificación y Eliminación de Datos en Django

Relaciones y Asociaciones entre Modelos

9

Relaciones de Tablas en Django: Clave Foránea y Cascade

10

Relaciones de Muchos a Muchos en Bases de Datos

11

Relaciones 1 a 1 en Django: Modelos y CRUD Básico

12

Uso de Managers en Django para Consultas de Modelos

Configuración de URLs y Vistas Avanzadas

13

"URLs dinámicas en Django: Manejo de rutas y parámetros"

14

Vistas Basadas en Clases en Django: Inicio y Configuración

La T en el Patrón: Plantillas o Templates

15

Django Templates: Variables, Filtros y Tags

Desarrollo de Aplicaciones en Django

16

Configuración y Uso de Entornos Virtuales y Django en Proyectos Python

17

Modelado de Productos en Django: Campos y Configuración

18

Validación de imágenes con Pillow en Django

19

Creación de Formularios en Django: Guía Práctica

20

Lista de Productos con Django y Tailwind CSS

21

Registro de Modelos en el Administrador de Django

22

Login y Registro de Usuarios con Django

23

Creación de Modelos y Vistas en Django para Aplicaciones Web

24

Desarrollo de Vistas Genéricas en Django

25

Corrección de Bugs con Queries en Django

26

Manipulación de Formularios en Django: Creación y Configuración

Django Rest Framework

27

Creación de APIs con Django REST Framework

Despliegue de aplicaciones Django

28

Configuración de Django con PostgreSQL para Producción

29

Protección de Datos Sensibles con Django Environ

30

Pruebas Unitarias con Django: Validación de Listas y Redirecciones

31

Despliegue de Aplicaciones Django en AWS Paso a Paso

32

Desplegar Aplicaciones Django en AWS Elastic Beanstalk

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Django

Curso de Django

Luis Martínez

Luis Martínez

Registro de Modelos en el Administrador de Django

21/32
Recursos

Explorar la funcionalidad del Django Admin es esencial para aprovechar al máximo el potencial de Django en la gestión de aplicaciones web.

¿Qué es el Django Admin?

Django Admin es una herramienta integrada en Django que permite administrar modelos y objetos a través de una interfaz web intuitiva y fácil de configurar.

¿Cómo accedemos al Django Admin?

Primero, asegúrate de que el proyecto de Django esté corriendo. Luego, accede a la URL “/admin”. Aparecerá una página de inicio de sesión con el título “Django Administration”.

¿Cómo creamos un superusuario?

Para acceder al admin, necesitas un superusuario. Detén el servidor y ejecuta el comando createsuperuser. Proporciona un nombre de usuario, correo electrónico y contraseña. Reinicia el servidor y usa estas credenciales para iniciar sesión en el admin.

¿Cómo registramos un modelo en el Django Admin?

  1. Abre el archivo admin.py dentro de tu aplicación.
  2. Crea una nueva clase que herede de admin.ModelAdmin.
  3. Importa tu modelo con from .models import Product.
  4. Registra el modelo usando admin.site.register(Product, ProductAdmin).

¿Cómo personalizamos la vista de lista en el Django Admin?

Puedes añadir campos a la lista de visualización usando list_display:

class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'price')

Esto muestra los campos name y price en la lista de productos.

¿Cómo agregamos funcionalidad de búsqueda?

Añade el atributo search_fields en la clase del administrador:

class ProductAdmin(admin.ModelAdmin):
    search_fields = ('name',)

Esto permite buscar productos por nombre.

¿Cómo editamos y guardamos productos?

Desde la lista de productos, haz clic en un producto para abrir el formulario de edición. Realiza los cambios necesarios y selecciona una de las opciones de guardado.

¿Cómo añadimos imágenes a los productos?

  1. Asegúrate de tener un campo de imagen en tu modelo.
  2. Sube una imagen a través del formulario de edición.
  3. Configura las URLs para servir archivos estáticos agregando la configuración en urls.py:
from django.conf.urls.static import static
from django.conf import settings

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

¿Cómo administramos múltiples productos?

Selecciona varios productos usando los checkboxes y aplica acciones en masa, como eliminar.

¿Cómo configuramos la visualización de imágenes en la lista de productos?

Configura las URLs de los archivos estáticos y media para que Django sepa dónde encontrarlas. Asegúrate de importar y utilizar correctamente static y settings en tu archivo urls.py.

¿Cómo agregamos un nuevo campo al modelo?

Para agregar un nuevo campo, como la fecha de creación, modifica el modelo y actualiza la clase del administrador para mostrarlo en la lista:

class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'price', 'created_at')

Aportes 19

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Gente **para limitar el tamaño de la imagen** utilizando TailwindCSS solo hay que hacer un cambio en el archivo **list\_product.html**. En el atributo **class** dentro de la etiqueta **img** cambiar la palabrita "**full**" por "**64**" y listo.
En mi caso la carga de la imagen funcionó muy bien desde la pagina de administración de Django. Pero desde el formulario que se creo para la aplicación no cargaba. Para solucionarlo agregue el atributo enctype="multipart/form-data" a el tag form en el archivo add\_product.html. ```html {% extends "base.html" %} {% block content %} <h1 class="text-3xl font-bold underline">Agregar Producto <form action="{% url "add_product" %}" method="post" enctype="multipart/form-data"> {% csrf_token %} {{form.as_p}} <button type="submit">Agregar</button> </fom> {% endblock content %} ```{% extends "base.html" %} {% block content %} \<h1 class="text-3xl font-bold underline">Agregar Producto\ \<form action="{% url "add\_product" %}" method="post" enctype="multipart/form-data"> {% csrf\_token %} {{form.as\_p}} \<button type="submit">Agregar\</button> \</fom> {% endblock content %}
esta quedando muy bien: ![](https://static.platzi.com/media/user_upload/Screenshot%202024-09-27%20at%2010.00.30PM-ba26519f-ca8a-4745-9893-c839105bd121.jpg)
Personalmente no me gusto este metodo de obtener imagenes, ya que altera el historico de GIT y eso puede llegar a ser molesto en un entorno productivo, en local no afectara tanto, pero siento que hace falta saber como al momento de cargar esas imagenes subirlo a otro sitio como un bucket S3 y poder cargar las imagenes por medio de urls
Otra forma de hacer el registro en el admin es con un decorador: `from .models import Product` `@admin.register(Product)` `class ProductAdmin(admin.ModelAdmin):` ` pass`
Para los que no les sale la imagen, probablemente tengan el error de poner el static en el url de la aplicacion (products.urls), no debería ser ahí, la función static debe ir en el url del proyecto (coffee\_shop.urls)
No pude hacer q funciona la carga de imagenes.. revise el video 1000 de veces y sigo igual
Reto sencillo: en models.py ```python import djangofrom django.db import models class Product(models.Model): name = models.TextField(max\_length=200, verbose\_name="nombre") description = models.TextField(max\_length=300, verbose\_name="descripción") price = models.DecimalField(max\_digits=10, decimal\_places=2, verbose\_name="precio") available = models.BooleanField(default=True, verbose\_name="disponible") photo = models.ImageField( upload\_to="logos", null=True, blank=True, verbose\_name="foto" ) created\_at = models.DateField(verbose\_name="fecha\_creación", default=django.utils.timezone.now) def \_\_str\_\_(self): return self.name ``` y en admin.py: ``` from django.contrib import adminfrom .models import Product class ProductAdmin(admin.ModelAdmin): model = Product list\_display = \['name', 'price', 'created\_at'] search\_fields = \['name'] admin.site.register(Product, ProductAdmin) ```
reto de la claseclass Product(models.Model):    name = models.TextField(max\_length=200, verbose\_name="nombre")    description = models.TextField(max\_length=300, verbose\_name="descripcion")    price = models.DecimalField(max\_digits=10, decimal\_places=2, verbose\_name="precio", default=0)    available = models.BooleanField(default=True, verbose\_name='disponible')    photo = models.ImageField(upload\_to='logos', null=True, blank=True, verbose\_name='foto')    created\_at = models.DateField(auto\_now\_add=True)```python class Product(models.Model): name = models.TextField(max_length=200, verbose_name="nombre") description = models.TextField(max_length=300, verbose_name="descripcion") price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="precio", default=0) available = models.BooleanField(default=True, verbose_name='disponible') photo = models.ImageField(upload_to='logos', null=True, blank=True, verbose_name='foto') created_at = models.DateField(auto_now_add=True) ```en el admin ```python @admin.register(Product) class admin_product(admin.ModelAdmin): list_display = ('name', 'price', 'created_at') search_fields = ('name', 'created_at') list_filter = ['created_at'] ```@admin.register(Product)class admin\_product(admin.ModelAdmin):    list\_display = ('name', 'price', 'created\_at')    search\_fields = ('name', 'created\_at')    list\_filter = \['created\_at']
que diferencia tiene registrarlo de la forma explicada en la clase, a registrar solo el modelo de la siguiente forma? admin.site.register(Product)
Recuerden esto: En "/static", pueden subir sus archivos estáticos (imágenes para su Landing Page....). En "/media", para archivos dinámicos que subirán sus usuarios o desde admin.
reto cumplido, ademas agregue una atributo de imagen por url en el caso de no tiene del producto si en el caso de que no hay la foto local muestra una url ![](https://static.platzi.com/media/user_upload/image-1b08b78d-5839-4479-9060-ec74544495f3.jpg)
En mi caso particular, para conseguir que las tarjetas tuvieran un tamaño adecuado, cree un grid. Simplemente crea lo siguiente: `
` ` Contenido copiado de hyperui.dev` `
`
![](https://static.platzi.com/media/user_upload/image-f35d1c70-4b00-4f17-a505-308d40c1b6a4.jpg) ![](https://static.platzi.com/media/user_upload/image-59a05a2a-caae-4ba3-a6b8-55048bd26fd0.jpg) ![](https://static.platzi.com/media/user_upload/image-015c56f9-8738-4499-8a44-cc6c18425f6b.jpg)
Comparto mi admin, tomando en cuenta el decorador para registrar la app en el admin, entonces colocamos solo el decorador arriba de la clase admin de cada modelo."""Products admin.""" \# Djangofrom django.contrib import admin \# Modelsfrom products.models import Product \# Register your models here. @admin.register(Product) # Decorador para no utlizar admin.site.register(Product, ProductAdmin)class ProductAdmin(admin.ModelAdmin): """Product admin class.""" list\_display = ('name', 'description', 'available',) # Para el Listado de products list\_filter = ('description', 'available',) # Filtrar con un panel desde el lado derecho search\_fields = ('name', 'description', 'price',) # Filtra con un buscador readonly\_fields = ('created\_at',) # Muestra un campo y no lo permite editar list\_editable = ('available',) # Permite editar el campo desde el listado, debe estar en lista\_diplay y no debe ser FK ordering = ('description', 'name') # Ordena el listado list\_per\_page = 5 # Paginación en el listado date\_hierarchy = ('created\_at') # Muestra una busqueda por fecha desde listado Y agregue otros campos al admin para personalizacion del django-admin: ```js """Products admin.""" # Django from django.contrib import admin # Models from products.models import Product # Register your models here. @admin.register(Product) # Decorador para no utlizar admin.site.register(Product, ProductAdmin) class ProductAdmin(admin.ModelAdmin): """Product admin class.""" list_display = ('name', 'description', 'available',) # Para el Listado de products list_filter = ('description', 'available',) # Filtrar con un panel desde el lado derecho search_fields = ('name', 'description', 'price',) # Filtra con un buscador readonly_fields = ('created_at',) # Muestra un campo y no lo permite editar list_editable = ('available',) # Permite editar el campo desde el listado, debe estar en lista_diplay y no debe ser FK ordering = ('description', 'name') # Ordena el listado list_per_page = 5 # Paginación en el listado date_hierarchy = ('created_at') # Muestra una busqueda por fecha desde listado ```
Agregar campo de fecha y hora para cada registro, el campo no se llenará en el formulario, la fecha y hora se asignarán automaticamente una vez creado el producto *     date = <u>models</u>.<u>DateTimeField</u>(*auto\_now\_add*=True, *null*=True, *blank*=True, *verbose\_name*='Fecha de Creación') Procedemos ha hacer la migraciones y a probar, si ya tenía registros, va que la fecha y hora en la que hiciste las migraciones
Profe una pregunta, por qué me aparece tan grande mis resultados? Cómo puedo hacer para dejarlo con el tamaño que aparece en su ejemplo?![](https://static.platzi.com/media/user_upload/image-8765cbdc-1672-452c-9112-6dfd4c66181f.jpg)![]()
Hola Luis! Podrias explicar un poco porque se agrega esta configuracion de las rutas de las imagenes al final de la lista? ```python ```
Por favor muestra como agregar editor de texto en ese descripción del producto. Agregar también campos, categoría, tags, comentarios del producto, calificación Gracias