Framework
Django
>
_
David Bohórquez, M.Sc.
Framework de desarrollo web de alto nivel que fomenta el desarrollo rápido y y el diseño limpio. Se encarga de gran parte de la molestia del desarrollo web, por lo que puede concentrarse en escribir su aplicación sin necesidad de reinventar la rueda. Es gratuito y de código abierto.

Rápido
Django fue diseñado para ayudar a los desarrolladores a llevar las aplicaciones desde el concepto hasta la finalización lo más rápido posible.
Seguro
Django se toma la seguridad en serio y ayuda a los desarrolladores a evitar muchos errores de seguridad comunes.
Escalable
Algunos de los sitios más concurridos de la web aprovechan la capacidad de Django para escalar de forma rápida y flexible.
Características Django



Sitios populares que usan Django
- Udemy
- Mozilla
- Crehana
- Disqus
- Prezi
- Bitbucked
- Robinhood
- Coursera






Patrón MVC vs MVT
Las siglas en inglés MVT corresponden a Model (Modelo), View (Vista) y Template (Plantilla). En la practica el patrón MVT es muy similar al MVC a tal punto que se puede decir que Django es un framework MVC.
Modelo Vista Controlador (MVC)
- Modelo: Es el que se encarga de manipular la información de la aplicación, la cual usualmente esta almacenada en la base de datos.
-
Vista: Decide que información mostrar y cómo mostrarla.
-
Controlador: Es quien responde a las peticiones, decide que vista usar y si es necesaria información accede al modelo.
Patrón MVT
En Django, el controlador sigue estando presente, nada más que de una manera intrínseca, ya que todo el framework Django es el controlador.
-
Modelo: Maneja todo lo relacionado con la información, esto incluye como acceder a esta, la validación, relación entre los datos y su comportamiento.
-
Vista: Es un enlace entre el modelo y el template.
Decide que información
será mostrada y por cual template. -
Template: Decide como
será mostrada la información.
Patrón MTV

Al momento de hacer click en un enlace o escribir una dirección (1) a lo primero que se accede es al mapa de URLs, en este archivo cada ruta esta asociado con una view (2), si se necesita algún dato se solicitara este a model (3) el cual a su vez generara la consulta a la base de datos, cuando los datos han sido traídos estos son enviados al template (4) que contiene la lógica de presentación para estos. Luego de "pintar" la página ésta se envía al navegador y se muestra al usuario que hizo la solicitud (5).
Además de las bases de datos oficialmente soportadas, existen otras ofrecidas por terceros, que permiten utilizar otras bases de datos con Django como son: SAP SQL, Anywhere, IBM, DB2, Microsoft SQL Server, Firebird, ODBC, ADSDB. Es muy recomendable PostgreSQL, el cual logra un balance fino entre el costo, características, velocidad y estabilidad.
Bases de datos

Virtualenv es una herramienta para crear diferentes entornos de desarrollo Python, gracias a virtualenv podemos implementar diferentes proyectos con herramientas como (frameworks, bibliotecas graficas, ...).
Entorno Virtual
python -m venv env
env\Scripts\activate

deactivate
ENTORNO VIRTUAL

5.ESTRUCTURA DEL PROYECTO
django-admin startproject misitio
misitio/
manage.py
misitio/
__init__.py
settings.py
urls.py
wsgi.py
-
misitio/: El directorio de trabajo externo misitio/, es solo un contenedor, es decir una carpeta que contiene nuestro proyecto. Por lo que se le puede cambiar el nombre en cualquier momento sin afectar el proyecto en sí.
-
manage.py: Una utilidad de línea de comandos que te permite interactuar con un proyecto Django de varias formas. Usa manage.py help para ver lo que puede hacer. No deberías editar este archivo, ya que este es creado en el
directorio convenientemente para manejar el proyecto.
-
__init__.py: Un archivo vacío que indica a Python que este directorio debe considerarse un paquete de Python.
-
settings.py: Las opciones/configuraciones para nuestro proyecto Django. Dale un vistazo, para que te des una idea de los tipos de configuraciones disponibles y sus valores predefinidos.
6.ESTRUCTURA DEL PROYECTO
django-admin startproject misitio
misitio/
manage.py
misitio/
__init__.py
settings.py
urls.py
wsgi.py
-
urls.py: Declaración de las URLs para este proyecto de Django. Piensa que es como una ‘‘tabla de contenidos’’ de tu sitio hecho con Django.
- wsgi.py: El punto de entrada WSGI para el servidor Web, encargado de servir nuestro proyecto.
7.SERVIDOR DE DESARROLLO
python manage.py migrate
- Algunas de las aplicaciones hacen uso, de por lo menos una tabla de la base de datos, por lo que necesitas crear las tablas en la base de datos, antes de que puedas utilizarlas, para hacerlo entra al directorio que contiene tu proyecto (cd misitio) y ejecuta el comando siguiente, para activar el proyecto Django:
python manage.py runserver
-
Django incluye un servidor Web ligero (Que es llamado con el comando ‘‘runserver’’) que puedes usar mientras estás desarrollando tu sitio. Se incluye este servidor para que puedas desarrollar tu sitio rápidamente, sin tener que lidiar con configuraciones de servidores Web para producción (por ejemplo, Apache) hasta que estés listo para producción. Este servidor de desarrollo vigila tu código a la espera de cambios y se reinicia automáticamente, ayudándote a hacer algunos cambios rápidos en tu proyecto sin necesidad de reiniciar nada. Para iniciar el servidor, entra en el directorio que contiene tu proyecto (cd misitio) si aún no lo has hecho y ejecuta el comando:
8.SERVIDOR DE DESARROLLO

