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/

Desarrollo Web con Django

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:

  1. Crear un usuario administrativo: python manage.py createsuperuser
  2. 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. 

Admin Django

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

Django Admin Models

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.

plantilla django

 


0 comentarios

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies