7. ★ 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
8. En la redacción de World Online para crear
aplicaciones web rápidamente con fechas ajustadas
Nace en un entorno periodístico
10. 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
11. ¿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.
13. 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.
14. 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)
15. 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
16. 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
17. 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
18. 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.
21. Nuestro primer proyecto Django
Creamos nuestro proyecto web:
django-‐admin
startproject
miweb
Y nuestra aplicación blog dentro de éste:
cd
miweb
python
manage.py
startapp
blog
22. Arrancamos el servidor de desarrollo
Arrancamos el servidor de desarrollo:
python manage.py runserver
Y entramos en http://127.0.0.1:8000/ ¡Voila!
23. Activamos nuestra app
Añadimos la aplicación al setting INSTALLED_APPS en la
configuración del proyecto para activarla:
INSTALLED_APPS
=
(
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
settings.py
24. 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
25. from
django.db
import
models
from
django.contrib.auth.models
import
User
class
Category(models.Model):
title
=
models.CharField(max_length=100)
slug
=
models.SlugField(max_length=100)
def
__unicode__(self):
return
self.title
class
Post(models.Model):
title
=
models.CharField(max_length=100)
slug
=
models.SlugField(max_length=100)
author
=
models.ForeignKey(User,
related_name='posts')
content
=
models.TextField()
created_date
=
models.DateTimeField(auto_now_add=True)
published_date
=
models.DateField()
published
=
models.BooleanField(default=True)
class
Meta:
ordering
=
(‘-‐published_date',)
def
__unicode__(self):
return
self.title
models.py
26. 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:
27. 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
28. 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;
29. ¿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
30. 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',)}
admin.site.register(Category,
CategoryAdmin)
class
PostAdmin(admin.ModelAdmin):
list_display
=
['title',
'category',
'slug',
'author',
'created_date',
'published_date',
'published']
list_filter
=
['created_date',
'published_date',
'published',
'category']
search_fields
=
['title',
'content']
prepopulated_fields
=
{'slug':('title',)}
admin.site.register(Post,
PostAdmin)
admin.py
31. Creamos un super-usuario
Creamos un super-usuario para acceder al sitio de administración:
python manage.py createsuperuser
Username
(leave
blank
to
use
'zenx'):
admin
Email
address:
admin@paradigmatecnologico.com
Password:
Password
(again):
Superuser
created
successfully.
32. Accedemos al sitio de administración
Entramos en http://127.0.0.1:8000/admin/ y vemos nuestros
modelos:
34. 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())
def
post_detail(request,
id,
slug):
post
=
get_object_or_404(Post,
id=id,
slug=slug,
published=True)
return
render(request,
'blog/post/detail.html',
{'post':
post})
views.py
35. 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
urlpatterns
=
patterns('',
url(r'^$',
post_list,
name='post_list'),
url(r'^(?P<category_slug>[-‐w]+)/$',
post_list,
name='post_list_by_category'),
url(r'^(?P<id>d+)/(?P<slug>[-‐w]+)/$',
post_detail,
name='post_detail'),
)
urls.py
36. Añadimos nuestras URLs al proyecto
from
django.conf.urls
import
patterns,
include,
url
from
django.contrib
import
admin
urlpatterns
=
patterns('',
url(r'^admin/',
include(admin.site.urls)),
url(r'^',
include('blog.urls')),
)
urls.py