El comando runserver inicia el servidor de desarrollo en el puerto 8000, escuchando sólo conexiones locales. Ahora que el servidor está corriendo, visita la dirección http://127.0.0.1:8000/ con tu navegador Web. Verás una página de ‘‘Bienvenida a Django’’.
9.HOLA MUNDO
from django.http import HttpResponse def index(request): return HttpResponse ("Hola mundo en Django")
from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path('admin/', admin.site.urls), path('', views.index, name='index'), ]
python manage.py runserver
10.PRIMER TEMPLATE
- Crear una carpeta llamada template
- Crear un archivo index.html con algún contenido
- En el archivo settings.py agregar en el diccionario DIR, el nombre de la carpeta creada template
from django.shortcuts import render def index(request): return render(request,'index.html',{ #context })
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ['templates'],
4. En el archivo views.py modificar el script. Importar función render encargada de renderizar un archivo HTML. Esta función recibe tres argumentos.
11.INTEGRACIÓN CON BOOTSTRAP
- Agregar CDN Bootstrap
- CDN de los estilos CSS y de JS
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js" integrity="sha384-JEW9xMcG8R+pH31jmWH6WWP0WintQrMb4s7ZOdauHnUtxwoG2vI5DkLtS3qm9Ekf" crossorigin="anonymous"></script>
12. CONTEXTO
Un diccionario en Python es un mapeo entre llaves conocidas y valores de variables. El contexto permite pasar valores a un template. Para llamar una variable se utilizan dobles llaves {{ variable }}
from django.shortcuts import render def index(request): return render(request, "index.html", { 'message': 'Nuevo mensaje' })
- Se crea el diccionario en views.py
2. En el index.html se llama la variable entre dobles llaves
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Template</title> </head> <body> <h1>Hola mundo desde template en Django</h1> <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Labore voluptas cupiditate illo veritatis? Fugit consequuntur facilis pariatur, dolorem dolores tenetur quia repudiandae cum deleniti quaerat, accusamus provident molestias sequi repellendus?</p> <h1> {{ message }} </h1> </body> </html>
Databases

Django
13.CONFIGURACIÓN DE BASE DE DATOS
De forma predeterminada, la configuración utiliza SQLite. SQLite se incluye en Python, por lo que no necesitará instalar nada más para admitir la base de datos. Sin embargo, al iniciar su primer proyecto real, es posible que desee utilizar una base de datos más escalable como PostgreSQL.
Si desea utilizar otra base de datos, instale los enlaces de base de datos adecuados y cambie las siguientes claves en el elemento DATABASES para que coincidan con la configuración de conexión de la base de datos:'default'.
- SQLite3 - 'django.db.backends.sqlite3'
- PostgreSQL - 'django.db.backends.postgresql'
- MySQL - 'django.db.backends.mysql'
- Oracle - 'django.db.backends.oracle'
14.CONFIGURACIÓN DE BASE DE DATOS
El nombre de la base de datos NAME. El valor predeterminado, almacenará el archivo en el directorio del proyecto. BASE_DIR / 'db.sqlite3'.
Si no se utiliza SQLite como base de datos, se deben agregar configuraciones adicionales como USER, PASSWORD, HOST y PORT.
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'name_database', 'USER': 'user', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '3306', } }
15.CONFIGURACIÓN DE BASE DE DATOS
- Si usas PostgreSQL, necesitarás el paquete psycopg2.
- Si utiliza MySQL o MariaDB, necesitará un controlador de API de base de datos.
- Si utiliza Oracle, necesitará una copia de cx_Oracle.
pip install psycopg2
pip install mysqlclient
python -m pip install cx_Oracle --upgrade
Requerimientos

