En la 1º parte de desarrollo de aplicaciones web con Python y Django trabajamos con la vista y las urls. En esta segunda parte crearemos un modelo para interactuar con la base de datos y retornaremos la respuesta en una plantilla html.
Establecemos un nuevo proyecto
A continuación vamos a nuestro directorio de trabajo. Creamos una nueva carpeta con el nombre proyecto2 y entramos.
$ mkdir proyecto2 $ cd proyecto2
Crear un entorno virtual
Desde un terminal utilizamos el módulo venv de python para crear un entorno virtual al que llamamos .venv y lo activamos.
$ python -m venv .venv (.venv) $ source .venv/bin/activate # En Windows: .\.venv\Scripts\activate
Instalar Django
(.venv) $ python -m pip install django
Crear el proyecto
Una vez instalado django creamos el proyecto con el nombre de clásicos.
(.venv) $ django-admin startproject clasicos .
Crear una app
Ahora creamos una aplicación a la que llamamos cars.
(.venv) $ python manage.py startapp cars
Y la añadimos a la lista de aplicaciones instaladas en el archivo settings.py.
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'car', ]
Iniciamos el servidor
(.venv) $ python manage.py runserver
Si la instalación fue exitosa vemos en http://127.0.0.1:8000/

El Modelo en Django
El ORM (Object Relational Mapper ) de Django nos permite definir los modelos de una base de datos mediante código python. De este modo no necesitamos ejecutar sentencias SQL para trabajar con la db.
En el archivo models.py vamos a crear un modelo Car con los campos marca, color y fecha de lanzamiento. Además del método __str__ para que nos imprima la marca.
from django.db import models
class Car(models.Model):
brand = models.CharField(max_length=250)
color = models.CharField(max_length=250)
released_date = models.DateField()
def __str__(self):
return self.brand
Migraciones
Con el comando python manage.py makemigrations generamos el archivo 0001_initial.py en el directorio migrations.
(.venv) $ python manage.py makemigrations
Migrations for 'cars':
cars\migrations\0001_initial.py
+ Create model Car
Este archivo contiene el esquema de la tabla que se creara en la base de datos relacional db.sqlite3. Django inserta por nosotros el campo id auto incremental como clave primaria.
operations = [
migrations.CreateModel(
name='Car',
fields=[
('id', models.BigAutoField(auto_created=True,
primary_key=True, serialize=False, verbose_name='ID')),
('brand', models.CharField(max_length=250)),
('color', models.CharField(max_length=250)),
('released_date', models.DateField()),
],
),
]
En el siguiente paso confirmamos la migración con python manage.py migrate.
(.venv) $ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, cars, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying auth.0012_alter_user_first_name_max_length... OK Applying cars.0001_initial... OK Applying sessions.0001_initial... OK
Como podemos ver además de cars, también se realizaron las migraciones pendientes de las aplicaciones incluidas en la lista de settings.py (admin, auth, sessions…).
Con python manage.py sqlmigrate cars 0001 puedes ver la sentencia SQL ejecutada anteriormente.
(.venv) $ python manage.py sqlmigrate cars 0001
BEGIN;
--
-- Create model Car
--
CREATE TABLE "cars_car" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "brand" varchar(250) NOT NULL,
"color" varchar(250) NOT NULL, "released_date" date NOT NULL);
COMMIT;
Django Admin
La aplicación de administración integrada de Django nos permite interactuar con los datos de las tablas de manera rápida y sencilla. Para poder usarla necesitamos:
- Crear un usuario administrativo: python manage.py createsuperuser
- Registrar la app car en el archivo admin.py
En el primer paso nos piden un usuario, email, y contraseña. En el segundo abrimos admin.py y insertamos el siguiente código.
from django.contrib import admin from .models import Car admin.site.register(Car)
Ahora iniciamos el servidor de desarrollo con python manager.py runserver, accedemos a http://127.0.0.1:8000/admin/, escribimos nuestros credenciales y si todo es correcto entramos al panel de administración.

Desde aquí creamos instancias del modelo Car para posteriormente mostrarlos en la plantilla.

Vistas y urls
Abrimos el archivo views.py e insertamos una vista que interactúe entre el modelo y la plantilla.
from django.shortcuts import render
from .models import Car
def car_list(request):
cars = Car.objects.all()
return render(request, "car_list.html", {"cars":cars})
En la vista car_list encontramos la variable cars que contiene todos los objetos cars retornados por la petición a la base de datos con cars.objects.all().
Retornamos los objetos a la plantilla car_list.html (que definiremos más tarde) mediante la función render().
Ahora tenemos que definir la url de la vista. Creamos un archivo urls.py en la app cars con lo siguiente:
from django.urls import path
from .views import car_list
urlpatterns = [
path('', car_list, name='cars'),
]
Y añadimos la url de la app cars a las urls.py del proyecto.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('cars.urls')),
]
Plantillas
El siguiente paso será mostrar la información enviada por la vista en una plantilla con formato html.
En cars crea el directorio templates y dentro un archivo car_list.html con lo siguiente:
<h1>Coches Clásicos</h1>
<ul>
{% for car in cars %}
<li>{{ car.brand }}</li>
{% endfor %}
</ul>
Si iniciamos el servidor local con python manage.py runserver y navegamos a http://127.0.0.1:8000/ deberíamos ver una lista con nuestros coches clásicos.

0 comentarios