Diapositivas Django

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 41

¿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.
Nombrado en honor a

Django
Reinhardt
¿Quién usa Django?
Django en

SecurityHub
Django es Python
★ 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
Nace en un entorno periodístico
En la redacción de World Online para crear
aplicaciones web rápidamente con fechas ajustadas
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   Mapeo de URLs global
               manage.py  
               settings.py   Configuración del proyecto
       blog/   Aplicación 1
               __init__.py  
             models.py   Modelos de datos
             views.py Vistas
             urls.py  
             templates/  
URLs de la aplicación
             static/  

     foro/   Aplicación 2
             __init__.py  
             models.py  
             views.py  
             urls.py  
             templates/
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:

settings.py
INSTALLED_APPS  =  (
       'django.contrib.admin',
       'django.contrib.auth',
       'django.contrib.contenttypes',
       'django.contrib.sessions',
       'django.contrib.messages',
       'django.contrib.staticfiles',
       'blog',
)  
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
models.py
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
Sincronizamos la base de datos

Creamos la migración inicial para la base de datos:

python  manage.py  makemigrations

Se crea un archivo Python de migración con los cambios de modelo:

Migrations  for  'blog':


   0001_initial.py:
       -­‐  Create  model  Category
       -­‐  Create  model  Post
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 admin.py


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)
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

A views.py
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})
Añadimos URLs para las vistas

urls.py
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'),        
)  
Añadimos nuestras URLs al proyecto

from  django.conf.urls  import  patterns,  include,  url


from  django.contrib  import  admin
urls.py

urlpatterns  =  patterns('',
       url(r'^admin/',  include(admin.site.urls)),
       url(r'^',  include('blog.urls')),
)  
Creamos una plantilla base

{%  load  static  %} base.html


<!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>  
Plantilla de listado de posts

A{%  extends  "blog/base.html"  %} post/list.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  %}  
Plantilla de detalle de post

A post/detail.html
{%  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  %}  
¡Nuestro primer blog con Django!

También podría gustarte