Django
16.REQUERIMIENTOS
pip install freeze
pip freeze > requirements.txt
pip install -r requirements.txt
Generar un archivo de requisitos y luego instalarlos en otro entorno.
Instalar librería para listar los paquetes y dependencias instaladas.
APPS

Django
17.ESTRUCTURA DE UN PROYECTO

18.APLICACIONES
Django contiene un registro de aplicaciones instaladas que almacena la configuración y proporciona introspección. También mantiene una lista de modelos disponibles.
Este registro se denomina aplicaciones y está disponible en django.apps.
18.APLICACIONES
El término proyecto describe una aplicación web de Django. El paquete de Python del proyecto se define principalmente mediante un módulo de configuración, pero normalmente contiene otras cosas.
django-admin startproject sitemysitesettings.pyurls.pyasgi.pywsgi.py
El directorio raíz de un proyecto suele ser el contenedor para todas las aplicaciones de un proyecto que no están instaladas por separado. manage.py
El término aplicación describe un paquete de Python que proporciona algún conjunto de entidades. Las aplicaciones pueden reutilizarse en varios proyectos.
Las aplicaciones incluyen alguna combinación de modelos, vistas, plantillas, etiquetas de plantilla, archivos estáticos, URL, middleware, etc. Por lo general, se conectan a proyectos con la configuración de INSTALLED_APPS y, opcionalmente, con otros mecanismos como URLconfs, la configuración middleware o la herencia de plantillas.
19.APLICACIONES
Un proyecto Django contiene una o más aplicaciones dentro de él que trabajan juntas para potenciar una aplicación web. Esta es la razón por la que el comando para un nuevo proyecto Django es startproject.
Por ejemplo, un sitio de comercio electrónico Django del mundo real podría tener una aplicación para la autenticación del usuario user_authentication, otra aplicación para los pagos payments, y una tercera aplicación para los detalles details: cada una se centra en una parte aislada de la funcionalidad. Son tres aplicaciones distintas que viven dentro de un proyecto de nivel superior. Cómo y cuándo dividir la funcionalidad en aplicaciones es algo subjetivo, pero en general cada aplicación debe tener una función clara.
python manage.py startapp pages
├── pages │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py
19.APLICACIONES
Revisemos lo que hace cada archivo de la aplicación:
- admin.py es un archivo de configuración para la aplicación Django Admin incorporada.
- apps.py es un archivo de configuración para la propia aplicación.
- migrations/ mantiene un registro de cualquier cambio en nuestro. archivo models.py para que nuestra base de datos y models.py se mantengan sincronizados.
- models.py es donde definimos nuestros modelos de base de datos que Django automáticamente convierte en tablas de base de datos.
- tests.py es para nuestras pruebas específicas de la aplicación.
- views.py es donde manejamos la lógica de solicitud/respuesta para nuestra aplicación web.
├── pages │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py
Models

