SlideShare una empresa de Scribd logo
1 de 41
Descargar para leer sin conexión
¿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
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.

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	
  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
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',)}



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:	
  admin@paradigmatecnologico.com

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
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
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
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
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	
  de	
  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	
  de	
  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!
Introducción a Django

Más contenido relacionado

La actualidad más candente

Java GUI La librería Swing
Java GUI La librería Swing Java GUI La librería Swing
Java GUI La librería Swing
Laura
 
Herencia - Programación Orientada a Objetos
Herencia - Programación Orientada a ObjetosHerencia - Programación Orientada a Objetos
Herencia - Programación Orientada a Objetos
Mario Villaseñor
 

La actualidad más candente (20)

Introducción a HTML5 y CSS3
Introducción a HTML5 y CSS3Introducción a HTML5 y CSS3
Introducción a HTML5 y CSS3
 
C3 lenguaje de presentación.
C3 lenguaje de presentación.C3 lenguaje de presentación.
C3 lenguaje de presentación.
 
Metodologías ágiles
Metodologías ágilesMetodologías ágiles
Metodologías ágiles
 
Ensayo php
Ensayo phpEnsayo php
Ensayo php
 
Tablas hash en java
Tablas hash en javaTablas hash en java
Tablas hash en java
 
Php ppt
Php pptPhp ppt
Php ppt
 
COLAS
COLASCOLAS
COLAS
 
Python para principiantes
Python para principiantesPython para principiantes
Python para principiantes
 
MAnual de php básico
MAnual de php básicoMAnual de php básico
MAnual de php básico
 
Especificación de requisitos portal web ok
Especificación de requisitos portal web okEspecificación de requisitos portal web ok
Especificación de requisitos portal web ok
 
Java GUI La librería Swing
Java GUI La librería Swing Java GUI La librería Swing
Java GUI La librería Swing
 
Programación extrema xp
Programación extrema xpProgramación extrema xp
Programación extrema xp
 
Patrones de diseño de GoF
Patrones de diseño de GoFPatrones de diseño de GoF
Patrones de diseño de GoF
 
Programacion Orientada a Objetos - Unidad 2 clases y objetos
Programacion Orientada a Objetos - Unidad 2 clases y objetosProgramacion Orientada a Objetos - Unidad 2 clases y objetos
Programacion Orientada a Objetos - Unidad 2 clases y objetos
 
Herencia - Programación Orientada a Objetos
Herencia - Programación Orientada a ObjetosHerencia - Programación Orientada a Objetos
Herencia - Programación Orientada a Objetos
 
CSS - CSS3
CSS - CSS3CSS - CSS3
CSS - CSS3
 
Ordenamiento QuickSort
Ordenamiento QuickSortOrdenamiento QuickSort
Ordenamiento QuickSort
 
Poo 3 herencia
Poo 3 herenciaPoo 3 herencia
Poo 3 herencia
 
4 unidad polimorfismo
4 unidad polimorfismo4 unidad polimorfismo
4 unidad polimorfismo
 
Creación de tablas y relaciones en mysql workbench
Creación de tablas y relaciones en mysql workbenchCreación de tablas y relaciones en mysql workbench
Creación de tablas y relaciones en mysql workbench
 

Destacado

Federaciones%20y%20deportes%20de%20asociaci%f3n%202008
Federaciones%20y%20deportes%20de%20asociaci%f3n%202008Federaciones%20y%20deportes%20de%20asociaci%f3n%202008
Federaciones%20y%20deportes%20de%20asociaci%f3n%202008
Cesar A Morin H
 

Destacado (20)

Federaciones%20y%20deportes%20de%20asociaci%f3n%202008
Federaciones%20y%20deportes%20de%20asociaci%f3n%202008Federaciones%20y%20deportes%20de%20asociaci%f3n%202008
Federaciones%20y%20deportes%20de%20asociaci%f3n%202008
 
ECMAScript 6
ECMAScript 6ECMAScript 6
ECMAScript 6
 
Use Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projectsUse Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projects
 
Analysis of Websites as Graphs for SEO
Analysis of Websites as Graphs for SEOAnalysis of Websites as Graphs for SEO
Analysis of Websites as Graphs for SEO
 
Cómo usar google analytics
Cómo usar google analyticsCómo usar google analytics
Cómo usar google analytics
 
Kafka y python
Kafka y pythonKafka y python
Kafka y python
 
Manuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octManuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4oct
 
UNA - Responsabilidad social empresarial
UNA - Responsabilidad social empresarial UNA - Responsabilidad social empresarial
UNA - Responsabilidad social empresarial
 
Google Analytics for Developers
Google Analytics for DevelopersGoogle Analytics for Developers
Google Analytics for Developers
 
Programación Reactiva con RxJava
Programación Reactiva con RxJavaProgramación Reactiva con RxJava
Programación Reactiva con RxJava
 
