★ Python es un lenguaje de script de código abierto ★ Es multiplataforma: Linux, Mac OS X, Windows... ★ Es multiparadigma: Funcional y orientado a objetos ★ Es muy legible y conciso ★ Es interpretado: No necesitamos compilar nuestros programas ★ Python es fuertemente tipado pero tiene tipos dinámicos: Una variable puede cambiar de tipo en ejecución pero el tipo se tiene en cuenta para las operaciones ★ Es integrable con C, C++, Java y otros lenguajes Django es Python
Sigue el patrón MTV Separa datos, interfaz de usuario y lógica de control: ★ Model → modelo de datos (models.py) ★ View →vistas de datos (views.py): qué datos se presentan ★ Template → plantillas de páginas (generalmente archivos HTML): cómo se presentan los datos El controlador es el propio framework
¿Qué hace Django? ★ Provee una estructura de trabajo bajo el patrón Model Template View ★ Mapea objetos Python con la base de datos (ORM) ★ Permite diseñar URLs amigables para buscadores (útil para SEO) ★ Tiene un sistema de plantillas sencillo para diseñadores ★ Genera una interfaz de administración automática ★ Dispone de un framework para manejar formularios ★ Puede gestionar sesiones de usuario, autenticación, caché, almacenamiento, sitemaps, internacionalización, etc.
Usa lo que quieras, integra lo que necesites ★ Backends almacenamiento de archivos ★ Backends de cache ★ Backends de autenticación ★ Sitio de administración ★ Sistema de templates de Django o uno propio ★ etc.
Aplicaciones contrib ★ auth: Autenticación de usuarios. ★ admin: Sitio de administración CRUD. ★ messages: Mensajes de aviso para usuarios. ★ sessions: Gestión de sesiones. ★ sites: Manejar distintos sitios web con un proyecto. ★ sitemaps: Generar sitemaps a partir de modelos. ★ syndication: Generar feeds RSS y Atom a partir de modelos. ★ gis: Trabajar con datos ego-espaciales (PostGIS)
Organización de un proyecto Django ★ Un desarrollo es un Proyecto ★ Un proyecto consta de una o varias aplicaciones ★ Cada aplicación hace algo en concreto ★ Proyecto: "Comunidad web" Aplicaciones: blog, foro, registro de usuarios, tienda on-line, newsletter, agregador de feeds... ★ Una aplicación puede ser utilizada por distintos proyectos a la vez ★ Un proyecto puede hacer funcionar varios sitios web
Estructura de un proyecto Django /proyecto/
/proyecto/
__init__.py
urls.py
manage.py
settings.py
blog/
__init__.py
models.py
views.py
urls.py
templates/
static/
foro/
__init__.py
models.py
views.py
urls.py
templates/ Configuración del proyecto Mapeo de URLs global Vistas URLs de la aplicación Modelos de datos Aplicación 1 Aplicación 2
Archivos de un proyecto ★ __init__.py Indica a Python que el directorio sea interpretado como un paquete de Python ★ settings.py Contiene la configuración de la aplicación (conexión a bases de datos, aplicaciones instaladas, etc.) ★ manage.py Nos permite ejecutar comandos de Django sobre el proyecto (ej. para crear nuevas aplicaciones) ★ urls.py Contiene los patrones de URLs del proyecto
Archivos de una aplicación ★ __init__.py ★ models.py Contiene nuestros modelos de datos ★ views.py Contiene las vistas de la aplicación ★ tests.py Permite que incluyamos tests para la aplicación ★ urls.py Es usual añadir un urls.py con las URLs de nuestra aplicación e importarlas en el urls.py del proyecto por motivos de organización.
Modelos de datos ★ Son clases de Python que heredan de django.db.models.Model ★ Definen la estructura de los datos que se almacenarán en la BD ★ Las tablas, índices, constraints etc. de la base de datos se generan automáticamente a partir de los modelos ★ Un modelo está compuesto de campos. Django tiene distintos tipos de campos para texto, números, ficheros, etc. ★ Cuando nuestros modelos cambian podemos crear migraciones automáticas o personalizarlas
Sincronizamos la base de datos Creamos la migración inicial para la base de datos: python
manage.py
makemigrations Migrations
for
'blog':
0001_initial.py:
-‐
Create
model
Category
-‐
Create
model
Post Se crea un archivo Python de migración con los cambios de modelo:
Sincronizamos la base de datos Ejecutamos las migraciones pendientes para crear las tablas y constrains iniciales: python
manage.py
migrate Operations
to
perform:
Apply
all
migrations:
admin,
blog,
contenttypes,
auth,
sessions
Running
migrations:
Applying
contenttypes.0001_initial...
OK
Applying
auth.0001_initial...
OK
Applying
admin.0001_initial...
OK
Applying
blog.0001_initial...
OK
Applying
sessions.0001_initial...
OK
SQL generado BEGIN;
CREATE
TABLE
"blog_category"
( "id"
integer
NOT
NULL
PRIMARY
KEY
AUTOINCREMENT, "title"
varchar(100)
NOT
NULL, "slug"
varchar(100)
NOT
NULL);
CREATE
TABLE
"blog_post"
( "id"
integer
NOT
NULL
PRIMARY
KEY
AUTOINCREMENT, "title"
varchar(100)
NOT
NULL, "slug"
varchar(100)
NOT
NULL, "content"
text
NOT
NULL, "created_date"
datetime
NOT
NULL, "published_date"
date
NOT
NULL, "published"
bool
NOT
NULL, "author_id"
integer
NOT
NULL
REFERENCES
"auth_user"
("id"));
CREATE
INDEX
"blog_category_2dbcba41"
ON
"blog_category"
("slug"); CREATE
INDEX
"blog_post_2dbcba41"
ON
"blog_post"
("slug"); CREATE
INDEX
"blog_post_4f331e2f"
ON
"blog_post"
("author_id");
COMMIT;
¿Y si ya tengo una base de datos? Django ofrece un comando para generar las clases Python de los modelos a partir de una base de datos existente mediante introspección: python manage.py inspectdb
Creamos un sitio de administración Django incluye un paquete para generar un sitio de administración mediante introspeccción de modelos: django.contrib.admin from
django.contrib
import
admin from
.models
import
Category,
Post
class
CategoryAdmin(admin.ModelAdmin):
list_display
=
['title',
'slug']
prepopulated_fields
=
{'slug':('title',)}
Creamos las vistas A from
django.shortcuts
import
render,
get_object_or_404 from
.models
import
Category,
Post
def
post_list(request,
category_slug=None):
posts
=
Post.objects.filter(published=True)
if
category_slug:
#
si
viene
una
categoría
filtramos
por
ella
category
=
get_object_or_404(Category,
slug=category_slug)
posts
=
posts.filter(category=category)
return
render(request,
'blog/post/list.html',
locals())
Añadimos URLs para las vistas from
django.conf.urls
import
patterns,
include,
url from
django.contrib
import
admin from
.views
import
post_list,
post_detail