Django
20.MODELOS
Un modelo es la única fuente definitiva de información sobre los datos. Contiene los campos y comportamientos esenciales de los datos que está almacenando. Por lo general, cada modelo se asigna a una sola tabla de base de datos.
Lo básico:
Cada modelo es una clase de Python que subclase django.db.models.Model.
- Cada atributo del modelo representa un campo de base de datos.
- Con todo esto, Django le ofrece una API de acceso a bases de datos generada automáticamente.
21.MODELOS
from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) second_name = models.CharField(max_length=30, null=True)
Argumentos comunes de los campos
Los siguientes argumentos son comúnes a la mayoría de los tipos de campo y pueden usarse al declararlos:
- help_text: Proporciona una etiqueta de texto para formularios HTML.
- verbose_name: Nombre de fácil lectura que se usa en etiquetas para el campo. Si no se especifica, Django inferirá el valor por defecto del verbose name a partir del nombre del campo.
- default: Valor por defecto para el campo. Puede ser un valor o un callable object (objeto que puede ser llamado como una función), en cuyo caso el objeto será llamado cada vez que se cree un nuevo registro.
- null: Si es True, Django guardará valores en blanco o vacíos como NULL en la base de datos para campos donde sea apropiado (un CharField guardará una cadena vacía en su lugar). Por defecto es False.
21.MODELOS
from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) second_name = models.CharField(max_length=30, null=True, blank=True)
Argumentos comunes de los campos
- blank: Si es True, se permite que el campo quede en blanco en tus formularios. El valor por defecto es False, lo que significa que la validación de formularios de Django te forzará a introducir un valor. Con frecuencia se usa con null=True, porque si vas a permitir valores en blanco, también querrás que la base de datos sea capaz de representarlos de forma apropiada.
- choices: Un grupo de valores de selección para este campo. Si se proporciona, el widget correspondiente por defecto del formulario será una caja de selección con estos valores de selección en vez del campo de texto estándar.
- primary_key: Si es True, establece el campo actual como clave primaria para el modelo (Una clave primaria es una columna especial de la base de datos, diseñada para identificar de forma única todos los diferentes registros de una tabla). Si no se especifica ningún campo como clave primaria, Django añadirá automáticamente un campo para este propósito.
21.MODELOS
- CharField: Cadena de caracteres.
- TextField: Cadena de caracteres, mayor número de caracteres.
- IntegerField: Un valor de número entero.
- BooleanField: Un campo True/False.
- DateField: Una fecha, representada en Python por una instancia.
-
DateTimeField: Una fecha y hora, representadas en Python por una instancia.
-
DecimalField: Un número decimal de precisión fija, representado en Python por una instancia decimal. Valida la entrada mediante DecimalValidator.
-
DurationField: Un campo para almacenar períodos de tiempo - modelado en Python por timedelta.
-
EmailField: Un CharField que comprueba que el valor es una dirección de correo electrónico válida mediante EmailValidator.
-
ImageField: Hereda el funcionamiento de FileField y valida un objeto imagen.
-
FileField: Un campo de carga de archivos.
-
URLField: Para una dirección URL.
Tipos de campos comunes:
23.METADATOS
Puedes declarar metadatos a nivel de modelo para tu Modelo declarando class Meta.
class Meta: ordering = ["-my_field_name"] ...
Una de las características más útiles de estos metadatos es controlar el orden por defecto de los registros que se devuelven cuando se consulta el tipo de modelo. Se hace especificando el orden de comprobación en una lista de nombres de campo en el atributo ordering. Como se muestra arriba, se puede invertir el orden de clasificación añadiendo el símbolo (-) como prefijo del nombre del campo. Así como ejemplo, si elegimos clasificar los libros de esta forma por defecto: los libros serán clasificados alfabéticamente por título, de la A al a Z, y luego por fecha de publicación dentro de cada título, desde el más reciente al más antiguo.
ordering = ["title", "-pubdate"]
Otro atributo común es verbose_name, un nombre descriptivo para la clase en forma singular y plural:
verbose_name = "BetterName"
Relationships

Django
22.RELACIONES
- ForeignKey: se usa para especificar una relación uno a muchos con otro modelo de la base de datos (ej. un coche tiene un fabricante, pero un fabricante puede hacer muchos coches). Una relación de muchos a uno. Requiere dos argumentos posicionales: la clase a la que está relacionado el modelo y la opción on_delete.
- ManyToManyField: Una relación de muchos a muchos. Requiere un argumento posicional: la clase a la que está relacionado el modelo, que funciona exactamente igual que para ForeignKey.
-
OneToOneField: Una relación uno a uno. Conceptualmente, esto es similar a un ForeignKey con unique=True, pero el lado "reverse" de la relación devolverá directamente un único objeto. Esto es más útil como la clave principal de un modelo que "extiende" otro modelo de alguna manera; La herencia de varias tablas se implementa agregando una relación uno a uno implícita del modelo secundario al modelo primario, por ejemplo.
Superuser

Django
24.SUPER USUARIO
La autenticación Django proporciona autenticación y autorización juntas y generalmente se conoce como el sistema de autenticación, ya que estas características están algo acopladas.
python manage.py createsuperuser


Panel Admin

Django
25.AGREGAR MODELOS AL PANEL DE ADMIN
Django permite agregar modelos creados al panel de administración para que puedan ser fácilmente gestionados. Proporciona las acciones de CRUD: Create, Read, Update y Delete.
from django.contrib import admin from .models import User, DocumentType admin.site.register(User) admin.site.register(DocumentType)

25.CAMBIAR IDIOMA AL PANEL DE ADMIN
Dirigirse al archivo settings.py
# Internationalization # https://docs.djangoproject.com/en/3.2/topics/i18n/ #LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'es-co' #TIME_ZONE = 'UTC' TIME_ZONE = 'America/Bogota' USE_I18N = True USE_L10N = True USE_TZ = True