Overview atlas (1)
Overview atlas (1)Overview atlas (1)
Overview atlas (1)
 
UNA - DESARROLLO ORGANIZACIONAL - ADQUISICION DE EQUIPOS CON TECNOLOGÍA DE PUNTA
UNA - DESARROLLO ORGANIZACIONAL - ADQUISICION DE EQUIPOS CON TECNOLOGÍA DE PUNTAUNA - DESARROLLO ORGANIZACIONAL - ADQUISICION DE EQUIPOS CON TECNOLOGÍA DE PUNTA
UNA - DESARROLLO ORGANIZACIONAL - ADQUISICION DE EQUIPOS CON TECNOLOGÍA DE PUNTA
 
Transformación Digital
Transformación DigitalTransformación Digital
Transformación Digital
 
UNA (DESARROLLO ORGANIZACIONAL) - FOROS
UNA (DESARROLLO ORGANIZACIONAL) - FOROSUNA (DESARROLLO ORGANIZACIONAL) - FOROS
UNA (DESARROLLO ORGANIZACIONAL) - FOROS
 
UNA - ANALISIS GRUPAL DE UN ESTUDIO DE CASO - ORGANIZACION Y ENTORNO
UNA - ANALISIS GRUPAL DE UN ESTUDIO DE CASO - ORGANIZACION Y ENTORNOUNA - ANALISIS GRUPAL DE UN ESTUDIO DE CASO - ORGANIZACION Y ENTORNO
UNA - ANALISIS GRUPAL DE UN ESTUDIO DE CASO - ORGANIZACION Y ENTORNO
 
Python y Flink
Python y FlinkPython y Flink
Python y Flink
 
¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?
 
Introducción a Kubernetes
Introducción a KubernetesIntroducción a Kubernetes
Introducción a Kubernetes
 
HTML5 Web Components
HTML5 Web ComponentsHTML5 Web Components
HTML5 Web Components
 
UNA - Análisis grupal de un estudio de caso - ORGANIZACION Y ENTORNO
UNA - Análisis grupal de un estudio de caso - ORGANIZACION Y ENTORNOUNA - Análisis grupal de un estudio de caso - ORGANIZACION Y ENTORNO
UNA - Análisis grupal de un estudio de caso - ORGANIZACION Y ENTORNO
 

Similar a Introducción a Django

Introducción a Python / Django
Introducción a Python / DjangoIntroducción a Python / Django
Introducción a Python / Django
betabeers
 
Taller de Django betabeers
Taller de Django betabeersTaller de Django betabeers
Taller de Django betabeers
betabeers
 

Similar a Introducción a Django (20)

Django
DjangoDjango
Django
 
Introducción a Python / Django
Introducción a Python / DjangoIntroducción a Python / Django
Introducción a Python / Django
 
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
 
Taller de Django betabeers
Taller de Django betabeersTaller de Django betabeers
Taller de Django betabeers
 
Dia2
Dia2Dia2
Dia2
 
Django
DjangoDjango
Django
 
Angular Fundamentals
Angular FundamentalsAngular Fundamentals
Angular Fundamentals
 
Django - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales ConceptosDjango - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales Conceptos
 
Django - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales ConceptosDjango - Curso Básico - Principales Conceptos
Django - Curso Básico - Principales Conceptos
 
RAML
RAMLRAML
RAML
 
Semana 2 Configuración entorno de desarrollo
Semana 2   Configuración entorno de desarrolloSemana 2   Configuración entorno de desarrollo
Semana 2 Configuración entorno de desarrollo
 
Django - Plataforma de sitios web
Django - Plataforma de sitios webDjango - Plataforma de sitios web
Django - Plataforma de sitios web
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NET
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
Drupal 8 WorkShop - e-Ghost 2015
Drupal 8 WorkShop - e-Ghost 2015  Drupal 8 WorkShop - e-Ghost 2015
Drupal 8 WorkShop - e-Ghost 2015
 
Diseño web
Diseño webDiseño web
Diseño web
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con Django
 
Diseño web
Diseño webDiseño web
Diseño web
 
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
Corp. In. Tec. S.A. - Capacitaciones en Informática - Programación con CodeIg...
 
#JoomlaIO - Desarrollo de Plantillas para Joomla!
#JoomlaIO - Desarrollo de Plantillas para Joomla!#JoomlaIO - Desarrollo de Plantillas para Joomla!
#JoomlaIO - Desarrollo de Plantillas para Joomla!
 

Más de Paradigma Digital

Más de Paradigma Digital (16)

Ddd + ah + microservicios
Ddd + ah + microserviciosDdd + ah + microservicios
Ddd + ah + microservicios
 
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
 
Have you met Istio?
Have you met Istio?Have you met Istio?
Have you met Istio?
 
