Your SlideShare is downloading. ×
0
Juan Riaza  @juanriaza
Don’t reinvent the wheel
https://gist.github.com/3143116
Jorge	  Bas0da    Jaime	  Irurzunme@jorgebas0da.com   jaime@irurzun.com  @jorgebas0da          @jaimeirurzun
• Legible                Sintaxis	  intui+va	  y	  estricta• Produc-vo              Entre	  1/3	  y	  1/5	  más	  conciso	...
El	  Intérprete
El	  Intérprete                        Modo	  Batch    holamundo.py                                $ python holamundo.py#!...
El	  Intérprete                           Modo	  Batch     holamundo.py                                      $ python hola...
Tipos	  de	  datosobject          	  h>p://docs.python.org/library/stdtypes.html
Tipos	  de	  datos         int    1234        long   35L       float    3.1415object          	  h>p://docs.python.org/libr...
Tipos	  de	  datos          int    1234        long   35L       float    3.1415         bool    True     Falseobject       ...
Tipos	  de	  datos          int    1234        long   35L       float    3.1415         bool    True     False          str...
Tipos	  de	  datos          int     1234        long   35L       float    3.1415         bool     True     False          s...
Tipos	  de	  datos          int     1234        long   35L       float    3.1415         bool     True     False          s...
Tipos	  de	  datos           int     1234        long   35L       float    3.1415         bool      True     False         ...
Tipos	  de	  datos                                      o	                                                            ¡T i...
Operadores	  h>p://docs.python.org/library/operator.html
Operadores              a + b       a - b       a * b        a / bnuméricos              a % b        -a           +a     ...
Operadores                 a + b       a - b       a * b        a / b  numéricos                 a % b        -a          ...
Operadores                 a + b       a - b       a * b        a / b  numéricos                 a % b        -a          ...
Usos	  frecuentes:	  list
Usos	  frecuentes:	  list>>> nums = [1, 2, 3]>>> nums[0]1
Usos	  frecuentes:	  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue
Usos	  frecuentes:	  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue>>> nums.append(4)>>> print nums[1, 2, 3, 4]
Usos	  frecuentes:	  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue>>> nums.append(4)>>> print nums[1, 2, 3, 4]>>> ...
Usos	  frecuentes:	  str
Usos	  frecuentes:	  str>>> "Python mola"[1:4]yth
Usos	  frecuentes:	  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7
Usos	  frecuentes:	  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP n...
Usos	  frecuentes:	  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP n...
Usos	  frecuentes:	  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP n...
Usos	  frecuentes:	  dict
Usos	  frecuentes:	  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]
Usos	  frecuentes:	  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] ...
Usos	  frecuentes:	  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] ...
Usos	  frecuentes:	  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] ...
Usos	  frecuentes:	  str	  %
Usos	  frecuentes:	  str	  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio
Usos	  frecuentes:	  str	  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio>>> "%s sabe %i idiomas" % ("Hycker", 5)Hyc...
Usos	  frecuentes:	  str	  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio>>> "%s sabe %i idiomas" % ("Hycker", 5)Hyc...
Módulosjuego/     __init__.py                        1. Un	  módulo	  es	  un	  fichero	  .py     bonus/        __init__.py...
Módulosjuego/      __init__.py                           1. Un	  módulo	  es	  un	  fichero	  .py      bonus/         __ini...
Módulosjuego/     __init__.py     bonus/        __init__.py        estrella.py        moneda.py        planta.py        .....
Módulosjuego/     __init__.py     bonus/        __init__.py                       >>> from juego.personajes.mario import M...
Estructuras {}
Estructuras {}
Identación>>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance        4	  Espacios	  para	  ...
Identación>>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance                              ...
¿PEP	  8?                                                                 PEP 8•	  Guido	  van	  Rossum	  (2001)•	  Recome...
Funcionesdef my_first_function(p1, p2):    return "Hello World!"       Minúsculas       Palabras	  separadas	  por	  _    ...
Funciones                                                 21   def my_first_function(p1, p2):      3 return "Hello World!"...
Conversión	  de	  -pos  	  h>p://docs.python.org/library/func-ons.html
Conversión	  de	  -pos>>> int(1.3)1    	  h>p://docs.python.org/library/func-ons.html
Conversión	  de	  -pos>>> int(1.3)1>>> str(2)2    	  h>p://docs.python.org/library/func-ons.html
Conversión	  de	  -pos>>> int(1.3)1>>> str(2)2>>> float(1)1.0    	  h>p://docs.python.org/library/func-ons.html
Conversión	  de	  -pos>>> int(1.3)1                            >>> tuple([1,2,3])                            (1, 2, 3)>>> ...
Conversión	  de	  -pos>>> int(1.3)1                            >>> tuple([1,2,3])                            (1, 2, 3)>>> ...
Funciones	  comunes  	  h>p://docs.python.org/library/func-ons.html
Funciones	  comunes>>> len("Python Mola")11>>> len([1,2,3,4])4         	  h>p://docs.python.org/library/func-ons.html
Funciones	  comunes>>> len("Python Mola")11>>> len([1,2,3,4])4>>>   range(5)[0,   1, 2, 3, 4]>>>   range(1,7)[1,   2, 3, 4...
Funciones	  comunes                                      >>> type(True)>>> len("Python Mola")                             ...
Funciones	  comunes                                      >>> type(True)>>> len("Python Mola")                             ...
Funciones	  interesantes           Son	  sólo	  un	  ejemplo...    	  h>p://docs.python.org/library/func-ons.html
Funciones	  interesantes>>> a = [1,2,3]>>> b = [4,5,6]>>> zip(a,b)[(1, 4), (2, 5), (3, 6)]                   Son	  sólo	  ...
Funciones	  interesantes>>> a = [1,2,3]>>> b = [4,5,6]>>> zip(a,b)[(1, 4), (2, 5), (3, 6)]>>> sorted([5,1,3,4,2])[1, 2, 3,...
Funciones	  interesantes>>> a = [1,2,3]>>> b = [4,5,6]                           >>> round(1.2345, 2)>>> zip(a,b)         ...
Funciones	  interesantes>>> a = [1,2,3]>>> b = [4,5,6]                           >>> round(1.2345, 2)>>> zip(a,b)         ...
Funciones	  de	  ayuda
Funciones	  de	  ayuda>>> dir([1,2,3])[__add__, __class__, __contains__, __delattr__, __delitem__,__delslice__, __doc__, _...
Funciones	  de	  ayuda>>> dir([1,2,3])[__add__, __class__, __contains__, __delattr__, __delitem__,__delslice__, __doc__, _...
Clasesclass Student(object):    def __init__(self, name, age):        self.name = name        self.age = age   def hello(s...
Clases    1              2class Student(object):  3 def __init__(self, name, age):      4 self.name = name        self.age...
El	  operador	  ()• Es	  importante	  diferenciar:    funcion	  	  	  vs	  	  	  funcion()    Clase	  	  	  	  	  	  	  vs...
Sentencias:	  if-­‐else$name = "Jon";               name = "Jon"if($name == "Jon"){          if name == "Jon":    $name = ...
Sentencias:	  while       $count = 0;       while ($count < 5) {           echo "Number ".$count;           $count+=1;    ...
Sentencias:	  for      for ($i=0; $i < 5; $i++) {          echo "Number ".$count;      }      for i in range(4):          ...
Sentencias:	  try-­‐except           try {               $result = 3 / 0;           } catch (Exception $e) {              ...
Conclusiones•	  Python	  es	  un	  lenguaje	  fácil	  de	  aprender.•	  Menos	  código:    •	  Muchos	  Muchísimos	  menos...
Conclusiones•	  Python	  es	  un	  lenguaje	  fácil	  de	  aprender.•	  Menos	  código:    •	  Muchos	  Muchísimos	  menos...
Evolución	  de	  la	  Web                   Desarrollo	  Web1ª	  Generación    2ª	  Generación   3ª	  Generación    HTML  ...
Frameworks	  web
Django:	  Qué	  y	  dónde
Filosoa•	  Loose	  coupling,	  	  Acoplamiento	  débil.    •	  Cada	  capa	  es	  independiente	  y	  desconoce	  completa...
Filosoa•	  Loose	  coupling,	  	  Acoplamiento	  débil.    •	  Cada	  capa	  es	  independiente	  y	  desconoce	  completa...
Filosoa•	  Explicit	  is	  beSer	  than	  implicit.    •	  Este	  es	  un	  principio	  de	  Python.    •	  Django	  no	  ...
La	  comunidad
La	  comunidad• django-­‐users        22.000	  miembros• django-­‐developers        7.000	  miembros• djangoproject.com   ...
¿Quién	  usa	  Django?
¿Quién	  usa	  Django?
Bienvenidos	  al	  mundo	  de	  Oz
Ficheros	  y	  Carpetas            ¿Es	  Django	  tán	  simple	  y	  fácil	  de	  usar?                 *	  Incluida	  la	...
Ficheros	  y	  Carpetas             ¿Es	  Django	  tán	  simple	  y	  fácil	  de	  usar?FicherosCarpetas                  ...
Ficheros	  y	  Carpetas                   ¿Es	  Django	  tán	  simple	  y	  fácil	  de	  usar?           Rails     Symfony...
Ficheros	  y	  Carpetas                   ¿Es	  Django	  tán	  simple	  y	  fácil	  de	  usar?           Rails     Symfony...
Ficheros	  y	  Carpetas                   ¿Es	  Django	  tán	  simple	  y	  fácil	  de	  usar?           Rails     Symfony...
Let’s	  enjoy
Crear	  nuestro	  proyecto                      de	  5	  ficheros	  ;-­‐)
Crear	  nuestro	  proyecto              de	  5	  ficheros	  ;-­‐)    $ django-admin startproject dwitter
Crear	  nuestro	  proyecto                                                               de	  5	  ficheros	  ;-­‐)         ...
seungs.py
Arrancar	  nuestro	  proyecto                        de	  5	  ficheros	  ;-­‐)
Arrancar	  nuestro	  proyecto                               de	  5	  ficheros	  ;-­‐)    $ cd dwitter    $ python manage.py...
Arrancar	  nuestro	  proyecto                               de	  5	  ficheros	  ;-­‐)    $ cd dwitter    $ python manage.py...
MVC	  en	  DjangoModelo	  =	  Model   Vista	  =	  Template   Controlador	  =	  URL+View
URLs	  y	  Vistas• El	  fichero	  urls.py	  actúa	  como	  puerta	  de	  entrada	  para	  las	     pe0ciones	  HTTP• Se	  d...
URLs	  y	  Vistas• La	  función	  de	  views.py	  recibe	  como	  parámetros	  un	  objeto	     H>pRequest	  y	  todos	  l...
URLs	  y	  Vistas Ejemplo	  1:	  	  http://mysite.com/time           from django.conf.urls.defaults import *           fro...
URLs	  y	  Vistas Ejemplo	  2:	  	  http://mysite.com/time/plus/2           from django.conf.urls.defaults import *       ...
URLs	  y	  Vistas Ejemplo	  2:	  	  http://mysite.com/time/plus/2           from django.conf.urls.defaults import *       ...
¡Recuerda!:	  MVC
Templates• Separan	  la	  lógica	  de	  presentación	  a	  una	  capa	  independiente.     • Ficheros	  independientes	  (...
Templates • Se	  basan	  en	  dos	  0pos	  de	  objetos:	  Template()	  y	  Context().       • Un	  objeto	  Template()	  ...
Templates• Primera	  aproximación	  al	  obje0vo:	  Template	  +	  Context         from django.http import HttpResponse   ...
Templates• Segunda	  aproximación	  al	  obje0vo:	  open(),	  read(),	  close()      from django.http import HttpResponse ...
Templates• Segunda	  aproximación	  al	  obje0vo:	  open(),	  read(),	  close()      from django.http import HttpResponse ...
Templates• Segunda	  aproximación	  al	  obje0vo:	  open(),	  read(),	  close()      from django.http import HttpResponse ...
Templates• Tercera	  aproximación	  al	  obje0vo:	  get_template()                             TEMPLATE_DIRS = (     seung...
Templates• Tercera	  aproximación	  al	  obje0vo:	  get_template()                             TEMPLATE_DIRS = (     seung...
Templates• Tercera	  aproximación	  al	  obje0vo:	  get_template()                             TEMPLATE_DIRS = (     seung...
Templates• Obje0vo	  alcanzado:	  render() from django.shortcuts import render from datetime import datetime def hora_actu...
Templates• Obje0vo	  alcanzado:	  render() from django.shortcuts import render from datetime import datetime def hora_actu...
Templates• Obje0vo	  alcanzado:	  render() from django.shortcuts import render from datetime import datetime def hora_actu...
Templates	  en	  detalle•	  Si,	  otro	  sistema	  de	  templates  •	  Smarty,	  Tiles,	  ClearSilver	  ...	  •Describen	 ...
Filosoa	  y	  Limitaciones•	  La	  sintaxis	  debe	  estar	  desacoplada	  del	  HTML/XML.•	  Los	  diseñadores	  saben	  ...
Templates:	  {{}}<html>    <head>Ejemplo templates</head>    <body>        Hola, {{ username }}.    </body></html>     {us...
Filters	  y	  Tags
Filters	  y	  Tags
Filters	  y	  Tagsfilter   {{ varible|filter }}
Filters	  y	  Tags      filter     {{ varible|filter }}inline	  tag   {% tag var1 var2 %}
Filters	  y	  Tags      filter     {{ varible|filter }}inline	  tag   {% tag var1 var2 %}block	  tag    {% tag var1 %}     ...
Templates:	  tags	  {%	  %}
Templates:	  tags	  {%	  %}comment   {% comment %} Bu! {% endcomment %}
Templates:	  tags	  {%	  %}comment   {% comment %} Bu! {% endcomment %}    for   {% for elemento in lista %}              ...
Templates:	  tags	  {%	  %}comment    {% comment %} Bu! {% endcomment %}    for    {% for elemento in lista %}            ...
Templates:	  tags	  {%	  %}
Templates:	  tags	  {%	  %}cycle   {% for elemento in lista %}            <li class="{% cycle rojo azul %}">{{ elemento }}...
Templates:	  tags	  {%	  %}  cycle   {% for elemento in lista %}              <li class="{% cycle rojo azul %}">{{ element...
Templates:	  tags	  {%	  %}  cycle   {% for elemento in lista %}              <li class="{% cycle rojo azul %}">{{ element...
Templates:	  tags	  {%	  %}  cycle   {% for elemento in lista %}              <li class="{% cycle rojo azul %}">{{ element...
Templates:	  Filters         <html>             <head>Ejemplo templates</head>-tle         <body>                 Hola, {{...
Templates:	  Filters
Templates:	  Filters            {username: Juan es majo}length   {{ username|length }}             12
Templates:	  Filters             {username: Juan es majo}length    {{ username|length }}                12 cut      {{ use...
Templates:	  Filters             {username: Juan es majo}length    {{ username|length }}                12 cut      {{ use...
Templates:	  Filters               {username: Juan es majo} length     {{ username|length }}                12   cut      ...
Templates:	  Filters               {username: Juan es majo} length     {{ username|length }}                12   cut      ...
Templates:	  Filters                  {username: Juan es majo} length       {{ username|length }}                   12   c...
Templates:	  Filters
Templates:	  Filters{username: Juan es <b>majo, guapo y <em>listo</em></b>}          striptags   {{ username|striptags }} ...
Templates:	  Filters  {username: Juan es <b>majo, guapo y <em>listo</em></b>}            striptags   {{ username|striptags...
Templates:	  Filters  {username: Juan es <b>majo, guapo y <em>listo</em></b>}            striptags   {{ username|striptags...
Templates:	  Filters
Templates:	  Filters          {value: 123456789}add   {{ value|add:”1” }}        123456790
Templates:	  Filters                    {value: 123456789}     add        {{ value|add:”1” }}          123456790filesizefor...
Templates:	  Filters                       {value: 123456789}     add          {{ value|add:”1” }}           123456790files...
Templates:	  Filters                       {value: 123456789}     add          {{ value|add:”1” }}           123456790files...
Templates:	  Filters                       {value: 123456789}     add          {{ value|add:”1” }}           123456790files...
Herencia	  de	  Templatesbase.html   <html>                <head>                    <title>Mi página personal</title>    ...
Modelos
¿SQL?
Ejemplo	  SQLdef book_list(request):    try:         db = MySQLdb.connect(user=me, db=mydb,                               ...
Ejemplo	  SQLdef book_list(request):    try:                 1                                                     2      ...
12	  lineas	  de	  Python...	  ¬_¬
ORM	  (Object-­‐Rela0onal	  mapping)
Ejemplo	  ORMdef book_list(request):    names = Books.objects.all().order_by(name)   return render(request, book_list.html...
Ejemplo	  ORMdef book_list(request):1   names = Books.objects.all().order_by(name)                                        ...
Fucking	  Ninjas!
Modelo from django.db import models class Books(models.Model):       name = models.CharField(blank=True, max_length=100)  ...
Modelo     from django.db import models                  1                            32    class Books(models.Model):    ...
Fucking	  Awesome	  Ninjas!
Tipos	  de	  Datos• AutoField                    • IPAdressField• BigIntegerField              • NullBooleanField• Boolean...
Propiedades	  de	  las	  Field• null (True|Flase)       • unique (True|False)• blank (True|False)      • primary_key•   ch...
¿Es	  magia?	  No.   BEGIN;   CREATE TABLE "website_books" (       "id" integer NOT NULL PRIMARY KEY,       "name" varchar...
¿Es	  magia?	  No. $ python manage.py sqlall website   BEGIN;   CREATE TABLE "website_books" (       "id" integer NOT NULL...
Configurar	  sesngs.pyDATABASES = {    default: {                           postgresql_psycopg2,        ENGINE: django.db.b...
Configurar	  sesngs.pyDATABASES = {    default: {                             postgresql_psycopg2,        ENGINE: django.db...
Creando	  Tablas•	  Crea	  las	  tablas	  para	  todos	  los	  modelos	  de	  las	  apps	  instaladas	    en	  el	  fichero...
Creando	  Tablas                $ python manage.py syncdb•	  Crea	  las	  tablas	  para	  todos	  los	  modelos	  de	  las...
syncdb$ python   manage.py syncdbCreating   table auth_permissionCreating   table auth_groupCreating   table auth_userCrea...
syncdb$ python   manage.py syncdbCreating   table auth_permissionCreating   table auth_groupCreating   table auth_user    ...
¿Cuantos	  sistemas	  de	  Auten0cación	  habéis	  programado?
¿Alguno	  era	  mejor	  que	  el	  anterior?	  ;-­‐)
contrib.auth	  puede	  ser	  el	  úl0mo	  :D
syncdb$ python   manage.py syncdbCreating   table auth_permissionCreating   table auth_groupCreating   table auth_userCrea...
syncdb$ python   manage.py syncdbCreating   table auth_permissionCreating   table auth_groupCreating   table auth_userCrea...
BD	  Lista	  para	  usarse
BD	  Lista	  para	  usarse
Previo:	  Clases	  del	  ORM  ts = Publisher.objects.all()         Model            Manager                 QuerySet
INSERT
INSERT             o = Model(...)    o.save()a)   >>> p = Publisher(     ...       name=Apress,     ...       address=2855...
INSERT             o = Model(...)    o.save()a)   >>> p = Publisher(     ...       name=Apress,     ...       address=2855...
UPDATE
UPDATE                       o.save()    >>>   ...    >>>   p.id1   52    >>>   p.name = Apress Publishing    >>>   p.save()
UPDATE                       o.save()    >>>   ...    >>>   p.id1   52    >>>   p.name = Apress Publishing    >>>   p.save...
DELETE
DELETE                o.delete()    >>> ...    >>> p.id1   52    >>> p.delete()
DELETE                o.delete()    >>> ...    >>> p.id1   52    >>> p.delete()            queryset.delete()    >>> ps = P...
SELECT	  de	  1	  resultado
SELECT	  de	  1	  resultado                 .get(...)  >>> Publisher.objects.get(name="Apress")  <Publisher: Apress>
SELECT	  de	  1	  resultado                           .get(...)    >>> Publisher.objects.get(name="Apress")    <Publisher:...
SELECT	  de	  1	  resultado                           .get(...)    >>> Publisher.objects.get(name="Apress")    <Publisher:...
SELECT	  de	  N	  resultados
SELECT	  de	  N	  resultados                     .all()  >>> Publisher.objects.all()  [<Publisher: Apress>, <Publisher: OR...
SELECT	  de	  N	  resultados                     .all()  >>> Publisher.objects.all()  [<Publisher: Apress>, <Publisher: OR...
SELECT	  de	  N	  resultados                     .all()  >>> Publisher.objects.all()  [<Publisher: Apress>, <Publisher: OR...
SELECT	  de	  N	  resultadosen	                              evuelv        ¡D        s,	  no	                        .all(...
get(),	  filter()	  y	  exclude()
get(),	  filter()	  y	  exclude() Modelo.objects.filter(campo1="valor1", campo2="valor2")Los	  parámetros	  pueden	  indica...
get(),	  filter()	  y	  exclude()   Modelo.objects.filter(campo1="valor1", campo2="valor2") Los	  parámetros	  pueden	  ind...
ORDER	  BY
ORDER	  BY            .order_by(...)>>> Publisher.objects.order_by("name")[<Publisher: Apress>, <Publisher: OReilly>]
ORDER	  BY            .order_by(...)>>> Publisher.objects.order_by("name")[<Publisher: Apress>, <Publisher: OReilly>]>>> P...
ORDER	  BY                  .order_by(...)     >>> Publisher.objects.order_by("name")     [<Publisher: Apress>, <Publisher...
ORDER	  BY                   ¡También	                                              devu elve	                    .order_b...
Slicing
Slicing                       [n:m]>>> Publisher.objects.order_by("name")[0]<Publisher: Apress>>>> Publisher.objects.order...
Slicing                       [n:m]>>> Publisher.objects.order_by("name")[0]<Publisher: Apress>>>> Publisher.objects.order...
Slicing                       [n:m]>>> Publisher.objects.order_by("name")[0]<Publisher: Apress>>>> Publisher.objects.order...
Related	  Objects
Related	  Objects          OneToOneField     class Coche(models.Model):1        motor = OneToOneField(Motor)     class Mot...
Related	  Objects                    OneToOneField            class Coche(models.Model):      1         motor = OneToOneFi...
Related	  Objects                    OneToOneField            class Coche(models.Model):      1         motor = OneToOneFi...
Related	  Objects
Related	  Objects        ForeignKeyField    class Blog(models.Model):1       ...    class Post(models.Model):n       blog ...
Related	  Objects                   ForeignKeyField             class Blog(models.Model):       1         ...             ...
Related	  Objects
Related	  Objects        ManyToManyField    class Post(models.Model):n       tags = ManyToManyField(Tag)    class Tag(mode...
Related	  Objects                    ManyToManyField              class Post(models.Model):        n         tags = ManyTo...
Related	  Objects
Related	  ObjectsEn	  todas	  ellas	  podemos	  renombrar	  el	  puntero	  inverso        class Blog(models.Model):  1    ...
Related	  ObjectsEn	  todas	  ellas	  podemos	  renombrar	  el	  puntero	  inverso         class Blog(models.Model):  1   ...
Related	  ObjectsEn	  todas	  ellas	  podemos	  renombrar	  el	  puntero	  inverso          class Blog(models.Model):   1 ...
Y	  la	  guinda	  final:	  ¡Todo	  es	  LAZY!
Laziness
Laziness• Las	  consultas	  sólo	  se	  ejecutarán	  cuando	  realmente	  se	     necesite	  obtener	  los	  objetos.	  En...
CRUD:	  Create,	  Retrieve,	  Update	  &	  Delete
django.contrib.admin1            2                 3
django.contrib.admin      1          2                       3
django.contrib.admin1
Django	  admin:	  Instalación                           urls.py    from django.conf.urls.defaults import *    # Uncomment ...
Django	  admin:	  Instalación                           urls.py    from django.conf.urls.defaults import *    # Uncomment ...
Django	  admin:	  Instalación               seungs.py    INSTALLED_APPS = (        django.contrib.auth,        django.cont...
Actualizando	  la	  BD
Actualizando	  la	  BD  $ python manage.py syncdb Creating table django_admin_log Installing index for admin.LogEntry mode...
¿Y	  nuestra	  app?      ?
¿Y	  nuestra	  app?
admin.py• Cada	  app	  debe	  de	  tener	  el	  suyo.• Define	  qué	  modelos	  serán	  visibles	  desde	  el	  admin	  y	 ...
1,2,3	  Borrar	  la	  BD....	  1,2,3...	  Borrar	  la	  BD
Fixtures
Fixtures•	  Es	  muy	  aburrido	  crear	  juegos	  de	  datos	  cada	  vez	  que	  se	   elimina	  una	  tabla	  /	  BD.•	...
Fixtures•	  Es	  muy	  aburrido	  crear	  juegos	  de	  datos	  cada	  vez	  que	  se	   elimina	  una	  tabla	  /	  BD.•	...
Fixtures•	  Es	  muy	  aburrido	  crear	  juegos	  de	  datos	  cada	  vez	  que	  se	   elimina	  una	  tabla	  /	  BD.•	...
Formularios
Clases	  involucradas
Clases	  involucradasWidget   Componente	  visual	  equivalente	  a	  HTML         TextInput             <input type=text....
Clases	  involucradasWidget   Componente	  visual	  equivalente	  a	  HTML         TextInput                 <input type=t...
Clases	  involucradasWidget   Componente	  visual	  equivalente	  a	  HTML         TextInput                 <input type=t...
Fields
Fields■ BooleanField          ■ IPAddressField■ CharField             ■ MultipleChoiceField■ ChoiceField           ■ NullB...
Creación	  de	  un	  Form• Paso	  1/3:	  Definición	  del	  formulario	  en	  forms.py    from django import forms    class...
Creación	  de	  un	  Form• Paso	  2/3:	  Maquetación	  del	  formulario	  en	  su	  template    <html>    <body>        <h...
Creación	  de	  un	  Form• Paso	  3/3:	  Programación	  de	  la	  vista	  en	  views.py    from django.shortcuts import re...
Creación	  de	  un	  Form• Paso	  3/3:	  Programación	  de	  la	  vista	  en	  views.py    from django.shortcuts import re...
Creación	  de	  un	  Form• Paso	  3/3:	  Programación	  de	  la	  vista	  en	  views.py    from django.shortcuts import re...
Creación	  de	  un	  Form• Paso	  3/3:	  Programación	  de	  la	  vista	  en	  views.py    from django.shortcuts import re...
Validación	  propia Podemos	  programar	  validación	  extra	  asociada	  a	  cada	  Field	  del	  formulario	  escribiend...
Validación	  propia Podemos	  programar	  validación	  extra	  asociada	  a	  cada	  Field	  del	  formulario	  escribiend...
Maquetación	  propia     Podemos	  personalizar	  la	  maquetación	  tanto	  como	   queramos,	  prescindiendo	  de	  las	...
Forms	  a	  par0r	  de	  Models:	  El	  COLMO	  del	  DRY
Forms	  a	  par-r	  de	  Models            from django.db import models            class Author(models.Model):models.py   ...
Magia	  avanzada
ROSA
NUNCAROSA
NUNCAINFRAVALORÉISROSA
NUNCAINFRAVALORÉISEL	  PODERROSA
NUNCAINFRAVALORÉISEL	  PODERDE	  UN	     PONYROSA
Views	  avanzadas                              Generic	  Views       Vistas	  con	  funcionalidad	  genérica	  parametriza...
Views	  avanzadas    from django.views.generic.simple import direct_to_template         Renderiza	  directamente	  la	  te...
Template	  LibraryNos	  permite	  extender	  el	  sistema	  de	  templates	          de	  Django	  con	  Filters	  y	  Tag...
Template	  LibraryNos	  permite	  extender	  el	  sistema	  de	  templates	          de	  Django	  con	  Filters	  y	  Tag...
Template	  LibraryNos	  permite	  extender	  el	  sistema	  de	  templates	          de	  Django	  con	  Filters	  y	  Tag...
Custom	  FiltersUn	  Filter	  es	  una	  función	  Python	  que:  • Recibe	  1	  o	  2	  argumentos:	  (value	  [,	  arg])...
Custom	  FiltersUn	  Filter	  es	  una	  función	  Python	  que:  • Recibe	  1	  o	  2	  argumentos:	  (value	  [,	  arg])...
Custom	  FiltersUn	  Filter	  es	  una	  función	  Python	  que:  • Recibe	  1	  o	  2	  argumentos:	  (value	  [,	  arg])...
Custom	  FiltersUn	  Filter	  es	  una	  función	  Python	  que:   • Recibe	  1	  o	  2	  argumentos:	  (value	  [,	  arg]...
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Django
Upcoming SlideShare
Loading in...5
×

Django

819

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
819
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
37
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Django"

  1. 1. Juan Riaza @juanriaza
  2. 2. Don’t reinvent the wheel
  3. 3. https://gist.github.com/3143116
  4. 4. Jorge  Bas0da Jaime  Irurzunme@jorgebas0da.com jaime@irurzun.com @jorgebas0da @jaimeirurzun
  5. 5. • Legible Sintaxis  intui+va  y  estricta• Produc-vo Entre  1/3  y  1/5  más  conciso  que  Java  o  C++• Portable GNU/Linux,  Windows,  Mac  OS  X,  ...• Extenso Standard  Library,  Third  par+es• Integrable C,  C++,  Java,  .NET,  COM,  WS,  CORBA,  ...• ...  y  Diver-do
  6. 6. El  Intérprete
  7. 7. El  Intérprete Modo  Batch holamundo.py $ python holamundo.py#!/usr/bin/env python hola mundo!print "hola mundo!" $
  8. 8. El  Intérprete Modo  Batch holamundo.py $ python holamundo.py#!/usr/bin/env python hola mundo!print "hola mundo!" $ Modo  Interac0vo$ pythonPython 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)[GCC 4.4.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> print "hola mundo!"hola mundo!
  9. 9. Tipos  de  datosobject  h>p://docs.python.org/library/stdtypes.html
  10. 10. Tipos  de  datos int 1234 long 35L float 3.1415object  h>p://docs.python.org/library/stdtypes.html
  11. 11. Tipos  de  datos int 1234 long 35L float 3.1415 bool True Falseobject  h>p://docs.python.org/library/stdtypes.html
  12. 12. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str spam "guidos" """n lines"""object  h>p://docs.python.org/library/stdtypes.html
  13. 13. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str spam "guidos" """n lines"""object list [1, [2, three], 4]  h>p://docs.python.org/library/stdtypes.html
  14. 14. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str spam "guidos" """n lines"""object list [1, [2, three], 4] dict {food: spam, taste: yum}  h>p://docs.python.org/library/stdtypes.html
  15. 15. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str spam "guidos" """n lines"""object list [1, [2, three], 4] dict {food: spam, taste: yum} tuple (1, spam, 4, U)  h>p://docs.python.org/library/stdtypes.html
  16. 16. Tipos  de  datos o   ¡T i p ad mi co! int 1234 long 35L float d iná 3.1415 bool True False str spam "guidos" """n lines"""object list [1, [2, three], 4] dict {food: spam, taste: yum} tuple (1, spam, 4, U)  h>p://docs.python.org/library/stdtypes.html
  17. 17. Operadores  h>p://docs.python.org/library/operator.html
  18. 18. Operadores a + b a - b a * b a / bnuméricos a % b -a +a a ** b  h>p://docs.python.org/library/operator.html
  19. 19. Operadores a + b a - b a * b a / b numéricos a % b -a +a a ** b a < b a <= b a > bcomparadores a >= b a == b a != b  h>p://docs.python.org/library/operator.html
  20. 20. Operadores a + b a - b a * b a / b numéricos a % b -a +a a ** b a < b a <= b a > bcomparadores a >= b a == b a != b lógicos a or b a and b not a  h>p://docs.python.org/library/operator.html
  21. 21. Usos  frecuentes:  list
  22. 22. Usos  frecuentes:  list>>> nums = [1, 2, 3]>>> nums[0]1
  23. 23. Usos  frecuentes:  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue
  24. 24. Usos  frecuentes:  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue>>> nums.append(4)>>> print nums[1, 2, 3, 4]
  25. 25. Usos  frecuentes:  list>>> nums = [1, 2, 3]>>> nums[0]1>>> 2 in numsTrue>>> nums.append(4)>>> print nums[1, 2, 3, 4]>>> len(nums)4
  26. 26. Usos  frecuentes:  str
  27. 27. Usos  frecuentes:  str>>> "Python mola"[1:4]yth
  28. 28. Usos  frecuentes:  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7
  29. 29. Usos  frecuentes:  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP no")PHP no mola
  30. 30. Usos  frecuentes:  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP no")PHP no mola>>> "Python mola".split(" ")[Python, mola]
  31. 31. Usos  frecuentes:  str>>> "Python mola"[1:4]yth>>> "Python mola".find("mola")7>>> "Python mola".replace("Python", "PHP no")PHP no mola>>> "Python mola".split(" ")[Python, mola]>>> " ".join(["Python", "mola"])"Python mola"
  32. 32. Usos  frecuentes:  dict
  33. 33. Usos  frecuentes:  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]
  34. 34. Usos  frecuentes:  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] >>> user.get(age, 20)24 24
  35. 35. Usos  frecuentes:  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] >>> user.get(age, 20)24 24>>> nick in userTrue
  36. 36. Usos  frecuentes:  dict>>> user = {nick: neo, age: 24}>>> user.keys()[nick, age]>>> user.values()[neo, 24]>>> user[age] >>> user.get(age, 20)24 24>>> nick in userTrue>>> user.update({nick: alatar, age: 25})>>> user{nick: alatar, age: 25}
  37. 37. Usos  frecuentes:  str  %
  38. 38. Usos  frecuentes:  str  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio
  39. 39. Usos  frecuentes:  str  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio>>> "%s sabe %i idiomas" % ("Hycker", 5)Hycker sabe 5 idiomas
  40. 40. Usos  frecuentes:  str  %>>> "%s es muy sabio" % "Hycker"Hycker es muy sabio>>> "%s sabe %i idiomas" % ("Hycker", 5)Hycker sabe 5 idiomas>>> t = "%(NOMBRE)s sabe %(IDIOMAS)i idiomas">>> v = {NOMBRE: Hycker, IDIOMAS: 5}>>> t % vHycker sabe 5 idiomas
  41. 41. Módulosjuego/ __init__.py 1. Un  módulo  es  un  fichero  .py bonus/ __init__.py estrella.py moneda.py 2. Los  módulos  pueden   planta.py ... personajes/ organizarse  en  paquetes. __init__.py mario.py luigi.py princesa.py 3. Un  paquete  es  una  carpeta   ... enemigos/ __init__.py que  con+ene  un  fichero  con   seta.py tortuga.py nombre  __init__.py bomba.py ...
  42. 42. Módulosjuego/ __init__.py 1. Un  módulo  es  un  fichero  .py bonus/ __init__.py estrella.py moneda.py 1 2. Los  módulos  pueden   planta.py 2 ... personajes/ organizarse  en  paquetes. __init__.py 3 mario.py luigi.py princesa.py 3. Un  paquete  es  una  carpeta   ... enemigos/ __init__.py que  con+ene  un  fichero  con   seta.py tortuga.py nombre  __init__.py bomba.py ...
  43. 43. Módulosjuego/ __init__.py bonus/ __init__.py estrella.py moneda.py planta.py ... personajes/ __init__.py mario.py luigi.py princesa.py ... enemigos/ __init__.py seta.py tortuga.py bomba.py ...
  44. 44. Módulosjuego/ __init__.py bonus/ __init__.py >>> from juego.personajes.mario import Mario estrella.py >>> Mario() moneda.py planta.py ... personajes/ __init__.py >>> from juego.personajes.mario import * mario.py >>> Mario() luigi.py princesa.py ... enemigos/ >>> from juego import personajes __init__.py >>> personajes.mario.Mario() seta.py tortuga.py bomba.py ...
  45. 45. Estructuras {}
  46. 46. Estructuras {}
  47. 47. Identación>>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance 4  Espacios  para  la  identación
  48. 48. Identación>>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance PEP 8 4  Espacios  para  la  identación
  49. 49. ¿PEP  8? PEP 8•  Guido  van  Rossum  (2001)•  Recomendaciones  de  es0lo•  “Readability  counts”•  “Code  is  read  much  more  oQen  than  it  is  wriSen.”•  Muy  recomendable  importante  seguirlo.  h>p://www.python.org/dev/peps/pep-­‐0008/
  50. 50. Funcionesdef my_first_function(p1, p2): return "Hello World!" Minúsculas Palabras  separadas  por  _ Evitar  camelCase
  51. 51. Funciones 21 def my_first_function(p1, p2): 3 return "Hello World!" PEP 8 Minúsculas Palabras  separadas  por  _ Evitar  camelCase
  52. 52. Conversión  de  -pos  h>p://docs.python.org/library/func-ons.html
  53. 53. Conversión  de  -pos>>> int(1.3)1  h>p://docs.python.org/library/func-ons.html
  54. 54. Conversión  de  -pos>>> int(1.3)1>>> str(2)2  h>p://docs.python.org/library/func-ons.html
  55. 55. Conversión  de  -pos>>> int(1.3)1>>> str(2)2>>> float(1)1.0  h>p://docs.python.org/library/func-ons.html
  56. 56. Conversión  de  -pos>>> int(1.3)1 >>> tuple([1,2,3]) (1, 2, 3)>>> str(2)2>>> float(1)1.0  h>p://docs.python.org/library/func-ons.html
  57. 57. Conversión  de  -pos>>> int(1.3)1 >>> tuple([1,2,3]) (1, 2, 3)>>> str(2)2 >>> list((1,2,3)) [1, 2, 3]>>> float(1)1.0  h>p://docs.python.org/library/func-ons.html
  58. 58. Funciones  comunes  h>p://docs.python.org/library/func-ons.html
  59. 59. Funciones  comunes>>> len("Python Mola")11>>> len([1,2,3,4])4  h>p://docs.python.org/library/func-ons.html
  60. 60. Funciones  comunes>>> len("Python Mola")11>>> len([1,2,3,4])4>>> range(5)[0, 1, 2, 3, 4]>>> range(1,7)[1, 2, 3, 4, 5, 6]>>> range(1,7,2)[1, 3, 5]  h>p://docs.python.org/library/func-ons.html
  61. 61. Funciones  comunes >>> type(True)>>> len("Python Mola") <type bool>11 >>> type("Python Mola")>>> len([1,2,3,4]) <type str>4>>> range(5)[0, 1, 2, 3, 4]>>> range(1,7)[1, 2, 3, 4, 5, 6]>>> range(1,7,2)[1, 3, 5]  h>p://docs.python.org/library/func-ons.html
  62. 62. Funciones  comunes >>> type(True)>>> len("Python Mola") <type bool>11 >>> type("Python Mola")>>> len([1,2,3,4]) <type str>4>>> range(5) >>> sum([0,1,2,3,4])[0, 1, 2, 3, 4] 10>>> range(1,7) >>> sum(range(5))[1, 2, 3, 4, 5, 6] 10>>> range(1,7,2)[1, 3, 5] Y  un  muy  largo  etc...  h>p://docs.python.org/library/func-ons.html
  63. 63. Funciones  interesantes Son  sólo  un  ejemplo...  h>p://docs.python.org/library/func-ons.html
  64. 64. Funciones  interesantes>>> a = [1,2,3]>>> b = [4,5,6]>>> zip(a,b)[(1, 4), (2, 5), (3, 6)] Son  sólo  un  ejemplo...  h>p://docs.python.org/library/func-ons.html
  65. 65. Funciones  interesantes>>> a = [1,2,3]>>> b = [4,5,6]>>> zip(a,b)[(1, 4), (2, 5), (3, 6)]>>> sorted([5,1,3,4,2])[1, 2, 3, 4, 5] Son  sólo  un  ejemplo...  h>p://docs.python.org/library/func-ons.html
  66. 66. Funciones  interesantes>>> a = [1,2,3]>>> b = [4,5,6] >>> round(1.2345, 2)>>> zip(a,b) 1.23[(1, 4), (2, 5), (3, 6)]>>> sorted([5,1,3,4,2])[1, 2, 3, 4, 5] Son  sólo  un  ejemplo...  h>p://docs.python.org/library/func-ons.html
  67. 67. Funciones  interesantes>>> a = [1,2,3]>>> b = [4,5,6] >>> round(1.2345, 2)>>> zip(a,b) 1.23[(1, 4), (2, 5), (3, 6)]>>> sorted([5,1,3,4,2]) >>> map(str,[1,2,3,4,5])[1, 2, 3, 4, 5] [1, 2, 3, 4, 5] Son  sólo  un  ejemplo...  h>p://docs.python.org/library/func-ons.html
  68. 68. Funciones  de  ayuda
  69. 69. Funciones  de  ayuda>>> dir([1,2,3])[__add__, __class__, __contains__, __delattr__, __delitem__,__delslice__, __doc__, __eq__, __format__, __ge__,__getattribute__, __getitem__, __getslice__, __gt__, __hash__,__iadd__, __imul__, __init__, __iter__, __le__, __len__,__lt__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__,__repr__, __reversed__, __rmul__, __setattr__, __setitem__,__setslice__, __sizeof__, __str__, __subclasshook__, append,count, extend, index, insert, pop, remove, reverse, sort]
  70. 70. Funciones  de  ayuda>>> dir([1,2,3])[__add__, __class__, __contains__, __delattr__, __delitem__,__delslice__, __doc__, __eq__, __format__, __ge__,__getattribute__, __getitem__, __getslice__, __gt__, __hash__,__iadd__, __imul__, __init__, __iter__, __le__, __len__,__lt__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__,__repr__, __reversed__, __rmul__, __setattr__, __setitem__,__setslice__, __sizeof__, __str__, __subclasshook__, append,count, extend, index, insert, pop, remove, reverse, sort]>>> help(filter)Help on built-in function filter in module __builtin__:filter(...) filter(function or None, sequence) -> list, tuple, or string Return those items of sequence for which function(item) is true. If function is None, return the items that are true. If sequence is a tuple or string, return the same type, else return a list.(END)
  71. 71. Clasesclass Student(object): def __init__(self, name, age): self.name = name self.age = age def hello(self): return My name is %s % self.name s = Student("Jorge", 24) camelCase
  72. 72. Clases 1 2class Student(object): 3 def __init__(self, name, age): 4 self.name = name self.age = age def hello(self): 5 return My name is %s % self.name s = Student("Jorge", 24) PEP 8 camelCase
  73. 73. El  operador  ()• Es  importante  diferenciar: funcion      vs      funcion() Clase              vs        Clase()• El  operador  ()  permite: • Invocar  funciones: resultado = funcion() • Instanciar  clases: objeto = Clase("param1")
  74. 74. Sentencias:  if-­‐else$name = "Jon"; name = "Jon"if($name == "Jon"){ if name == "Jon": $name = "Jon Rocks!"; name = "Jon Rocks!"} elif name == "Mary":elseif($name == "Mary"){ name = "Hello Mary" $name = "Hello Mary"; else:} name = "Who are you?"else{ $name = "Who are you?"}
  75. 75. Sentencias:  while $count = 0; while ($count < 5) { echo "Number ".$count; $count+=1; } count = 0 while count < 5: print "Number %i" % count count+=1
  76. 76. Sentencias:  for for ($i=0; $i < 5; $i++) { echo "Number ".$count; } for i in range(4): print "Number %i" % count
  77. 77. Sentencias:  try-­‐except try { $result = 3 / 0; } catch (Exception $e) { echo "Division by Zero" } try: result = 3 / 0 except: print "Division by Zero"
  78. 78. Conclusiones•  Python  es  un  lenguaje  fácil  de  aprender.•  Menos  código: •  Muchos  Muchísimos  menos  errores  de  Sintaxis. •  Mayor  velocidad  de  escritura.•  Proto0pado...  U0lizado  por  grandes  empresas.
  79. 79. Conclusiones•  Python  es  un  lenguaje  fácil  de  aprender.•  Menos  código: •  Muchos  Muchísimos  menos  errores  de  Sintaxis. •  Mayor  velocidad  de  escritura.•  Proto0pado...  U0lizado  por  grandes  empresas. etc...
  80. 80. Evolución  de  la  Web Desarrollo  Web1ª  Generación 2ª  Generación 3ª  Generación HTML PHP Django CGI ASP Rails JSP Symfony ... ...
  81. 81. Frameworks  web
  82. 82. Django:  Qué  y  dónde
  83. 83. Filosoa•  Loose  coupling,    Acoplamiento  débil. •  Cada  capa  es  independiente  y  desconoce  completamente     a  las  demás.•  Menos  código.•  Rápido  desarrollo. •  Esto  es  el  siglo  21,  todo  el  trabajo  tedioso  hay  que  evitarlo.•  Don’t  Repeat  Yourself  (DRY)
  84. 84. Filosoa•  Loose  coupling,    Acoplamiento  débil. •  Cada  capa  es  independiente  y  desconoce  completamente     a  las  demás.•  Menos  código.•  Rápido  desarrollo. •  Esto  es  el  siglo  21,  todo  el  trabajo  tedioso  hay  que  evitarlo.•  Don’t  Repeat  Yourself  (DRY)“ Every distinct concept and/or piece of data should live in one, and only one, place. Redundancy is bad. Normalization is good.”
  85. 85. Filosoa•  Explicit  is  beSer  than  implicit. •  Este  es  un  principio  de  Python. •  Django  no  debe  hacer  demasiada  “Magia”. •  Si  algo  es  “Mágico”  ha  de  haber  una  buena  razón.•  Consistencia •  Ha  de  ser  consistente  a  todos  los  niveles.•  Eficiencia,  Seguridad,  Flexibilidad  y  Simplicidad.  h>p://docs.djangoproject.com/en/dev/misc/design-­‐philosophies/
  86. 86. La  comunidad
  87. 87. La  comunidad• django-­‐users 22.000  miembros• django-­‐developers 7.000  miembros• djangoproject.com +500.000  visitas  únicas  mensuales
  88. 88. ¿Quién  usa  Django?
  89. 89. ¿Quién  usa  Django?
  90. 90. Bienvenidos  al  mundo  de  Oz
  91. 91. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? *  Incluida  la  carpeta  del  proyecto
  92. 92. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar?FicherosCarpetas *  Incluida  la  carpeta  del  proyecto
  93. 93. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails SymfonyFicheros 149 117Carpetas 35 29 *  Incluida  la  carpeta  del  proyecto
  94. 94. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails SymfonyFicheros 149 117Carpetas 35 29 *  Incluida  la  carpeta  del  proyecto
  95. 95. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails Symfony DjangoFicheros 149 117 5Carpetas 35 29 2 *  Incluida  la  carpeta  del  proyecto
  96. 96. Let’s  enjoy
  97. 97. Crear  nuestro  proyecto de  5  ficheros  ;-­‐)
  98. 98. Crear  nuestro  proyecto de  5  ficheros  ;-­‐) $ django-admin startproject dwitter
  99. 99. Crear  nuestro  proyecto de  5  ficheros  ;-­‐) $ django-admin startproject dwitter . !"" dwitter #   !"" __init__.py #   !"" settings.py #   !"" urls.py #   $"" wsgi.py $"" manage.py -­‐  ¿Esto  es  un  proyecto...  ?      Si  os  ve  mi  jefe... -­‐  Sí,  disponemos  de  un  proyecto  ‘funcional’  en  django.
  100. 100. seungs.py
  101. 101. Arrancar  nuestro  proyecto de  5  ficheros  ;-­‐)
  102. 102. Arrancar  nuestro  proyecto de  5  ficheros  ;-­‐) $ cd dwitter $ python manage.py runserver Validating models... 0 errors found Django version 1.4, using settings dwitter.settings Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
  103. 103. Arrancar  nuestro  proyecto de  5  ficheros  ;-­‐) $ cd dwitter $ python manage.py runserver Validating models... 0 errors found Django version 1.4, using settings dwitter.settings Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
  104. 104. MVC  en  DjangoModelo  =  Model Vista  =  Template Controlador  =  URL+View
  105. 105. URLs  y  Vistas• El  fichero  urls.py  actúa  como  puerta  de  entrada  para  las   pe0ciones  HTTP• Se  definen  URLs  elegantes  mediante  expresiones  regulares   que  redirigen  a  funciones  de  views.py hSp://mysite.com/about/ urls.py ¿urlpaSerns? html views.py ...
  106. 106. URLs  y  Vistas• La  función  de  views.py  recibe  como  parámetros  un  objeto   H>pRequest  y  todos  los  parámetros  de  la  URL  capturados,   teniendo  que  devolver  siempre  un  objeto  H>pResponse H>pRequest(),  ... views.py H>pResponse()
  107. 107. URLs  y  Vistas Ejemplo  1:    http://mysite.com/time from django.conf.urls.defaults import * from mysite.views import hora_actual urls.py urlpatterns = patterns(, url(r^time/$, hora_actual), ) from django.http import HttpResponse from datetime import datetimeviews.py def hora_actual(request): now = datetime.now() html = "Son las %s." % now return HttpResponse(html)
  108. 108. URLs  y  Vistas Ejemplo  2:    http://mysite.com/time/plus/2 from django.conf.urls.defaults import * from mysite.views import dentro_de urls.py urlpatterns = patterns(, url(r^time/plus/(d{1,2})/$, dentro_de), ) from django.http import HttpResponse from datetime import datetime, timedelta def dentro_de(request, offset):views.py offset = int(offset) dt = datetime.now() + timedelta(hours=offset) html = "En %i hora(s), serán las %s." % (offset, dt) return HttpResponse(html)
  109. 109. URLs  y  Vistas Ejemplo  2:    http://mysite.com/time/plus/2 from django.conf.urls.defaults import * from mysite.views import dentro_de urls.py urlpatterns = patterns(, url(r^time/plus/(d{1,2})/$, dentro_de), ) from django.http import HttpResponse from datetime import datetime, timedelta def dentro_de(request, offset):views.py offset = int(offset) dt = datetime.now() + timedelta(hours=offset) html = "En %i hora(s), serán las %s." % (offset, dt) return HttpResponse(html)
  110. 110. ¡Recuerda!:  MVC
  111. 111. Templates• Separan  la  lógica  de  presentación  a  una  capa  independiente. • Ficheros  independientes  (.html) • Lenguaje  independiente  (¡para  diseñadores!)
  112. 112. Templates • Se  basan  en  dos  0pos  de  objetos:  Template()  y  Context(). • Un  objeto  Template()  con0ene  el  string  de  salida  que   queremos  devolver  en  el  HSpResponse  (normalmente   HTML),  pero  incluyendo  e0quetas  especiales  de  Django. • Un  objeto  Context()  con0ene  un  diccionario  con  los   valores  que  dan  contexto  a  una  plan0lla,  los  que  deben   usarse  para  renderizar  un  objeto  Template().Template: "Bienvenido, {{ user }}." "Bienvenido, alatar." Context: {user: alatar}
  113. 113. Templates• Primera  aproximación  al  obje0vo:  Template  +  Context from django.http import HttpResponse from django.template import Template, Context from datetime import datetime PLANTILLA = """<html><body> Son las {{ hora }}. </body></html>""" def hora_actual(request): now = datetime.now() t = Template(PLANTILLA) c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  114. 114. Templates• Segunda  aproximación  al  obje0vo:  open(),  read(),  close() from django.http import HttpResponse from django.template import Template, Context from datetime import datetime def hora_actual(request): now = datetime.now() fp = open(/home/django/templates/hora.html) t = Template(fp.read()) fp.close() c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  115. 115. Templates• Segunda  aproximación  al  obje0vo:  open(),  read(),  close() from django.http import HttpResponse from django.template import Template, Context from datetime import datetime def hora_actual(request): now = datetime.now() fp = open(/home/django/templates/hora.html) t = Template(fp.read()) fp.close() c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  116. 116. Templates• Segunda  aproximación  al  obje0vo:  open(),  read(),  close() from django.http import HttpResponse from django.template import Template, Context from datetime import datetime def hora_actual(request): now = datetime.now() Bo ring   plate   fp = open(/home/django/templates/hora.html) boiler t = Template(fp.read()) fp.close() code! c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  117. 117. Templates• Tercera  aproximación  al  obje0vo:  get_template() TEMPLATE_DIRS = ( seungs.py /home/django/templates, ) from django.http import HttpResponse from django.template.loader import get_template from django.template import Context from datetime import datetime def hora_actual(request): now = datetime.now() t = get_template(hora.html) c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  118. 118. Templates• Tercera  aproximación  al  obje0vo:  get_template() TEMPLATE_DIRS = ( seungs.py /home/django/templates, ) from django.http import HttpResponse from django.template.loader import get_template from django.template import Context from datetime import datetime def hora_actual(request): now = datetime.now() t = get_template(hora.html) c = Context({hora: now}) html = t.render(c) return HttpResponse(html)
  119. 119. Templates• Tercera  aproximación  al  obje0vo:  get_template() TEMPLATE_DIRS = ( seungs.py /home/django/templates, ) from django.http import HttpResponse from django.template.loader import get_template from django.template import Context from datetime import datetime def hora_actual(request): S0ll   now = datetime.now() t = get_template(hora.html) c = Context({hora: now}) html = t.render(c) boring... return HttpResponse(html)
  120. 120. Templates• Obje0vo  alcanzado:  render() from django.shortcuts import render from datetime import datetime def hora_actual(request): now = datetime.now() return render(request, hora.html, {hora: now})
  121. 121. Templates• Obje0vo  alcanzado:  render() from django.shortcuts import render from datetime import datetime def hora_actual(request): now = datetime.now() return render(request, hora.html, {hora: now}) Bori ng...?
  122. 122. Templates• Obje0vo  alcanzado:  render() from django.shortcuts import render from datetime import datetime def hora_actual(request): now = datetime.now() return render(request, hora.html, {hora: now}) AWESOME!
  123. 123. Templates  en  detalle•  Si,  otro  sistema  de  templates •  Smarty,  Tiles,  ClearSilver  ...  •Describen  cuál  va  a  ser  el  resultado  que  ven  los  usuarios. •  Desacoplado  de  Python  (  Diseñadores  muy  lejos  de  Python  )•  HTML  (o  no)...  con  esteroides.•  Muy  sencillo  de  aprender •  KISS:  Keep  It  Simple,  Stupid•  Muy  sencillo  de  extender
  124. 124. Filosoa  y  Limitaciones•  La  sintaxis  debe  estar  desacoplada  del  HTML/XML.•  Los  diseñadores  saben  HTML.•  Los  diseñadores  no  saben  Python.•  No  consiste  en  inventarse  un  lenguaje.•  Una  variable  no  puede  cambiar  el  valor  de  una  variable.•  Una  template  no  puede  ejecutar  código  Python.
  125. 125. Templates:  {{}}<html> <head>Ejemplo templates</head> <body> Hola, {{ username }}. </body></html> {username: juan}<html> <head>Ejemplo templates</head> <body> Hola, juan. </body></html>
  126. 126. Filters  y  Tags
  127. 127. Filters  y  Tags
  128. 128. Filters  y  Tagsfilter {{ varible|filter }}
  129. 129. Filters  y  Tags filter {{ varible|filter }}inline  tag {% tag var1 var2 %}
  130. 130. Filters  y  Tags filter {{ varible|filter }}inline  tag {% tag var1 var2 %}block  tag {% tag var1 %} ... {% endtag %}
  131. 131. Templates:  tags  {%  %}
  132. 132. Templates:  tags  {%  %}comment {% comment %} Bu! {% endcomment %}
  133. 133. Templates:  tags  {%  %}comment {% comment %} Bu! {% endcomment %} for {% for elemento in lista %} <li>{{ elemento }}<li> {% endfor %}
  134. 134. Templates:  tags  {%  %}comment {% comment %} Bu! {% endcomment %} for {% for elemento in lista %} <li>{{ elemento }}<li> {% endfor %} if {% if username == "Juan" %} Hola Juan, me gustas! == != > < >= <= in and or not {% else %} Hola {{ username }}, {% endif %}
  135. 135. Templates:  tags  {%  %}
  136. 136. Templates:  tags  {%  %}cycle {% for elemento in lista %} <li class="{% cycle rojo azul %}">{{ elemento }}<li> {% endfor %}
  137. 137. Templates:  tags  {%  %} cycle {% for elemento in lista %} <li class="{% cycle rojo azul %}">{{ elemento }}<li> {% endfor %}include {% include "foo/bar.html" %}
  138. 138. Templates:  tags  {%  %} cycle {% for elemento in lista %} <li class="{% cycle rojo azul %}">{{ elemento }}<li> {% endfor %}include {% include "foo/bar.html" %}forloop {% for elemento in lista %} <li>{{ forloop.counter }}.{{ elemento }}<li> {% endfor %}
  139. 139. Templates:  tags  {%  %} cycle {% for elemento in lista %} <li class="{% cycle rojo azul %}">{{ elemento }}<li> {% endfor %}include {% include "foo/bar.html" %}forloop {% for elemento in lista %} <li>{{ forloop.counter }}.{{ elemento }}<li> {% endfor %}empty {% for elemento in lista %} <li class="{% cycle rojo azul %}">{{ elemento }}<li> {% empty %} Sin elementos. {% endfor %}
  140. 140. Templates:  Filters <html> <head>Ejemplo templates</head>-tle <body> Hola, {{ username|title }}. </body> </html> {username: juan} <html> <head>Ejemplo templates</head> <body> Hola, Juan. </body> </html>
  141. 141. Templates:  Filters
  142. 142. Templates:  Filters {username: Juan es majo}length {{ username|length }} 12
  143. 143. Templates:  Filters {username: Juan es majo}length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo
  144. 144. Templates:  Filters {username: Juan es majo}length {{ username|length }} 12 cut {{ username|cut }} Juanesmajoslugify {{ username|slugify }} juan-es-majo
  145. 145. Templates:  Filters {username: Juan es majo} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majowordcount {{ username|wordcount }} 3
  146. 146. Templates:  Filters {username: Juan es majo} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majowordcount {{ username|wordcount }} 3 upper {{ username|upper }} JUAN ES MAJO
  147. 147. Templates:  Filters {username: Juan es majo} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majowordcount {{ username|wordcount }} 3 upper {{ username|upper }} JUAN ES MAJO {username: None} default {{ username|default:”Desconocido” }} Desconocido
  148. 148. Templates:  Filters
  149. 149. Templates:  Filters{username: Juan es <b>majo, guapo y <em>listo</em></b>} striptags {{ username|striptags }} Juan es majo guapo y listo
  150. 150. Templates:  Filters {username: Juan es <b>majo, guapo y <em>listo</em></b>} striptags {{ username|striptags }} Juan es majo guapo y listotruncatewords_html {{ username|truncatewords_html:4 }} Juan es <b>majo guapo</b> ...
  151. 151. Templates:  Filters {username: Juan es <b>majo, guapo y <em>listo</em></b>} striptags {{ username|striptags }} Juan es majo guapo y listotruncatewords_html {{ username|truncatewords_html:4 }} Juan es <b>majo guapo</b> ... removetags {{ username|removetags:”em a br” }} Juan es <b>majo guapo y listo</b>
  152. 152. Templates:  Filters
  153. 153. Templates:  Filters {value: 123456789}add {{ value|add:”1” }} 123456790
  154. 154. Templates:  Filters {value: 123456789} add {{ value|add:”1” }} 123456790filesizeformat {{ value|filesizeformat }} 117.7MB
  155. 155. Templates:  Filters {value: 123456789} add {{ value|add:”1” }} 123456790filesizeformat {{ value|filesizeformat }} 117.7MB {date: datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) } date {{ date|date:”d M Y” }} 11 Sep 2010
  156. 156. Templates:  Filters {value: 123456789} add {{ value|add:”1” }} 123456790filesizeformat {{ value|filesizeformat }} 117.7MB {date: datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) } date {{ date|date:”d M Y” }} 11 Sep 2010-mesince {{ date|timesince }} 4 days, 6 hours
  157. 157. Templates:  Filters {value: 123456789} add {{ value|add:”1” }} 123456790filesizeformat {{ value|filesizeformat }} 117.7MB {date: datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) } date {{ date|date:”d M Y” }} 11 Sep 2010-mesince {{ date|timesince }} 4 days, 6 hours-meun-l {{ date|timeuntil }} 1 days, 6 hours
  158. 158. Herencia  de  Templatesbase.html <html> <head> <title>Mi página personal</title> </head> <body> {% block content %} Contenido por defecto. {% endblock %} </body> </html>hija.html {% extends "base.html" %} {% block content %} Hola desde la portada. {% endblock %}
  159. 159. Modelos
  160. 160. ¿SQL?
  161. 161. Ejemplo  SQLdef book_list(request): try: db = MySQLdb.connect(user=me, db=mydb, passwd=secret, host=localhost) cursor = db.cursor() cursor.execute(SELECT nama FROM books ORDER BY name) names = [] for row in cursor.fetchall() names.append(row[0]) db.close() except: return render_to_response(500.html) return render_to_response(book_list.html, {names:names})
  162. 162. Ejemplo  SQLdef book_list(request): try: 1 2 db = MySQLdb.connect(user=me, db=mydb, passwd=secret, host=localhost) 3 cursor = db.cursor() cursor.execute(SELECT nama FROM books ORDER BY name) 4 names = [] for row in cursor.fetchall() 5 names.append(row[0]) db.close() except: return render_to_response(500.html) 6 return render_to_response(book_list.html, {names:names})
  163. 163. 12  lineas  de  Python...  ¬_¬
  164. 164. ORM  (Object-­‐Rela0onal  mapping)
  165. 165. Ejemplo  ORMdef book_list(request): names = Books.objects.all().order_by(name) return render(request, book_list.html, {names:names})
  166. 166. Ejemplo  ORMdef book_list(request):1 names = Books.objects.all().order_by(name) 2 return render(request, book_list.html, {names:names})
  167. 167. Fucking  Ninjas!
  168. 168. Modelo from django.db import models class Books(models.Model): name = models.CharField(blank=True, max_length=100) created = models.DateTimeField(blank=False) available = models.BooleanField(default=True)•  Independencia  SGBD! •  Definimos  estructuras  de  información  genéricas. •  Definimos  restricciones  (notnull,  blank,  max_lenght...)•  Única  definición  del  modelo  (configuración,  mapeo  a  db)  
  169. 169. Modelo from django.db import models 1 32 class Books(models.Model): name = models.CharField(blank=True, max_length=100) 4 created = models.DateTimeField(blank=False) 5 available = models.BooleanField(default=True) 6 •  Independencia  SGBD! •  Definimos  estructuras  de  información  genéricas. •  Definimos  restricciones  (notnull,  blank,  max_lenght...) •  Única  definición  del  modelo  (configuración,  mapeo  a  db)  
  170. 170. Fucking  Awesome  Ninjas!
  171. 171. Tipos  de  Datos• AutoField • IPAdressField• BigIntegerField • NullBooleanField• BooleanField • PositiveIntegerField• CharField • PositiveSmallIntegerField• CommaSeparatedIntegerField • SlugField• DateField • SmallIntegerField• DateTimeField • TextField• DecimalField • TimeField• EmailField • URLField• FileField • XMLField• FilePathField • ForeingKey• FloatField • ManyToManyField• ImageField • OneToOneField• IntegerField
  172. 172. Propiedades  de  las  Field• null (True|Flase) • unique (True|False)• blank (True|False) • primary_key• choices (lista) • unique_for_date• default (valor) • unique_for_month• editable (True|False) • unique_for_year• help_text (String)
  173. 173. ¿Es  magia?  No. BEGIN; CREATE TABLE "website_books" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(100) NOT NULL, "created" datetime NOT NULL, "available" bool NOT NULL ); COMMIT;BEGIN;CREATE TABLE "website_books" ( "id" serial NOT NULL PRIMARY KEY, "name" varchar(100) NOT NULL, "created" timestamp with time zone NOT NULL, "available" boolean NOT NULL);COMMIT;
  174. 174. ¿Es  magia?  No. $ python manage.py sqlall website BEGIN; CREATE TABLE "website_books" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(100) NOT NULL, "created" datetime NOT NULL, "available" bool NOT NULL ); COMMIT;BEGIN;CREATE TABLE "website_books" ( "id" serial NOT NULL PRIMARY KEY, "name" varchar(100) NOT NULL, "created" timestamp with time zone NOT NULL, "available" boolean NOT NULL);COMMIT;
  175. 175. Configurar  sesngs.pyDATABASES = { default: { postgresql_psycopg2, ENGINE: django.db.backends., postgresql, mysql, NAME: , sqlite3 or oracle. USER: , PASSWORD: , HOST: , PORT: , }}
  176. 176. Configurar  sesngs.pyDATABASES = { default: { postgresql_psycopg2, ENGINE: django.db.backends., 1 postgresql, mysql, NAME: , 2 sqlite3 or oracle. USER: , PASSWORD: , 3 HOST: , PORT: , }}
  177. 177. Creando  Tablas•  Crea  las  tablas  para  todos  los  modelos  de  las  apps  instaladas   en  el  fichero  seungs.py•  No  actualiza  esquemas  si  la  tabla  existe. •  Eliminar  tabla  y  volver  a  ejecutar  syncdb
  178. 178. Creando  Tablas $ python manage.py syncdb•  Crea  las  tablas  para  todos  los  modelos  de  las  apps  instaladas   en  el  fichero  seungs.py•  No  actualiza  esquemas  si  la  tabla  existe. •  Eliminar  tabla  y  volver  a  ejecutar  syncdb
  179. 179. syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweetYou just installed Djangos auth system, which means you dont have anysuperusers defined.Would you like to create one now? (yes/no): yesUsername (Leave blank to use neo): adminE-mail address: user@example.comPassword:Password (again):Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
  180. 180. syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_user django.contrib.authCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweetYou just installed Djangos auth system, which means you dont have anysuperusers defined.Would you like to create one now? (yes/no): yesUsername (Leave blank to use neo): adminE-mail address: user@example.comPassword:Password (again):Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
  181. 181. ¿Cuantos  sistemas  de  Auten0cación  habéis  programado?
  182. 182. ¿Alguno  era  mejor  que  el  anterior?  ;-­‐)
  183. 183. contrib.auth  puede  ser  el  úl0mo  :D
  184. 184. syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweet website.tweetYou just installed Djangos auth system, which means you dont have anysuperusers defined.Would you like to create one now? (yes/no): yesUsername (Leave blank to use neo): adminE-mail address: user@example.comPassword:Password (again):Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
  185. 185. syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweetYou just installed Djangos auth system, which means you dont have anysuperusers defined.Would you like to create one now? (yes/no): yesUsername (Leave blank to use neo): admin django.contrib.authE-mail address: user@example.comPassword:Password (again):Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
  186. 186. BD  Lista  para  usarse
  187. 187. BD  Lista  para  usarse
  188. 188. Previo:  Clases  del  ORM ts = Publisher.objects.all() Model Manager QuerySet
  189. 189. INSERT
  190. 190. INSERT o = Model(...) o.save()a) >>> p = Publisher( ... name=Apress, ... address=2855 Telegraph Avenue, ... city=Berkeley, ... state_province=CA, ... country=U.S.A., ... website=http://www.apress.com/) >>> p.save()
  191. 191. INSERT o = Model(...) o.save()a) >>> p = Publisher( ... name=Apress, ... address=2855 Telegraph Avenue, ... city=Berkeley, ... state_province=CA, ... country=U.S.A., ... website=http://www.apress.com/) >>> p.save() manager.create(...)b) >>> p = Publisher.objects.create( ... name=OReilly, ... address=10 Fawcett St., ... city=Cambridge, ... state_province=MA, ... country=U.S.A., ... website=http://www.oreilly.com/)
  192. 192. UPDATE
  193. 193. UPDATE o.save() >>> ... >>> p.id1 52 >>> p.name = Apress Publishing >>> p.save()
  194. 194. UPDATE o.save() >>> ... >>> p.id1 52 >>> p.name = Apress Publishing >>> p.save() queryset.update(...)n >>> Publisher.objects.all().update(country=USA) 2
  195. 195. DELETE
  196. 196. DELETE o.delete() >>> ... >>> p.id1 52 >>> p.delete()
  197. 197. DELETE o.delete() >>> ... >>> p.id1 52 >>> p.delete() queryset.delete() >>> ps = Publisher.objects.all()n >>> ps.delete()
  198. 198. SELECT  de  1  resultado
  199. 199. SELECT  de  1  resultado .get(...) >>> Publisher.objects.get(name="Apress") <Publisher: Apress>
  200. 200. SELECT  de  1  resultado .get(...) >>> Publisher.objects.get(name="Apress") <Publisher: Apress>>>> Publisher.objects.get(name="Anaya")Traceback (most recent call last): ...DoesNotExist: Publisher matching query does not exist.
  201. 201. SELECT  de  1  resultado .get(...) >>> Publisher.objects.get(name="Apress") <Publisher: Apress>>>> Publisher.objects.get(name="Anaya")Traceback (most recent call last): ...DoesNotExist: Publisher matching query does not exist.>>> Publisher.objects.get(country="U.S.A.")Traceback (most recent call last): ...MultipleObjectsReturned: get() returned more than one Publisher -- it returned 2! Lookup parameters were {country: U.S.A.}
  202. 202. SELECT  de  N  resultados
  203. 203. SELECT  de  N  resultados .all() >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: OReilly>]
  204. 204. SELECT  de  N  resultados .all() >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: OReilly>] .filter(...) >>> Publisher.objects.filter( country="U.S.A.", state_province="CA") [<Publisher: Apress>]
  205. 205. SELECT  de  N  resultados .all() >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: OReilly>] .filter(...) >>> Publisher.objects.filter( country="U.S.A.", state_province="CA") [<Publisher: Apress>] .exclude(...) >>> Publisher.objects.exclude( country="U.S.A.", state_province="CA") [<Publisher: OReilly>]
  206. 206. SELECT  de  N  resultadosen   evuelv ¡D s,  no   .all() uery Set Q li stas! >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: OReilly>] .filter(...) >>> Publisher.objects.filter( country="U.S.A.", state_province="CA") [<Publisher: Apress>] .exclude(...) >>> Publisher.objects.exclude( country="U.S.A.", state_province="CA") [<Publisher: OReilly>]
  207. 207. get(),  filter()  y  exclude()
  208. 208. get(),  filter()  y  exclude() Modelo.objects.filter(campo1="valor1", campo2="valor2")Los  parámetros  pueden  indicar  mucho  más  que  igualdad  (=)
  209. 209. get(),  filter()  y  exclude() Modelo.objects.filter(campo1="valor1", campo2="valor2") Los  parámetros  pueden  indicar  mucho  más  que  igualdad  (=)campo__exact= campo__gt=0 campo__startswith=campo__iexact= campo__gte=0 campo__istartswith=campo__contains= campo__lt=0 campo__endswith=campo__icontains= campo__lte=0 campo__iendswith=campo__isnull=T|F campo__in=[ ,] campo__range=( ,)campo__day=31 campo__month=12 campo__year=2010
  210. 210. ORDER  BY
  211. 211. ORDER  BY .order_by(...)>>> Publisher.objects.order_by("name")[<Publisher: Apress>, <Publisher: OReilly>]
  212. 212. ORDER  BY .order_by(...)>>> Publisher.objects.order_by("name")[<Publisher: Apress>, <Publisher: OReilly>]>>> Publisher.objects.order_by("-name")[<Publisher: OReilly>, <Publisher: Apress>]
  213. 213. ORDER  BY .order_by(...) >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: OReilly>] >>> Publisher.objects.order_by("-name") [<Publisher: OReilly>, <Publisher: Apress>] Múl0ples  campos:>>> Publisher.objects.order_by("-name", "country")[<Publisher: OReilly>, <Publisher: Apress>]
  214. 214. ORDER  BY ¡También   devu elve   .order_by(...) uer y Sets! Q >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: OReilly>] >>> Publisher.objects.order_by("-name") [<Publisher: OReilly>, <Publisher: Apress>] Múl0ples  campos:>>> Publisher.objects.order_by("-name", "country")[<Publisher: OReilly>, <Publisher: Apress>]
  215. 215. Slicing
  216. 216. Slicing [n:m]>>> Publisher.objects.order_by("name")[0]<Publisher: Apress>>>> Publisher.objects.order_by("name")[:2][<Publisher: Apress>, <Publisher: OReilly>]>>> Publisher.objects.order_by("name")[1:2][<Publisher: OReilly>]
  217. 217. Slicing [n:m]>>> Publisher.objects.order_by("name")[0]<Publisher: Apress>>>> Publisher.objects.order_by("name")[:2][<Publisher: Apress>, <Publisher: OReilly>] LIMIT>>> Publisher.objects.order_by("name")[1:2][<Publisher: OReilly>]
  218. 218. Slicing [n:m]>>> Publisher.objects.order_by("name")[0]<Publisher: Apress>>>> Publisher.objects.order_by("name")[:2][<Publisher: Apress>, <Publisher: OReilly>] LIMIT>>> Publisher.objects.order_by("name")[1:2][<Publisher: OReilly>] O FFSET
  219. 219. Related  Objects
  220. 220. Related  Objects OneToOneField class Coche(models.Model):1 motor = OneToOneField(Motor) class Motor(models.Model):1 ...
  221. 221. Related  Objects OneToOneField class Coche(models.Model): 1 motor = OneToOneField(Motor) class Motor(models.Model): 1 ... ¿Cómo  usamos  la  relación  desde  las  instancias? Gracias  a  nosotros>>> c.motor<Motor: Motor object>
  222. 222. Related  Objects OneToOneField class Coche(models.Model): 1 motor = OneToOneField(Motor) class Motor(models.Model): 1 ... ¿Cómo  usamos  la  relación  desde  las  instancias? Gracias  a  nosotros Gracias  a  Django>>> c.motor >>> m.coche<Motor: Motor object> <Coche: Coche object>
  223. 223. Related  Objects
  224. 224. Related  Objects ForeignKeyField class Blog(models.Model):1 ... class Post(models.Model):n blog = ForeignKeyField(Blog)
  225. 225. Related  Objects ForeignKeyField class Blog(models.Model): 1 ... class Post(models.Model): n blog = ForeignKeyField(Blog) ¿Cómo  usamos  la  relación  desde  las  instancias? Gracias  a  nosotros Gracias  a  Django>>> p.blog >>> b.post_set.all()<Blog: Blog object> [<Post: Post object>, ...]
  226. 226. Related  Objects
  227. 227. Related  Objects ManyToManyField class Post(models.Model):n tags = ManyToManyField(Tag) class Tag(models.Model):m ...
  228. 228. Related  Objects ManyToManyField class Post(models.Model): n tags = ManyToManyField(Tag) class Tag(models.Model): m ... ¿Cómo  usamos  la  relación  desde  las  instancias? Gracias  a  nosotros Gracias  a  Django>>> p.tags.add(t1, t2) >>> t.post_set.add(p1, p2)>>> p.tags.all() >>> t.post_set.all()[<Tag: Tag object>, ...] [<Post: Post object>, ...]
  229. 229. Related  Objects
  230. 230. Related  ObjectsEn  todas  ellas  podemos  renombrar  el  puntero  inverso class Blog(models.Model): 1 ... class Post(models.Model): n blog = ForeignKeyField(Blog, related_name=posts)
  231. 231. Related  ObjectsEn  todas  ellas  podemos  renombrar  el  puntero  inverso class Blog(models.Model): 1 ... class Post(models.Model): n blog = ForeignKeyField(Blog, related_name=posts) Gracias  a  nosotros Gracias  a  Django >>> p.blog >>> b.posts.all() <Blog: Blog object> [<Post: Post object>, ...]
  232. 232. Related  ObjectsEn  todas  ellas  podemos  renombrar  el  puntero  inverso class Blog(models.Model): 1 ... class Post(models.Model): n blog = ForeignKeyField(Blog, related_name=posts) Gracias  a  nosotros Gracias  a  Django >>> p.blog >>> b.posts.all() <Blog: Blog object> [<Post: Post object>, ...]Cuando  haya  2  relaciones  entre  2  modelos,  será  obligatorio
  233. 233. Y  la  guinda  final:  ¡Todo  es  LAZY!
  234. 234. Laziness
  235. 235. Laziness• Las  consultas  sólo  se  ejecutarán  cuando  realmente  se   necesite  obtener  los  objetos.  En  las  siguientes  situaciones: • Iteraciones for p in Publisher.objects.all(): • Slicing Publisher.objects.filter(country=USA)[0] • Serialización [Caché] • repr() [<Publisher: Publisher object>] • len() !!! len(Publisher.objects.all()) • list() list(Publisher.objects.all()) • bool() if Publisher.objects.filter(country=USA):
  236. 236. CRUD:  Create,  Retrieve,  Update  &  Delete
  237. 237. django.contrib.admin1 2 3
  238. 238. django.contrib.admin 1 2 3
  239. 239. django.contrib.admin1
  240. 240. Django  admin:  Instalación urls.py from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: # from django.contrib import admin 1 # admin.autodiscover() urlpatterns = patterns(, ... 2 # url(r^admin/, include(admin.site.urls)), ... )
  241. 241. Django  admin:  Instalación urls.py from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: from django.contrib import admin 1 admin.autodiscover() urlpatterns = patterns(, ... 2 url(r^admin/, include(admin.site.urls)), ... )
  242. 242. Django  admin:  Instalación seungs.py INSTALLED_APPS = ( django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.sites, django.contrib.admin, 1 ... )
  243. 243. Actualizando  la  BD
  244. 244. Actualizando  la  BD $ python manage.py syncdb Creating table django_admin_log Installing index for admin.LogEntry model Admin  lista  para  usar
  245. 245. ¿Y  nuestra  app? ?
  246. 246. ¿Y  nuestra  app?
  247. 247. admin.py• Cada  app  debe  de  tener  el  suyo.• Define  qué  modelos  serán  visibles  desde  el  admin  y   permite  personalizar  su  aspecto. from django.contrib import admin from website.models import Tweet class TweetAdmin(admin.ModelAdmin): list_display = (id,user,message,timestamp) admin.site.register(Tweet, TweetAdmin)
  248. 248. 1,2,3  Borrar  la  BD....  1,2,3...  Borrar  la  BD
  249. 249. Fixtures
  250. 250. Fixtures•  Es  muy  aburrido  crear  juegos  de  datos  cada  vez  que  se   elimina  una  tabla  /  BD.•  No  nos  gustan  las  cosas  aburridas.•  Ficheros  (json/xml/yaml)  para  inicializar  una  Tabla.•  Pueden  crearse  una  vez  dispongamos  de  la  información:
  251. 251. Fixtures•  Es  muy  aburrido  crear  juegos  de  datos  cada  vez  que  se   elimina  una  tabla  /  BD.•  No  nos  gustan  las  cosas  aburridas.•  Ficheros  (json/xml/yaml)  para  inicializar  una  Tabla.•  Pueden  crearse  una  vez  dispongamos  de  la  información: python manage.py dumpdata <appName appName appName.model ...>
  252. 252. Fixtures•  Es  muy  aburrido  crear  juegos  de  datos  cada  vez  que  se   elimina  una  tabla  /  BD.•  No  nos  gustan  las  cosas  aburridas.•  Ficheros  (json/xml/yaml)  para  inicializar  una  Tabla.•  Pueden  crearse  una  vez  dispongamos  de  la  información: python manage.py dumpdata <appName appName appName.model ...>•  Se  cargan  u0lizando: python manage.py loaddata <fixture fixture ...>•  Si  se  llaman  ini<al_data  y  están  dentro  de  la  carpeta  fixtures   de  la  app,  se  cargan  al  ahcer  el  syncdb.
  253. 253. Formularios
  254. 254. Clases  involucradas
  255. 255. Clases  involucradasWidget Componente  visual  equivalente  a  HTML TextInput <input type=text...> CheckboxInput <input type=checkbox...>
  256. 256. Clases  involucradasWidget Componente  visual  equivalente  a  HTML TextInput <input type=text...> CheckboxInput <input type=checkbox...>Field Lógica  de  un  campo,  asociado  a  un  Widget EmailField widget, initial, error, ... IPAddressField
  257. 257. Clases  involucradasWidget Componente  visual  equivalente  a  HTML TextInput <input type=text...> CheckboxInput <input type=checkbox...>Field Lógica  de  un  campo,  asociado  a  un  Widget EmailField widget, initial, error, ... IPAddressField Form Conjunto  de  Fields  de  un  formulario ContactForm [nombre, email, telefono, mensaje, ...]
  258. 258. Fields
  259. 259. Fields■ BooleanField ■ IPAddressField■ CharField ■ MultipleChoiceField■ ChoiceField ■ NullBooleanField■ TypedChoiceField ■ RegexField■ DateField ■ SlugField■ DateTimeField ■ TimeField■ DecimalField ■ URLField■ EmailField ■ ComboField■ FileField ■ MultiValuefield■ FilePathField ■ SplitDateTimeField■ FloatField ■ ModelChoiceField■ ImageField ■ ModelMultipleChoiceField■ IntegerField
  260. 260. Creación  de  un  Form• Paso  1/3:  Definición  del  formulario  en  forms.py from django import forms class ContactForm(forms.Form): subject = forms.CharField(max_length=100, label=Topic) email = forms.EmailField(required=False) message = forms.CharField(widget=forms.Textarea)
  261. 261. Creación  de  un  Form• Paso  2/3:  Maquetación  del  formulario  en  su  template <html> <body> <h1>Contact us</h1> {% if form.errors %} <p style="color: red;"> Please correct the error{{ form.errors|pluralize }} below. </p> {% endif %} <form action="" method="post"> <table> {{ form.as_table }} </table> <input type="submit" value="Submit"> </form> </body> </html>
  262. 262. Creación  de  un  Form• Paso  3/3:  Programación  de  la  vista  en  views.py from django.shortcuts import render from mysite.contact.forms import ContactForm def contact(request): if request.method == POST: form = ContactForm(request.POST) if form.is_valid(): cd = form.cleaned_data send_mail(cd[subject], cd[message], ...) # ... return HttpResponseRedirect(/contact/thanks/) else: form = ContactForm() return render(request, contact_form.html, {form: form})
  263. 263. Creación  de  un  Form• Paso  3/3:  Programación  de  la  vista  en  views.py from django.shortcuts import render from mysite.contact.forms import ContactForm def contact(request): if request.method == POST: Pa _ern form = ContactForm(request.POST) if form.is_valid(): cd = form.cleaned_data send_mail(cd[subject], cd[message], ...) # ... return HttpResponseRedirect(/contact/thanks/) else: form = ContactForm() return render(request, contact_form.html, {form: form})
  264. 264. Creación  de  un  Form• Paso  3/3:  Programación  de  la  vista  en  views.py from django.shortcuts import render from mysite.contact.forms import ContactForm def contact(request): if request.method == POST: Pa _ern form = ContactForm(request.POST) if form.is_valid(): cd = form.cleaned_data send_mail(cd[subject], cd[message], ...) # ... return HttpResponseRedirect(/contact/thanks/) else: form = ContactForm() return render(request, contact_form.html, {form: form})
  265. 265. Creación  de  un  Form• Paso  3/3:  Programación  de  la  vista  en  views.py from django.shortcuts import render from mysite.contact.forms import ContactForm def contact(request): if request.method == POST: Pa _ern form = ContactForm(request.POST) if form.is_valid(): cd = form.cleaned_data send_mail(cd[subject], cd[message], ...) # ... return HttpResponseRedirect(/contact/thanks/) else: form = ContactForm() return render(request, contact_form.html, {form: form})
  266. 266. Validación  propia Podemos  programar  validación  extra  asociada  a  cada  Field  del  formulario  escribiendo  un  método  clean_<fieldname>: from django import forms class ContactForm(forms.Form): subject = forms.CharField(max_length=100) email = forms.EmailField(required=False) message = forms.CharField(widget=forms.Textarea) def clean_message(self): message = self.cleaned_data[message] num_words = len(message.split()) if num_words < 4: raise forms.ValidationError("Not enough words!") return message
  267. 267. Validación  propia Podemos  programar  validación  extra  asociada  a  cada  Field  del  formulario  escribiendo  un  método  clean_<fieldname>: from django import forms class ContactForm(forms.Form): subject = forms.CharField(max_length=100) email = forms.EmailField(required=False) message = forms.CharField(widget=forms.Textarea) def clean_message(self): message = self.cleaned_data[message] num_words = len(message.split()) if num_words < 4: raise forms.ValidationError("Not enough words!") return message
  268. 268. Maquetación  propia Podemos  personalizar  la  maquetación  tanto  como   queramos,  prescindiendo  de  las  ayudas  de  form.as_table:...<form action="" method="post"> <div class="field"> {{ form.subject.errors }} Para  los  diseñadores: <label for="id_subject">Subject:</label> {{ form.subject }} <style type="text/css"> </div> ul.errorlist { <div class="field"> ... {{ form.email.errors }} } <label for="id_email">E-mail:</label> .errorlist li { {{ form.email }} ... </div> } ... </style> <input type="submit" value="Submit"></form>...
  269. 269. Forms  a  par0r  de  Models:  El  COLMO  del  DRY
  270. 270. Forms  a  par-r  de  Models from django.db import models class Author(models.Model):models.py name = models.CharField(max_length=100) birth_date = models.DateField(blank=True, null=True) country = models.ModelChoiceField(Country) ... from django import forms from books.models import Author forms.py class AuthorForm(forms.ModelForm): class Meta: model = Author exclude = (country,)
  271. 271. Magia  avanzada
  272. 272. ROSA
  273. 273. NUNCAROSA
  274. 274. NUNCAINFRAVALORÉISROSA
  275. 275. NUNCAINFRAVALORÉISEL  PODERROSA
  276. 276. NUNCAINFRAVALORÉISEL  PODERDE  UN   PONYROSA
  277. 277. Views  avanzadas Generic  Views Vistas  con  funcionalidad  genérica  parametrizable   mediante  un  diccionario  de  Extra  Op-ons Las  tuplas  de  pa>erns()  pueden  tener  3  elementosfrom django.conf.urls.defaults import *from mysite import viewsurlpatterns = patterns(, url(r^foo/$, views.foobar_view, {template_name: template1.html}), url(r^bar/$, views.foobar_view, {template_name: template2.html}),)
  278. 278. Views  avanzadas from django.views.generic.simple import direct_to_template Renderiza  directamente  la  template  indicadafrom django.conf.urls.defaults import *from django.views.generic.simple import direct_to_templateurlpatterns = patterns(, url(r^about/$, direct_to_template, {template: about.html})) Es  la  Generic  View  más  simple  y  más  u+lizada
  279. 279. Template  LibraryNos  permite  extender  el  sistema  de  templates   de  Django  con  Filters  y  Tags  propios
  280. 280. Template  LibraryNos  permite  extender  el  sistema  de  templates   de  Django  con  Filters  y  Tags  propios Uso{% load milibreria %}...{{ variable|mifiltro:"param" }}...{% mitag param1 param2 %}
  281. 281. Template  LibraryNos  permite  extender  el  sistema  de  templates   de  Django  con  Filters  y  Tags  propios Uso Creación{% load milibreria %}...{{ variable|mifiltro:"param" }}...{% mitag param1 param2 %}
  282. 282. Custom  FiltersUn  Filter  es  una  función  Python  que: • Recibe  1  o  2  argumentos:  (value  [,  arg]). • Siempre  devuelve  algo:  el  resultado,  value  o  "". • Falla  silenciosamente:  no  lanza  excepciones.
  283. 283. Custom  FiltersUn  Filter  es  una  función  Python  que: • Recibe  1  o  2  argumentos:  (value  [,  arg]). • Siempre  devuelve  algo:  el  resultado,  value  o  "". • Falla  silenciosamente:  no  lanza  excepciones. from django import template register = template.Library() Ejemplo def cut(value, arg= ): return value.replace(arg, ) register.filter(cut, cut)
  284. 284. Custom  FiltersUn  Filter  es  una  función  Python  que: • Recibe  1  o  2  argumentos:  (value  [,  arg]). • Siempre  devuelve  algo:  el  resultado,  value  o  "". • Falla  silenciosamente:  no  lanza  excepciones. from django import template register = template.Library() @register.filter(name=cut) def cut(value, arg= ): return value.replace(arg, )
  285. 285. Custom  FiltersUn  Filter  es  una  función  Python  que: • Recibe  1  o  2  argumentos:  (value  [,  arg]). • Siempre  devuelve  algo:  el  resultado,  value  o  "". • Falla  silenciosamente:  no  lanza  excepciones. from django import template Py thon   register = template.Library()2.4  se  hizo   @register.filter(name=cut) sexy def cut(value, arg= ): return value.replace(arg, )
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×