26.PERSONALIZAR ESTILOS PANEL DE ADMIN
Personalizar estilos con el paquete django-admin-interface
pip install django-admin-interface
INSTALLED_APPS = ( #... 'admin_interface', # Django 3 'colorfield', # Django 3 #... 'django.contrib.admin', #... ) X_FRAME_OPTIONS='SAMEORIGIN' # only if django version >= 3.0
python manage.py migrate # python manage.py collectstatic
Ejecutar:
En el archivo settings.py agregar:
26.PERSONALIZAR ESTILOS PANEL DE ADMIN
Personalizar estilos con el paquete django-admin-interface

26.OPCIONES AVANZADAS PANEL DE ADMIN
Las opciones avanzadas permiten implementar acciones que por defecto no se tienen con
el registro de modelo.
- list_display: Listar más columnas de una entidad o tabla.
- list_display_links: Listar más columnas y agregar links sobre estas.
- list_editable: Dejar los campos como editables.
- search_fields: Agregar barra de búsqueda por ese campo en específico.
- list_filter: Agregar un filtro de búsqueda por categoría.
- list_per_page: Agregar paginación (número de paginas).
@admin.register(DocumentType) class DocumentTypeAdmin(admin.ModelAdmin): list_display = ("name_document_type", "acronym") list_display_links = ("name_document_type", "acronym") list_editable = ("acronym") search_fields = ("name_document_type") list_filter = ("acronym") list_per_page = 2
27.CICLOS Y CONDICIONALES
Para trabajar con ciclos o condicionales en Python se utiliza {% %}
{% for product in products %} <p>{{ product.title }}</p> {% endfor %}
{% if product == 'Camiseta' %} <p>{{ product.title }}</p> {% endif %}
28.ADMINISTRAR ARCHIVOS ESTÁTICOS
Por lo general, los sitios web necesitan servir archivos adicionales como imágenes, JavaScript o CSS. En Django, nos referimos a estos archivos como "archivos estáticos". Django proporciona django.contrib.staticfiles para ayudarle a administrarlos.
{% load static %} <img src="{% static 'my_app/example.jpg' %}" alt="My image">
STATIC_URL = '/static/'
Configuración de archivos estáticos
Asegúrese de que está incluido en su INSTALLED_APPS.django.contrib.staticfiles
En el archivo de configuración, defina STATIC_URL, por ejemplo:
- En las plantillas, utilice la etiqueta de plantilla estática para crear la dirección URL de la ruta relativa dada mediante el STATICFILES_STORAGEconfigurado.
4. Almacena los archivos estáticos en una carpeta llamada static en la aplicación.
28.ADMINISTRAR ARCHIVOS ESTÁTICOS
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'sitio/static'),)
6. Agregar la ruta
5. En la carpeta static agregar tres carpetas.
static -css -images -js
29.LOGIN
- Registrar la nueva url para login y asociar la función.
- Definir en views.py la función para login.
- En la carpeta templates, crear el formulario html para el login
- El formulario debe contener el método a través del cuál se va a enviar la información que será post.
- Todos los formularios deben tener {% csrf_token %}
def login_view(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = authenticate(username=username, password=password) if user: login(request, user) messages.success(request, 'Bienvenido {}'.format(user.username)) return redirect('index') else: messages.error(request, 'Usuario o contraseña incorrecta') return render(request, 'users/login.html',{ })
30.LOGOUT
- Registrar la nueva url para logout y asociar la función.
- Definir en views.py la función para logout.
- Importar librería:
from django.contrib.auth import logout
def logout_view(request): logout(request) messages.success(request, 'Sesión finalizada') return redirect('login')
31.IMPORTAR/EXPORTAR
- Instalar la librería https://django-import-export.readthedocs.io/en/latest/
- Agregar la app en el archivo settings.py 'import_export'
-
Importar librerías en admin.py
pip install django-import-export
# settings.py INSTALLED_APPS = ( ... 'import_export', )
from import_export import resources from import_export.admin import ImportExportModelAdmin
class UserResource(resources.ModelResource): class Meta: model = User fileds = ('first_name', 'last_name', 'id_doc', 'document_type',)
Built-in LATEX typesetting makes it dead simple to show math formulas.
6.LaTeX
f(x) = \int_{-\infty}^\infty
\hat f(\xi)\,e^{2 \pi i \xi x}
\,d\xi
7.EXPORTS
Download the complete reveal.js source code for your presentation. Great for offline presenting,
self-hosting or backups.
We provide PDF and PPT exports, too.
HTML
CSS
JS
Slides for Developers is available today. Jump right into the editor and try it out.
EDIT AN EXAMPLE PRESENTATION
You'll need to sign up or log in
Django
By davidbcaro
Django
Curso Django
- 407