Linkerd a fondo
Linkerd a fondoLinkerd a fondo
Linkerd a fondo
 
Horneando apis
Horneando apisHorneando apis
Horneando apis
 
Java 8 time to join the future
Java 8  time to join the futureJava 8  time to join the future
Java 8 time to join the future
 
Programación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxProgramación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFlux
 
Orquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixOrquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace Netflix
 
Meetup microservicios: API Management
Meetup microservicios: API ManagementMeetup microservicios: API Management
Meetup microservicios: API Management
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
 
Implementando microservicios
Implementando microserviciosImplementando microservicios
Implementando microservicios
 
Equipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma DigitalEquipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma Digital
 
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
 
Cultura Digital Paradigma
Cultura Digital ParadigmaCultura Digital Paradigma
Cultura Digital Paradigma
 
Seminario Apache Solr
Seminario Apache SolrSeminario Apache Solr
Seminario Apache Solr
 

Último

Gribbin, John. - Historia de la ciencia, 1543-2001 [EPL-FS] [2019].pdf
Gribbin, John. - Historia de la ciencia, 1543-2001 [EPL-FS] [2019].pdfGribbin, John. - Historia de la ciencia, 1543-2001 [EPL-FS] [2019].pdf
Gribbin, John. - Historia de la ciencia, 1543-2001 [EPL-FS] [2019].pdf
frank0071
 
Flores Galindo, A. - La ciudad sumergida. Aristocracia y plebe en Lima, 1760-...
Flores Galindo, A. - La ciudad sumergida. Aristocracia y plebe en Lima, 1760-...Flores Galindo, A. - La ciudad sumergida. Aristocracia y plebe en Lima, 1760-...
Flores Galindo, A. - La ciudad sumergida. Aristocracia y plebe en Lima, 1760-...
frank0071
 
IAAS- EPIDEMIOLOGIA. antisepcsia, desinfección, epp
IAAS-  EPIDEMIOLOGIA. antisepcsia, desinfección, eppIAAS-  EPIDEMIOLOGIA. antisepcsia, desinfección, epp
IAAS- EPIDEMIOLOGIA. antisepcsia, desinfección, epp
CatalinaSezCrdenas
 
Althusser, Louis. - Ideología y aparatos ideológicos de Estado [ocr] [2003].pdf
Althusser, Louis. - Ideología y aparatos ideológicos de Estado [ocr] [2003].pdfAlthusser, Louis. - Ideología y aparatos ideológicos de Estado [ocr] [2003].pdf
Althusser, Louis. - Ideología y aparatos ideológicos de Estado [ocr] [2003].pdf
frank0071
 
Terapia Cognitivo Conductual CAPITULO 2.
Terapia Cognitivo Conductual CAPITULO 2.Terapia Cognitivo Conductual CAPITULO 2.
Terapia Cognitivo Conductual CAPITULO 2.
ChiquinquirMilagroTo
 

Último (20)

Pelos y fibras. Criminalistica pelos y fibras
Pelos y fibras. Criminalistica pelos y fibrasPelos y fibras. Criminalistica pelos y fibras
Pelos y fibras. Criminalistica pelos y fibras
 
Mapa-conceptual-de-la-Seguridad-y-Salud-en-el-Trabajo-3.pptx
Mapa-conceptual-de-la-Seguridad-y-Salud-en-el-Trabajo-3.pptxMapa-conceptual-de-la-Seguridad-y-Salud-en-el-Trabajo-3.pptx
Mapa-conceptual-de-la-Seguridad-y-Salud-en-el-Trabajo-3.pptx
 
LOS PRIMEROS PSICÓLOGOS EXPERIMENTALES (1).pdf
LOS PRIMEROS PSICÓLOGOS EXPERIMENTALES (1).pdfLOS PRIMEROS PSICÓLOGOS EXPERIMENTALES (1).pdf
LOS PRIMEROS PSICÓLOGOS EXPERIMENTALES (1).pdf
 
Matemáticas Aplicadas usando Python
Matemáticas Aplicadas   usando    PythonMatemáticas Aplicadas   usando    Python
Matemáticas Aplicadas usando Python
 
Gribbin, John. - Historia de la ciencia, 1543-2001 [EPL-FS] [2019].pdf
Gribbin, John. - Historia de la ciencia, 1543-2001 [EPL-FS] [2019].pdfGribbin, John. - Historia de la ciencia, 1543-2001 [EPL-FS] [2019].pdf
Gribbin, John. - Historia de la ciencia, 1543-2001 [EPL-FS] [2019].pdf
 
medicinatradicionalescuelanacionaldesalud.pptx
medicinatradicionalescuelanacionaldesalud.pptxmedicinatradicionalescuelanacionaldesalud.pptx
medicinatradicionalescuelanacionaldesalud.pptx
 
