Desarrollo de Ecommerce con Django (parte 1)
Tags: webdev, django, postgres, spanish
Published: 2024-03-27 23:04:47

Este tutorial cubre los siguientes puntos:

- Creación de una aplicación en Django dentro del proyecto existente llamado "eelaecommerce".
- Definición de modelos para el ecommerce.
- Configuración de la conexión a una base de datos PostgreSQL.
- Configuración del administrador de Django para gestionar los modelos.

**Paso 1: Creación de la Aplicación Django**

- Primero, asegúrate de que estás en el directorio raíz de tu proyecto `eelaecommerce`. Luego, ejecuta el siguiente comando:

```poetry run python manage.py startapp store```

- Abre el archivo `eelaecommerce/settings.py` y busca la lista INSTALLED_APPS. Añade el nombre de la aplicación recién creada al final de esta lista. Debería verse así:

```
INSTALLED_APPS = [
    ...
    'store.apps.StoreConfig'
]
```

**Paso 2: Definición de Modelos**

- Dentro del directorio de la aplicación "store", primero crea un directorio llamado "models".

- Dentro del directorio "models", crea un archivo especial `__init__.py` para convertir el directorio en un paquete de Python.

- Luego, dentro del paquete "models", crea dos archivos Python: "categoria.py" y "producto.py".

La estructura de directorios debería verse así:

```
store/
├── __init__.py
├── admin.py
├── apps.py
├── migrations/
│   └── ...
├── models/
│   ├── __init__.py
│   ├── categoria.py
│   └── producto.py
├── tests.py
└── views.py
```

- Abre el archivo "categoria.py" y pega el código del modelo Categoria dentro de él.

```
# store/models/categoria.py
from django.db import models

class Categoria(models.Model):
    nombre = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50, unique=True)
    fecha_registro = models.DateTimeField(auto_now_add=True)
    fecha_ult_act = models.DateTimeField(auto_now=True)
    
    def __str__(self) -> str:
        return f'{self.nombre} ({self.id})'

    class Meta:
        db_table = 'st_categorias'
        verbose_name = 'Categoría'
        verbose_name_plural = 'Categorías'
```

- Abre el archivo "producto.py" y pega el código del modelo Producto dentro de él.

```
# store/models/producto.py
from django.db import models
from .categoria import Categoria

class Producto(models.Model):
    categorias = models.ManyToManyField(Categoria, related_name='productos')
    nombre = models.CharField(max_length=150)
    descripcion = models.TextField(blank=True, null=True)
    precio = models.DecimalField(max_digits=9, decimal_places=2)
    imagen = models.ImageField(upload_to='imagenes/')
    activo = models.BooleanField()
    fecha_registro = models.DateTimeField(auto_now_add=True)
    fecha_ult_act = models.DateTimeField(auto_now=True)
    
    def __str__(self) -> str:
        return f'{self.nombre} ({self.id})'
    
    class Meta:
        db_table = 'st_productos'
        verbose_name = 'Producto'
        verbose_name_plural = 'Productos'
```

- En módulo `models/__init__.py` incluye la importación de los modelos creados:

```
from .categoria import Categoria
from .producto import Producto
```

**Paso 3: Configuración para el Manejo de Imágenes**

Asegurar la configuración adecuada para manejar imágenes en Django es esencial, especialmente al utilizar el campo `ImageField` en el modelo `Producto`.

- Asegúrate de que tienes Pillow instalado. Puedes hacerlo ejecutando el siguiente comando en tu terminal:

```poetry add pillow```

- Después de instalar Pillow, necesitas configurar la carpeta para almacenar las imágenes subidas. Por lo general, esto se hace agregando una configuración en tu archivo settings.py.
Abre tu archivo `eelaecommerce/settings.py` y agrega o modifica las siguientes líneas:

```
# Configuración para manejar archivos multimedia
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR  / 'media'
```

Adicionalmente, en las URLS del proyecto `eelaecommerce/urls.py` agrega:

```
from django.conf import settings
from django.conf.urls.static import static

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

```
Estas líneas de código permiten que, cuando estemos en modo de depuración (DEBUG=True en settings.py), Django pueda manejar automáticamente las solicitudes para archivos de medios y los sirva correctamente (publicarlos vía http) tomándolos desde el directorio establecido en MEDIA_ROOT.

- Crea la carpeta media/ en la raíz de tu proyecto si aún no existe. Esto es donde se almacenarán las imágenes subidas.
Puedes crear esta carpeta manualmente o hacerlo ejecutando el siguiente comando en tu terminal:

```mkdir media```

Ahora, las imágenes subidas se almacenarán en la carpeta media/imagenes/ dentro de tu proyecto.

**Paso 4: Configuración de la Conexión a PostgreSQL**

En el archivo `eelacommerce/settings.py`, asegúrate de configurar la conexión a la base de datos PostgreSQL. Reemplaza la sección DATABASES con lo siguiente:

```
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'nombre_basededatos',
        'USER': 'usuario_basededatos',
        'PASSWORD': 'contraseña',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}
```
Asegúrate de reemplazar 'nombre_basededatos', 'usuario_basededatos', y 'contraseña' con los detalles correctos de tu base de datos PostgreSQL.

Adicionalmente se necesita instalar el controlador psycopg2 en tu entorno virtual. Puedes hacerlo ejecutando el siguiente comando en tu terminal:

```poetry add psycopg2-binary```

**Paso 5: Creación y Ejecución de Migraciones**

- Ejecuta el siguiente comando para crear las migraciones iniciales:

```poetry run python manage.py makemigrations```

Este comando buscará cualquier cambio en tus modelos y generará archivos de migración en el directorio migrations/ de cada aplicación de tu proyecto.

Después de crear las migraciones, ejecuta el siguiente comando para aplicar las migraciones a la base de datos:

```poetry run python manage.py migrate```

Este comando ejecutará todas las migraciones pendientes y actualizará la base de datos de acuerdo con los modelos definidos.

Si tienes algún problema con la migración o necesitas revertir los cambios, puedes usar el siguiente comando para deshacer la última migración aplicada:

```poetry run python manage.py migrate <nombre_aplicacion> zero```

Reemplaza <nombre_aplicacion> con el nombre de la aplicación donde deseas deshacer la migración. También puedes usar zero en lugar de un nombre de migración específico para deshacer todas las migraciones de esa aplicación.

**Paso 6: Configuración del Administrador**

En el archivo `store/admin.py`, registra tus modelos para que puedan ser gestionados a través del administrador de Django:

```
from django.contrib import admin
from store.models import Categoria, Producto

admin.site.site_header = 'Administrador de Ecommerce'

@admin.register(Categoria)
class CategoriaAdmin(admin.ModelAdmin):
    list_display = ('id', 'nombre', 'slug', 'fecha_registro', 'fecha_ult_act')
    
@admin.register(Producto)
class ProductoAdmin(admin.ModelAdmin):
    list_display = ('id', 'nombre', 'descripcion', 'precio', 'activo', 'fecha_registro', 'fecha_ult_act')
```

¡Y eso es todo! Ahora puedes acceder al administrador de Django en http://localhost:8000/admin y gestionar tus categorías y productos. Recuerda crear un superusuario ejecutando:

```poetry run python manage.py createsuperuser```

Y finalmente, para ejecutar el servidor de desarrollo de Django, usa el siguiente comando:

`poetry run python manage.py runserver`

Espero que este tutorial te haya sido útil.

**Da clic [aquí](https://dev.to/villacisg93/desarrollo-de-ecommerce-con-django-parte-2-1432) para ir a la segunda parte de este tutorial.**