Introducción a Django
-
Upload
paradigma-tecnologico -
Category
Science
-
view
207 -
download
1
Transcript of Introducción a Django
¿Django?
Django!
Un framework web de alto nivel escrito en Python que fomenta el desarrollo rápido y limpio
y el diseño pragmático.
Django Reinhardt
Nombrado en honor a
¿Quién usa Django?
Django en
SecurityHub
★ 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
En la redacción de World Online para crear aplicaciones web rápidamente con fechas ajustadas
Nace en un entorno periodístico
Django sigue el principio
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.
Django es modular
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
VistasURLs de la aplicación
Modelos de datosAplicació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.pyEs 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.
Ensuciémonos las manos
Instalar Django
Instalamos Django con el comando:
pip install django
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
Arrancamos el servidor de desarrollo
Arrancamos el servidor de desarrollo: python manage.py runserver
Y entramos en http://127.0.0.1:8000/ ¡Voila!
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
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
from django.db import modelsfrom django.contrib.auth.models import Userclass Category(models.Model): title = models.CharField(max_length=100) slug = models.SlugField(max_length=100) def __unicode__(self): return self.titleclass 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
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, sessionsRunning 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 adminfrom .models import Category, Postclass 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
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: [email protected] Password: Password (again):
Superuser created successfully.
Accedemos al sitio de administración
Entramos en http://127.0.0.1:8000/admin/ y vemos nuestros modelos:
Creamos objetos
Creamos un post y vemos el listado del posts:
Creamos las vistas
Afrom django.shortcuts import render, get_object_or_404from .models import Category, Postdef 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
Añadimos URLs para las vistas
from django.conf.urls import patterns, include, urlfrom django.contrib import adminfrom .views import post_list, post_detailurlpatterns = 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
Añadimos nuestras URLs al proyecto
from django.conf.urls import patterns, include, url from django.contrib import adminurlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^', include('blog.urls')),)
urls.py
Creamos una plantilla base
{% load static %}<!DOCTYPE html><html><head> <title>{% block title %}{% endblock %}</title> <link href="{% static "css/blog.css" %}" rel="stylesheet"></head><body> <div class="content"> {% block content %} {% endblock %} </div></body></html>
base.html
Plantilla de listado de posts
A{% extends "blog/base.html" %}{% block title %} {% if category %}{{ category.title }}{% else %}Mi blog{% endif %}{% endblock %}
{% block content %} <h1>{% if category %}Posts de {{ category.title }}{% else %}Mi blog{% endif %}</h1> {% for post in posts %} <h2><a href="{% url "blog:post_detail" post.id post.slug %}">{{ post.title }}</a></h2> <p class="date"> Publicado el {{ post.published_date|date:"d \d\e M. Y" }} por {{ post.author.name }} en <a href="{% url "blog:post_list_by_category" post.category.slug %}">{{ post.category }}</a> </p> {{ post.content|truncatewords:30|linebreaks }} {% endfor %}{% endblock %}
post/list.html
Plantilla de detalle de post
A{% extends "blog/base.html" %}
{% block title %}{{ post.title }}{% endblock %}{% block content %} <h1>{{ post.title }}</h1> <p class="date"> Publicado el {{ post.published_date|date:"d \d\e M. Y" }} por {{ post.author.name }} en <a href="{% url "blog:post_list_by_category" post.category.slug %}">{{ post.category }}</a> </p> {{ post.content|linebreaks }}{% endblock %}
post/detail.html
¡Nuestro primer blog con Django!