Antequera, L. - Historia desconocida del descubrimiento de América [2021].pdf
Antequera, L. - Historia desconocida del descubrimiento de América [2021].pdfAntequera, L. - Historia desconocida del descubrimiento de América [2021].pdf
Antequera, L. - Historia desconocida del descubrimiento de América [2021].pdf
 
Schuster, Nicole. - La metrópolis y la arquitectura del poder ayer hoy y mana...
Schuster, Nicole. - La metrópolis y la arquitectura del poder ayer hoy y mana...Schuster, Nicole. - La metrópolis y la arquitectura del poder ayer hoy y mana...
Schuster, Nicole. - La metrópolis y la arquitectura del poder ayer hoy y mana...
 
Fresas y sistemas de pulido en odontología
Fresas y sistemas de pulido en odontologíaFresas y sistemas de pulido en odontología
Fresas y sistemas de pulido en odontología
 
La Célula, unidad fundamental de la vida
La Célula, unidad fundamental de la vidaLa Célula, unidad fundamental de la vida
La Célula, unidad fundamental de la vida
 
Flores Galindo, A. - La ciudad sumergida. Aristocracia y plebe en Lima, 1760-...
Flores Galindo, A. - La ciudad sumergida. Aristocracia y plebe en Lima, 1760-...Flores Galindo, A. - La ciudad sumergida. Aristocracia y plebe en Lima, 1760-...
Flores Galindo, A. - La ciudad sumergida. Aristocracia y plebe en Lima, 1760-...
 
Glaeser, E. - El triunfo de las ciudades [2011].pdf
Glaeser, E. - El triunfo de las ciudades [2011].pdfGlaeser, E. - El triunfo de las ciudades [2011].pdf
Glaeser, E. - El triunfo de las ciudades [2011].pdf
 
El Gran Atractor, la misteriosa fuerza que está halando a la Vía Láctea.pptx
El Gran Atractor, la misteriosa fuerza que está halando a la Vía Láctea.pptxEl Gran Atractor, la misteriosa fuerza que está halando a la Vía Láctea.pptx
El Gran Atractor, la misteriosa fuerza que está halando a la Vía Láctea.pptx
 
REINO FUNGI: CONCEPTO, CARACTERISTICAS, ETC
REINO FUNGI: CONCEPTO, CARACTERISTICAS, ETCREINO FUNGI: CONCEPTO, CARACTERISTICAS, ETC
REINO FUNGI: CONCEPTO, CARACTERISTICAS, ETC
 
IAAS- EPIDEMIOLOGIA. antisepcsia, desinfección, epp
IAAS-  EPIDEMIOLOGIA. antisepcsia, desinfección, eppIAAS-  EPIDEMIOLOGIA. antisepcsia, desinfección, epp
IAAS- EPIDEMIOLOGIA. antisepcsia, desinfección, epp
 
Althusser, Louis. - Ideología y aparatos ideológicos de Estado [ocr] [2003].pdf
Althusser, Louis. - Ideología y aparatos ideológicos de Estado [ocr] [2003].pdfAlthusser, Louis. - Ideología y aparatos ideológicos de Estado [ocr] [2003].pdf
Althusser, Louis. - Ideología y aparatos ideológicos de Estado [ocr] [2003].pdf
 
Terapia Cognitivo Conductual CAPITULO 2.
Terapia Cognitivo Conductual CAPITULO 2.Terapia Cognitivo Conductual CAPITULO 2.
Terapia Cognitivo Conductual CAPITULO 2.
 
Ecuaciones Diferenciales de Primer Orden
Ecuaciones Diferenciales de Primer OrdenEcuaciones Diferenciales de Primer Orden
Ecuaciones Diferenciales de Primer Orden
 
Enfermeria_Geriatrica_TeresaPerezCastro.doc
Enfermeria_Geriatrica_TeresaPerezCastro.docEnfermeria_Geriatrica_TeresaPerezCastro.doc
Enfermeria_Geriatrica_TeresaPerezCastro.doc
 
PRESENTACION PRE-DEFENSA PROYECTO I.pptx
PRESENTACION PRE-DEFENSA PROYECTO I.pptxPRESENTACION PRE-DEFENSA PROYECTO I.pptx
PRESENTACION PRE-DEFENSA PROYECTO I.pptx
 

Introducción a Django

  • 1.
  • 3. Django! Un framework web de alto nivel escrito en Python que fomenta el desarrollo rápido y limpio 
 y el diseño pragmático.
  • 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
  • 9. Django sigue el principio
  • 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.

  • 20. Instalar Django Instalamos Django con el comando: 
  pip  install  django
  • 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:
  • 33. Creamos objetos Creamos un post y vemos el listado del posts:
  • 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
  • 37. 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
  • 38. 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  de  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
  • 39. 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  de  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
  • 40. ¡Nuestro primer blog con Django!