0
Disfruta	
  programando.
Jorge	
  Bas4da	
  [neo]   Jaime	
  Irurzun	
  [etox]	
  
  neo2001@gmail.com        jaime.irurzu...
Disfruta	
  programando.
Índice
1. Python                   2. Django
    a. Introducción             a. Introducción
    b. Tipos	
  de	
  datos  ...
Índice
1. Python                   2. Django
    a. Introducción             a. Introducción
    b. Tipos	
  de	
  datos  ...
• Legible                Sintaxis	
  intui4va	
  y	
  estricta

• Produc/vo              Entre	
  1/3	
  y	
  1/5	
  más	
...
Instalación

 $ sudo apt-get install python




http://www.python.org/download/




Snow	
  Leopard	
  incluye	
  las	
  v...
El	
  Intérprete
El	
  Intérprete
                        Modo	
  Batch
    holamundo.py
                                $ python holamundo...
El	
  Intérprete
                           Modo	
  Batch
     holamundo.py
                                      $ python...
Índice
1. Python                   2. Django
    a. Introducción             a. Introducción
    b. Tipos	
  de	
  datos  ...
Tipos	
  de	
  datos


object




         +	
  info:	
  hp://docs.python.org/library/stdtypes.html
Tipos	
  de	
  datos
          int     1234         long     35L        float    3.1415




object




         +	
  info:	...
Tipos	
  de	
  datos
          int     1234         long     35L        float    3.1415



         bool     True       Fal...
Tipos	
  de	
  datos
          int     1234         long     35L        float    3.1415



         bool     True       Fal...
Tipos	
  de	
  datos
          int     1234         long     35L        float    3.1415



         bool     True       Fal...
Tipos	
  de	
  datos
          int     1234         long     35L        float    3.1415



         bool     True       Fal...
Tipos	
  de	
  datos
           int     1234         long     35L        float    3.1415



         bool      True       F...
Tipos	
  de	
  datos                                          o	
  
                                                      ...
Índice
1. Python                   2. Django
    a. Introducción             a. Introducción
    b. Tipos	
  de	
  datos  ...
Operadores




+	
  info:	
  hp://docs.python.org/library/operator.html
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          -...
Operadores
                  a + b         a - b        a * b          a / b
  numéricos
                  a % b          ...
Índice
1. Python                   2. Django
    a. Introducción             a. Introducción
    b. Tipos	
  de	
  datos  ...
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 nums
True
Usos	
  frecuentes:	
  list
>>> nums = [1, 2, 3]
>>> nums[0]
1


>>> 2 in nums
True


>>> nums.append(4)
>>> print nums
[1...
Usos	
  frecuentes:	
  list
>>> nums = [1, 2, 3]
>>> nums[0]
1


>>> 2 in nums
True


>>> nums.append(4)
>>> print nums
[1...
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("Py...
Usos	
  frecuentes:	
  str
>>> "Python mola"[1:4]
'yth'


>>> "Python mola".find("mola")
7


>>> "Python mola".replace("Py...
Usos	
  frecuentes:	
  str
>>> "Python mola"[1:4]
'yth'


>>> "Python mola".find("mola")
7


>>> "Python mola".replace("Py...
Usos	
  frecuentes:	
  dict
Usos	
  frecuentes:	
  dict
>>> user = {'nick': 'neo', 'age': 24}
>>> user.keys()
['nick', 'age']
>>> user.values()
['neo'...
Usos	
  frecuentes:	
  dict
>>> user = {'nick': 'neo', 'age': 24}
>>> user.keys()
['nick', 'age']
>>> user.values()
['neo'...
Usos	
  frecuentes:	
  dict
>>> user = {'nick': 'neo', 'age': 24}
>>> user.keys()
['nick', 'age']
>>> user.values()
['neo'...
Usos	
  frecuentes:	
  dict
>>> user = {'nick': 'neo', 'age': 24}
>>> user.keys()
['nick', 'age']
>>> user.values()
['neo'...
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" % ("Hyc...
Usos	
  frecuentes:	
  str	
  %
>>> "%s es muy sabio" % "Hycker"
'Hycker es muy sabio'



>>> "%s sabe %i idiomas" % ("Hyc...
Módulos
sound/
      __init__.py            1. Un	
  módulo	
  es	
  un	
  fichero	
  .py
      formats/
              __in...
Módulos
sound/
 2    __init__.py             1. Un	
  módulo	
  es	
  un	
  fichero	
  .py
      formats/
              __i...
Módulos
           import math           ¿Dónde	
  los	
  busca	
  Python?

En	
  la	
  lista	
  de	
  directorios	
  que	...
Módulos
sound/                       import sound.effects.echo
      __init__.py            sound.effects.echo.echofilter(...
Módulos
sound/                       import sound.effects.echo
      __init__.py            sound.effects.echo.echofilter(...
Módulos
sound/                       import sound.effects.echo
      __init__.py            sound.effects.echo.echofilter(...
Módulos
sound/                       import sound.effects.echo
      __init__.py            sound.effects.echo.echofilter(...
Módulos
sound/                       import sound.effects.echo
      __init__.py            sound.effects.echo.echofilter(...
Índice
1. Python                   2. Django
    a. Introducción             a. Introducción
    b. Tipos	
  de	
  datos  ...
Estructuras




 {}
Estructuras




 {}
Identación

>>> from __future__ import braces
     File "<stdin>", line 1
     SyntaxError: not a chance
Identación

>>> from __future__ import braces
     File "<stdin>", line 1
     SyntaxError: not a chance




             ...
¿PEP	
  8?
                                                                 PEP 8




•	
  Guido	
  van	
  Rossum	
  (2001...
Funciones

def my_first_function(p1, p2):
    return "Hello World!"
Funciones

1   def my_first_function(p1, p2):
        return "Hello World!"
Funciones
                            2
1   def my_first_function(p1, p2):
        return "Hello World!"
Funciones
                            2
1   def my_first_function(p1, p2):
      3 return "Hello World!"
Funciones
                                                 2
1   def my_first_function(p1, p2):
      3 return "Hello Worl...
Conversión	
  de	
  /pos




 +info:	
  hp://docs.python.org/library/func4ons.html
Conversión	
  de	
  /pos
>>> int(1.3)
1




 +info:	
  hp://docs.python.org/library/func4ons.html
Conversión	
  de	
  /pos
>>> int(1.3)
1


>>> str(2)
'2'




 +info:	
  hp://docs.python.org/library/func4ons.html
Conversión	
  de	
  /pos
>>> int(1.3)
1


>>> str(2)
'2'


>>> float(1)
1.0




 +info:	
  hp://docs.python.org/library/fu...
Conversión	
  de	
  /pos
>>> int(1.3)
1
                             >>> tuple([1,2,3])
                             (1, 2...
Conversión	
  de	
  /pos
>>> int(1.3)
1
                             >>> tuple([1,2,3])
                             (1, 2...
Funciones	
  comunes




 +info:	
  hp://docs.python.org/library/func4ons.html
Funciones	
  comunes
>>> len("Python Mola")
11
>>> len([1,2,3,4])
4




      +info:	
  hp://docs.python.org/library/func4...
Funciones	
  comunes
>>> len("Python Mola")
11
>>> len([1,2,3,4])
4


>>>   range(5)
[0,   1, 2, 3, 4]
>>>   range(1,7)
[1...
Funciones	
  comunes
                                       >>> type(True)
>>> len("Python Mola")
                        ...
Funciones	
  comunes
                                       >>> type(True)
>>> len("Python Mola")
                        ...
Funciones	
  interesantes




             Son	
  sólo	
  un	
  ejemplo...

  +info:	
  hp://docs.python.org/library/func4...
Funciones	
  interesantes
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> zip(a,b)
[(1, 4), (2, 5), (3, 6)]




                    So...
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])...
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__',
'__delsli...
Funciones	
  de	
  ayuda
>>> dir([1,2,3])
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delsli...
Clases
class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def ...
Clases
    1
class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

  ...
Clases
    1              2
class Student(object):
    def __init__(self, name, age):
        self.name = name
        sel...
Clases
    1              2
class Student(object):
  3 def __init__(self, name, age):
        self.name = name
        sel...
Clases
    1              2
class Student(object):
  3 def __init__(self, name, age):
      4 self.name = name
        sel...
Clases
    1              2
class Student(object):
  3 def __init__(self, name, age):
      4 self.name = name
        sel...
Clases
    1              2
class Student(object):
  3 def __init__(self, name, age):
      4 self.name = name
        sel...
El	
  operador	
  ()
• Es	
  importante	
  diferenciar:
    funcion	
  	
  	
  vs	
  	
  	
  funcion()

    Clase	
  	
  	...
Índice
1. Python                   2. Django
    a. Introducción             a. Introducción
    b. Tipos	
  de	
  datos  ...
Sentencias:	
  if-­‐else


$name = "Jon";               name = "Jon"

if($name == "Jon"){          if name == "Jon":
    $...
Sentencias:	
  while

       $count = 0;
       while ($count < 5) {
           echo "Number ".$count;
           $count+=...
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...
Conclusiones
•	
  Python	
  es	
  un	
  lenguaje	
  fácil	
  de	
  aprender.
•	
  Menos	
  código:
    •	
  Muchos	
  Much...
Ejemplo	
  &	
  Ejercicio
Índice
1. Python                   2. Django
    a. Introducción             a. Introducción
    b. Tipos	
  de	
  datos  ...
Evolución	
  de	
  la	
  Web
                   Desarrollo	
  Web

1ª	
  Generación    2ª	
  Generación   3ª	
  Generación...
Frameworks	
  web
Django:	
  Qué	
  y	
  dónde
FilosoXa
•	
  Loose	
  coupling,	
  	
  Acoplamiento	
  débil.
    •	
  Cada	
  capa	
  es	
  independiente	
  y	
  descon...
FilosoXa
•	
  Loose	
  coupling,	
  	
  Acoplamiento	
  débil.
    •	
  Cada	
  capa	
  es	
  independiente	
  y	
  descon...
FilosoXa
•	
  Explicit	
  is	
  beer	
  than	
  implicit.
    •	
  Este	
  es	
  un	
  principio	
  de	
  Python.
    •	
 ...
La	
  comunidad
La	
  comunidad
• django-­‐users
        18.000	
  miembros
La	
  comunidad
• django-­‐users
        18.000	
  miembros

• django-­‐developers
        5.900	
  miembros
La	
  comunidad
• django-­‐users
        18.000	
  miembros

• django-­‐developers
        5.900	
  miembros

• djangoproj...
¿Quién	
  usa	
  Django?
¿Quién	
  usa	
  Django?




           etc...
1.	
  Instalación	
  Python

     $ sudo apt-get install python




   http://www.python.org/download/




    Snow	
  Leo...
2.	
  Instalación	
  SGBD
Configurar	
  un	
  motor	
  de	
  Base	
  de	
  Datos:
  •	
  Oficiales:	
                       ...
2.	
  Instalación	
  SGBD
Configurar	
  un	
  motor	
  de	
  Base	
  de	
  Datos:
  •	
  Oficiales:	
                       ...
2.	
  Instalación	
  SGBD

•	
  Vamos	
  a	
  uNlizar	
  SQLite	
  por	
  comodidad
•	
  Desde	
  Python	
  2.5	
  podemos...
2.	
  Instalación	
  SGBD

•	
  Vamos	
  a	
  uNlizar	
  SQLite	
  por	
  comodidad
•	
  Desde	
  Python	
  2.5	
  podemos...
3.	
  Instalación	
  Django
A:	
  Paquetes	
  de	
  cada	
  distro
   • apt-get install python-django
B:	
  Official	
  Rele...
All	
  Right?
All	
  Right?

>>> import django
>>> django.VERSION
(1, 1, 0, 'final', 0)




>>> import django
Traceback (most recent cal...
Bienvenidos	
  al	
  mundo	
  de	
  Oz
Ficheros	
  y	
  Carpetas
            ¿Es	
  Django	
  tán	
  simple	
  y	
  fácil	
  de	
  usar?




                 *	
...
Ficheros	
  y	
  Carpetas
             ¿Es	
  Django	
  tán	
  simple	
  y	
  fácil	
  de	
  usar?




Ficheros


Carpetas...
Ficheros	
  y	
  Carpetas
                   ¿Es	
  Django	
  tán	
  simple	
  y	
  fácil	
  de	
  usar?




           Ra...
Ficheros	
  y	
  Carpetas
                   ¿Es	
  Django	
  tán	
  simple	
  y	
  fácil	
  de	
  usar?




           Ra...
Ficheros	
  y	
  Carpetas
                   ¿Es	
  Django	
  tán	
  simple	
  y	
  fácil	
  de	
  usar?




           Ra...
Let’s	
  enjoy
Crear	
  nuestro	
  proyecto
                      de	
  4	
  ficheros	
  ;-­‐)
Crear	
  nuestro	
  proyecto            de	
  4	
  ficheros	
  ;-­‐)




    $ django-admin.py startproject dwitter
Crear	
  nuestro	
  proyecto            de	
  4	
  ficheros	
  ;-­‐)




    $ django-admin.py startproject dwitter



    ...
Crear	
  nuestro	
  proyecto                                                               de	
  4	
  ficheros	
  ;-­‐)



...
Crear	
  nuestro	
  proyecto                                                               de	
  4	
  ficheros	
  ;-­‐)



...
senngs.py
Arrancar	
  nuestro	
  proyecto
                        de	
  4	
  ficheros	
  ;-­‐)
Arrancar	
  nuestro	
  proyecto                          de	
  4	
  ficheros	
  ;-­‐)

     $ cd dwitter
     $ python mana...
Arrancar	
  nuestro	
  proyecto                          de	
  4	
  ficheros	
  ;-­‐)

     $ cd dwitter
     $ python mana...
Índice
1. Python                   2. Django
    a. Introducción             a. Introducción
    b. Tipos	
  de	
  datos  ...
MVC	
  en	
  Django




Modelo	
  =	
  Model   Vista	
  =	
  Template   Controlador	
  =	
  URL+View
URLs	
  y	
  Vistas
• El	
  fichero	
  urls.py	
  actúa	
  como	
  puerta	
  de	
  entrada	
  para	
  las	
  
   pe4ciones	...
URLs	
  y	
  Vistas
• La	
  función	
  de	
  views.py	
  recibe	
  como	
  parámetros	
  un	
  objeto	
  
   HhpRequest	
 ...
URLs	
  y	
  Vistas
 Ejemplo	
  1:	
  	
  http://mysite.com/time

           from django.conf.urls.defaults import *
     ...
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
Índice
1. Python                   2. Django
    a. Introducción             a. Introducción
    b. Tipos	
  de	
  datos  ...
Templates
• Separan	
  la	
  lógica	
  de	
  presentación	
  a	
  una	
  capa	
  independiente.
     • Ficheros	
  indepen...
Templates
 • Se	
  basan	
  en	
  dos	
  4pos	
  de	
  objetos:	
  Template()	
  y	
  Context().
       • Un	
  objeto	
  ...
Templates
• Primera	
  aproximación	
  al	
  obje4vo:	
  Template	
  +	
  Context
         from django.http import HttpRes...
Templates
• Segunda	
  aproximación	
  al	
  obje4vo:	
  open(),	
  read(),	
  close()

      from django.http import Http...
Templates
• Segunda	
  aproximación	
  al	
  obje4vo:	
  open(),	
  read(),	
  close()

      from django.http import Http...
Templates
• Segunda	
  aproximación	
  al	
  obje4vo:	
  open(),	
  read(),	
  close()

      from django.http import Http...
Templates
• Tercera	
  aproximación	
  al	
  obje4vo:	
  get_template()
                             TEMPLATE_DIRS = (
   ...
Templates
• Tercera	
  aproximación	
  al	
  obje4vo:	
  get_template()
                             TEMPLATE_DIRS = (
   ...
Templates
• Tercera	
  aproximación	
  al	
  obje4vo:	
  get_template()
                             TEMPLATE_DIRS = (
   ...
Templates
• Obje4vo	
  alcanzado:	
  render_to_response()
 from django.shortcuts import render_to_response
 from datetime ...
Templates
• Obje4vo	
  alcanzado:	
  render_to_response()
 from django.shortcuts import render_to_response
 from datetime ...
Templates
• Obje4vo	
  alcanzado:	
  render_to_response()
 from django.shortcuts import render_to_response
 from datetime ...
Templates:	
  Tip
                  TEMPLATE_DIRS = (
a) sezngs.py          '/home/django/templates',
                  )
Templates:	
  Tip
                  TEMPLATE_DIRS = (
                                                  Reusa ble	
  
a) s...
Templates:	
  Tip
                      TEMPLATE_DIRS = (
                                                                ...
a) Crear	
  la	
  app	
  dwier.website.
b) Incluir	
  la	
  app	
  en	
  senngs.py.
c) Definir	
  URLs	
  en	
  urls.py:
  ...
Templates	
  en	
  detalle
•	
  Si,	
  otro	
  sistema	
  de	
  templates
  •	
  Smarty,	
  Tiles,	
  ClearSilver	
  ...	
...
FilosoXa	
  y	
  Limitaciones
•	
  La	
  sintaxis	
  debe	
  estar	
  desacoplada	
  del	
  HTML/XML.
•	
  Los	
  diseñado...
Templates:	
  {{}}
<html>
    <head>Ejemplo templates</head>
    <body>
        Hola, {{ username }}.
    </body>
</html>
...
Filters	
  y	
  Tags
Filters	
  y	
  Tags
Filters	
  y	
  Tags

filter   {{ 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 ...
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 %}
  ...
Tarea	
  1:	
  Tags
 a) UNlizar	
  tags	
  para	
  que	
  el	
  Nmeline	
  se	
  
    muestre	
  con	
  el	
  siguiente	
 ...
Templates:	
  Filters
         <html>
             <head>Ejemplo templates</head>
/tle         <body>
                 Hol...
Templates:	
  Filters
Templates:	
  Filters
            {'username': 'Juan es majo'}


length   {{ username|length }}             12
Templates:	
  Filters
             {'username': 'Juan es majo'}


length    {{ username|length }}                12



 cu...
Templates:	
  Filters
             {'username': 'Juan es majo'}


length    {{ username|length }}                12



 cu...
Templates:	
  Filters
               {'username': 'Juan es majo'}


 length     {{ username|length }}                12


...
Templates:	
  Filters
               {'username': 'Juan es majo'}


 length     {{ username|length }}                12


...
Templates:	
  Filters
                  {'username': 'Juan es majo'}


 length       {{ username|length }}                ...
Templates:	
  Filters
Templates:	
  Filters
{'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'}



          striptags   {{ username|str...
Templates:	
  Filters
  {'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'}



            striptags   {{ username...
Templates:	
  Filters
  {'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'}



            striptags   {{ username...
Templates:	
  Filters
Templates:	
  Filters
{'url': 'Visitad http://www.djangoproject.com'}




    urlize   {{ url|urlize }}


                ...
Templates:	
  Filters
{'url': 'Visitad http://www.djangoproject.com'}




     urlize   {{ url|urlize }}


               ...
Templates:	
  Filters
{'lista': ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]}
Templates:	
  Filters
{'lista': ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]}




  unordered_list      {{ l...
Templates:	
  Filters
Templates:	
  Filters
          {'value': 123456789}


add   {{ value|add:”1” }}        123456790
Templates:	
  Filters
                    {'value': 123456789}


     add        {{ value|add:”1” }}          123456790


...
Templates:	
  Filters
                       {'value': 123456789}


     add          {{ value|add:”1” }}           123456...
Templates:	
  Filters
                       {'value': 123456789}


     add          {{ value|add:”1” }}           123456...
Templates:	
  Filters
                       {'value': 123456789}


     add          {{ value|add:”1” }}           123456...
Tarea	
  2:	
  Filters
 a) Añadir	
  a	
  cada	
  tweet	
  del	
  Nmeline	
  el	
  
    Nempo	
  transcurrido:
  • <userna...
Templates:	
  tags	
  {%	
  %}
Templates:	
  tags	
  {%	
  %}
cycle   {% for elemento in lista %}
            <li class="{% cycle 'rojo' 'azul' %}">{{ el...
Templates:	
  tags	
  {%	
  %}
  cycle   {% for elemento in lista %}
              <li class="{% cycle 'rojo' 'azul' %}">{...
Templates:	
  tags	
  {%	
  %}
  cycle   {% for elemento in lista %}
              <li class="{% cycle 'rojo' 'azul' %}">{...
Templates:	
  tags	
  {%	
  %}
  cycle   {% for elemento in lista %}
              <li class="{% cycle 'rojo' 'azul' %}">{...
Tarea	
  3:	
  Tags	
  avanzados
 a) Hacer	
  que	
  el	
  Nmeline	
  muestre	
  el	
  
    mensaje	
  “No	
  hay	
  tweet...
extend	
  y	
  block
base.html   <html>
                <head>
                    <title>Mi página personal</title>
     ...
Tarea	
  4:	
  Herencia	
  de	
  templates
 a) Descargar	
  nuestra	
  template	
  base.html.
 b) Incluirla	
  en	
  vuest...
Índice
1. Python                   2. Django
    a. Introducción             a. Introducción
    b. Tipos	
  de	
  datos  ...
Modelos
¿SQL?
Ejemplo	
  SQL
def book_list(request):
    try:
        db = MySQLdb.connect(user='me', db='mydb',
                       ...
Ejemplo	
  SQL
def book_list(request):
    try:                 1
        db = MySQLdb.connect(user='me', db='mydb',
     ...
Ejemplo	
  SQL
def book_list(request):
    try:                 1
                                                     2
 ...
Ejemplo	
  SQL
def book_list(request):
    try:                 1
                                                     2
 ...
Ejemplo	
  SQL
def book_list(request):
    try:                 1
                                                     2
 ...
Ejemplo	
  SQL
def book_list(request):
    try:                 1
                                                     2
 ...
Ejemplo	
  SQL
def book_list(request):
    try:                 1
                                                     2
 ...
12	
  lineas	
  de	
  Python...	
  ¬_¬
ORM	
  (Object-­‐RelaNonal	
  mapping)
ORM	
  (Object-­‐RelaNonal	
  mapping)
Ejemplo	
  ORM


def book_list(request):

   names = Books.objects.all().order_by('name')

    return render_to_response('...
Ejemplo	
  ORM


def book_list(request):

1   names = Books.objects.all().order_by('name')

    return render_to_response(...
Ejemplo	
  ORM


def 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=1...
Modelo
 from django.db import models                  1


 class Books(models.Model):
       name = models.CharField(blank...
Modelo
     from django.db import models                  1


2    class Books(models.Model):
           name = models.Cha...
Modelo
     from django.db import models                  1

                            3
2    class Books(models.Model):...
Modelo
     from django.db import models                  1

                            3
2    class Books(models.Model):...
Modelo
     from django.db import models                  1

                            3
2    class Books(models.Model):...
Modelo
     from django.db import models                  1

                            3
2    class Books(models.Model):...
Fucking	
  Awesome	
  Ninjas!
Tipos	
  de	
  Datos
• AutoField                    • IPAdressField
• BigIntegerField              • NullBooleanField
• Bo...
Tipos	
  de	
  Datos
• AutoField                    • IPAdressField
• BigIntegerField              • NullBooleanField
• Bo...
Propiedades	
  de	
  las	
  Field

• null (True|Flase)       • unique (True|False)

• blank (True|False)      • primary_ke...
Propiedades	
  de	
  las	
  Field

• null (True|Flase)       • unique (True|False)

• blank (True|False)      • primary_ke...
¿Es	
  magia?	
  No.

   BEGIN;
   CREATE TABLE "website_books" (
       "id" integer NOT NULL PRIMARY KEY,
       "name" ...
¿Es	
  magia?	
  No.
 $ python manage.py sqlall website



   BEGIN;
   CREATE TABLE "website_books" (
       "id" integer...
¿Es	
  magia?	
  No.

•	
  Nombres	
  de	
  tablas	
  generados	
  automáNcamente.
  •	
  <app_name>_lower(<model_name>)
•...
Configurar	
  sesngs.py

     DATABASE_ENGINE = 'sqlite3'
     DATABASE_NAME = 'db.sqlite'
     DATABASE_USER = ''
     DAT...
Configurar	
  sesngs.py

     DATABASE_ENGINE = 'sqlite3'   1
     DATABASE_NAME = 'db.sqlite'
     DATABASE_USER = ''
    ...
Configurar	
  sesngs.py

     DATABASE_ENGINE = 'sqlite3'   1
     DATABASE_NAME = 'db.sqlite'   2
     DATABASE_USER = ''
...
Configurar	
  sesngs.py

     DATABASE_ENGINE = 'sqlite3'   1
     DATABASE_NAME = 'db.sqlite'   2
     DATABASE_USER = ''
...
Creando	
  Tablas


•	
  Crea	
  las	
  tablas	
  para	
  todos	
  los	
  modelos	
  de	
  las	
  apps	
  instaladas	
  
 ...
Creando	
  Tablas
                $ python manage.py syncdb



•	
  Crea	
  las	
  tablas	
  para	
  todos	
  los	
  model...
a) Crear	
  modelo	
  Tweet
b)Configurar	
  senngs.py
c) Ver	
  el	
  SQL	
  generado	
  con	
  sqlall




        Nuestro	...
syncdb
$ python   manage.py syncdb
Creating   table auth_permission
Creating   table auth_group
Creating   table auth_user...
syncdb
$ python   manage.py syncdb
Creating   table auth_permission
Creating   table auth_group
Creating   table auth_user...
¿Cuantos	
  sistemas	
  de	
  AutenNcación	
  habéis	
  programado?
¿Alguno	
  era	
  mejor	
  que	
  el	
  anterior?	
  ;-­‐)
contrib.auth	
  puede	
  ser	
  el	
  úlNmo	
  :D
syncdb
$ python   manage.py syncdb
Creating   table auth_permission
Creating   table auth_group
Creating   table auth_user...
syncdb
$ python   manage.py syncdb
Creating   table auth_permission
Creating   table auth_group
Creating   table auth_user...
BD	
  Lista	
  para	
  usarse
BD	
  Lista	
  para	
  usarse
a) Hacer	
  syncdb




       Nuestro	
  primer	
  modelo
Previo:	
  Clases	
  del	
  ORM

  ts = Publisher.objects.all()


         Model

            Manager

                 Qu...
Previo:	
  __unicode__()
Previo:	
  __unicode__()
    >>> Publisher.objects.all()
    [<Publisher: Publisher object>]
Previo:	
  __unicode__()
    >>> Publisher.objects.all()
    [<Publisher: Publisher object>]
Previo:	
  __unicode__()
    >>> Publisher.objects.all()
    [<Publisher: Publisher object>]
Previo:	
  __unicode__()
    >>> Publisher.objects.all()
    [<Publisher: Publisher object>]




    class Publisher(model...
Previo:	
  __unicode__()
    >>> Publisher.objects.all()
    [<Publisher: Publisher object>]




    class Publisher(model...
INSERT
INSERT
             o = Model(...)    o.save()

a)   >>> p = Publisher(
     ...       name='Apress',
     ...       addre...
INSERT
             o = Model(...)    o.save()

a)   >>> p = Publisher(
     ...       name='Apress',
     ...       addre...
UPDATE
UPDATE
                       o.save()

    >>>   ...
    >>>   p.id
1   52
    >>>   p.name = 'Apress Publishing'
    >>>...
UPDATE
                       o.save()

    >>>   ...
    >>>   p.id
1   52
    >>>   p.name = 'Apress Publishing'
    >>>...
DELETE
DELETE
                o.delete()

    >>> ...
    >>> p.id
1   52
    >>> p.delete()
DELETE
                o.delete()

    >>> ...
    >>> p.id
1   52
    >>> p.delete()



            queryset.delete()

  ...
SELECT	
  de	
  1	
  resultado
SELECT	
  de	
  1	
  resultado
                 .get(...)


  >>> Publisher.objects.get(name="Apress")
  <Publisher: Apres...
SELECT	
  de	
  1	
  resultado
                           .get(...)


    >>> Publisher.objects.get(name="Apress")
    <Pu...
SELECT	
  de	
  1	
  resultado
                           .get(...)


    >>> Publisher.objects.get(name="Apress")
    <Pu...
SELECT	
  de	
  N	
  resultados
SELECT	
  de	
  N	
  resultados
                     .all()

  >>> Publisher.objects.all()
  [<Publisher: Apress>, <Publis...
SELECT	
  de	
  N	
  resultados
                     .all()

  >>> Publisher.objects.all()
  [<Publisher: Apress>, <Publis...
SELECT	
  de	
  N	
  resultados
                     .all()

  >>> Publisher.objects.all()
  [<Publisher: Apress>, <Publis...
SELECT	
  de	
  N	
  resultadosen	
  
                            evuelv        ¡D        s,	
  no	
  
                   ...
get(),	
  filter()	
  y	
  exclude()
get(),	
  filter()	
  y	
  exclude()
 Modelo.objects.filter(campo1="valor1", campo2="valor2")


Los	
  parámetros	
  pueden...
get(),	
  filter()	
  y	
  exclude()
   Modelo.objects.filter(campo1="valor1", campo2="valor2")


 Los	
  parámetros	
  pue...
ORDER	
  BY
ORDER	
  BY
            .order_by(...)


>>> Publisher.objects.order_by("name")
[<Publisher: Apress>, <Publisher: O'Reilly...
ORDER	
  BY
            .order_by(...)


>>> Publisher.objects.order_by("name")
[<Publisher: Apress>, <Publisher: O'Reilly...
ORDER	
  BY
                  .order_by(...)


     >>> Publisher.objects.order_by("name")
     [<Publisher: Apress>, <Pub...
ORDER	
  BY                   ¡También	
  
                                            devu elve	
  
                  .or...
Slicing
Slicing
                       [n:m]



>>> Publisher.objects.order_by("name")[0]
<Publisher: Apress>



>>> Publisher.obj...
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Django: Disfruta programando.
Upcoming SlideShare
Loading in...5
×

Django: Disfruta programando.

12,956

Published on

Curso de Python y Django impartido con Jaime Irurzun en los cursos de verano del e-ghost en la Universidad de Deusto, septiembre 2010.

Published in: Technology
4 Comments
10 Likes
Statistics
Notes
No Downloads
Views
Total Views
12,956
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
339
Comments
4
Likes
10
Embeds 0
No embeds

No notes for slide

Transcript of "Django: Disfruta programando."

  1. 1. Disfruta  programando. Jorge  Bas4da  [neo] Jaime  Irurzun  [etox]   neo2001@gmail.com jaime.irurzun@gmail.com @jorgebas4da @jaimeirurzun
  2. 2. Disfruta  programando.
  3. 3. Índice 1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  4. 4. Índice 1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  5. 5. • Legible Sintaxis  intui4va  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  par4es • Integrable C,  C++,  Java,  .NET,  COM,  WS,  CORBA,  ... • ...  y  Diver/do
  6. 6. Instalación $ sudo apt-get install python http://www.python.org/download/ Snow  Leopard  incluye  las  versiones  2.5.4  y  2.6.1
  7. 7. El  Intérprete
  8. 8. El  Intérprete Modo  Batch holamundo.py $ python holamundo.py #!/usr/bin/env python hola mundo! print "hola mundo!" $
  9. 9. El  Intérprete Modo  Batch holamundo.py $ python holamundo.py #!/usr/bin/env python hola mundo! print "hola mundo!" $ Modo  Interac4vo $ python Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> print "hola mundo!" hola mundo!
  10. 10. Índice 1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  11. 11. Tipos  de  datos object +  info:  hp://docs.python.org/library/stdtypes.html
  12. 12. Tipos  de  datos int 1234 long 35L float 3.1415 object +  info:  hp://docs.python.org/library/stdtypes.html
  13. 13. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False object +  info:  hp://docs.python.org/library/stdtypes.html
  14. 14. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str 'spam' "guido's" """n lines""" object +  info:  hp://docs.python.org/library/stdtypes.html
  15. 15. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str 'spam' "guido's" """n lines""" object list [1, [2, 'three'], 4] +  info:  hp://docs.python.org/library/stdtypes.html
  16. 16. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str 'spam' "guido's" """n lines""" object list [1, [2, 'three'], 4] dict {'food': 'spam', 'taste': 'yum'} +  info:  hp://docs.python.org/library/stdtypes.html
  17. 17. Tipos  de  datos int 1234 long 35L float 3.1415 bool True False str 'spam' "guido's" """n lines""" object list [1, [2, 'three'], 4] dict {'food': 'spam', 'taste': 'yum'} tuple (1, 'spam', 4, 'U') +  info:  hp://docs.python.org/library/stdtypes.html
  18. 18. Tipos  de  datos o   ¡T i p ad mi co! int 1234 long 35L float d iná 3.1415 bool True False str 'spam' "guido's" """n lines""" object list [1, [2, 'three'], 4] dict {'food': 'spam', 'taste': 'yum'} tuple (1, 'spam', 4, 'U') +  info:  hp://docs.python.org/library/stdtypes.html
  19. 19. Índice 1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  20. 20. Operadores +  info:  hp://docs.python.org/library/operator.html
  21. 21. Operadores a + b a - b a * b a / b numéricos a % b -a +a a ** b +  info:  hp://docs.python.org/library/operator.html
  22. 22. Operadores a + b a - b a * b a / b numéricos a % b -a +a a ** b a < b a <= b a > b comparadores a >= b a == b a != b +  info:  hp://docs.python.org/library/operator.html
  23. 23. Operadores a + b a - b a * b a / b numéricos a % b -a +a a ** b a < b a <= b a > b comparadores a >= b a == b a != b lógicos a or b a and b not a +  info:  hp://docs.python.org/library/operator.html
  24. 24. Índice 1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  25. 25. Usos  frecuentes:  list
  26. 26. Usos  frecuentes:  list >>> nums = [1, 2, 3] >>> nums[0] 1
  27. 27. Usos  frecuentes:  list >>> nums = [1, 2, 3] >>> nums[0] 1 >>> 2 in nums True
  28. 28. Usos  frecuentes:  list >>> nums = [1, 2, 3] >>> nums[0] 1 >>> 2 in nums True >>> nums.append(4) >>> print nums [1, 2, 3, 4]
  29. 29. Usos  frecuentes:  list >>> nums = [1, 2, 3] >>> nums[0] 1 >>> 2 in nums True >>> nums.append(4) >>> print nums [1, 2, 3, 4] >>> nums.count() 4
  30. 30. Usos  frecuentes:  str
  31. 31. Usos  frecuentes:  str >>> "Python mola"[1:4] 'yth'
  32. 32. Usos  frecuentes:  str >>> "Python mola"[1:4] 'yth' >>> "Python mola".find("mola") 7
  33. 33. Usos  frecuentes:  str >>> "Python mola"[1:4] 'yth' >>> "Python mola".find("mola") 7 >>> "Python mola".replace("Python", "PHP no") 'PHP no mola'
  34. 34. 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']
  35. 35. 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"
  36. 36. Usos  frecuentes:  dict
  37. 37. Usos  frecuentes:  dict >>> user = {'nick': 'neo', 'age': 24} >>> user.keys() ['nick', 'age'] >>> user.values() ['neo', 24]
  38. 38. Usos  frecuentes:  dict >>> user = {'nick': 'neo', 'age': 24} >>> user.keys() ['nick', 'age'] >>> user.values() ['neo', 24] >>> user['age'] >>> user.get('age', 20) 24 24
  39. 39. Usos  frecuentes:  dict >>> user = {'nick': 'neo', 'age': 24} >>> user.keys() ['nick', 'age'] >>> user.values() ['neo', 24] >>> user['age'] >>> user.get('age', 20) 24 24 >>> user.has_key('nick') True
  40. 40. Usos  frecuentes:  dict >>> user = {'nick': 'neo', 'age': 24} >>> user.keys() ['nick', 'age'] >>> user.values() ['neo', 24] >>> user['age'] >>> user.get('age', 20) 24 24 >>> user.has_key('nick') True >>> user.update({'nick': 'alatar', 'age': 25}) >>> user {'nick': 'alatar', 'age': 25}
  41. 41. Usos  frecuentes:  str  %
  42. 42. Usos  frecuentes:  str  % >>> "%s es muy sabio" % "Hycker" 'Hycker es muy sabio'
  43. 43. Usos  frecuentes:  str  % >>> "%s es muy sabio" % "Hycker" 'Hycker es muy sabio' >>> "%s sabe %i idiomas" % ("Hycker", 5) 'Hycker sabe 5 idiomas'
  44. 44. 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 % v 'Hycker sabe 5 idiomas'
  45. 45. Módulos sound/ __init__.py 1. Un  módulo  es  un  fichero  .py formats/ __init__.py wavread.py wavwrite.py 2. Los  módulos  pueden   aiffread.py aiffwrite.py auread.py organizarse  en  paquetes. auwrite.py ... effects/ __init__.py 3. Un  paquete  es  una  carpeta   echo.py surround.py reverse.py que  conNene  un  fichero  con   ... filters/ __init__.py nombre  __init__.py equalizer.py vocoder.py karaoke.py ...
  46. 46. Módulos sound/ 2 __init__.py 1. Un  módulo  es  un  fichero  .py formats/ __init__.py wavread.py wavwrite.py 2. Los  módulos  pueden   1 aiffread.py aiffwrite.py auread.py organizarse  en  paquetes. auwrite.py ... effects/ __init__.py 3 3. Un  paquete  es  una  carpeta   echo.py surround.py reverse.py que  conNene  un  fichero  con   ... filters/ __init__.py nombre  __init__.py equalizer.py vocoder.py karaoke.py ...
  47. 47. Módulos import math ¿Dónde  los  busca  Python? En  la  lista  de  directorios  que  conNene  la  lista  sys.path: 1. El  directorio  actual: ./ 2. El  directorio  site-packages  de  nuestro  Python: /usr/local/lib/python2.6/site-packages 3. Los  directorios  apuntados  por  PYTHONPATH: $ env | grep PYTHONPATH 4. El  directorio  de  la  instalación  de  Python: /usr/lib/python2.6/
  48. 48. Módulos sound/ import sound.effects.echo __init__.py sound.effects.echo.echofilter(...) formats/ __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... effects/ __init__.py echo.py surround.py reverse.py ... filters/ __init__.py equalizer.py vocoder.py karaoke.py ...
  49. 49. Módulos sound/ import sound.effects.echo __init__.py sound.effects.echo.echofilter(...) formats/ __init__.py wavread.py wavwrite.py from sound.effects import echo aiffread.py echo.echofilter(...) aiffwrite.py auread.py auwrite.py ... effects/ __init__.py echo.py surround.py reverse.py ... filters/ __init__.py equalizer.py vocoder.py karaoke.py ...
  50. 50. Módulos sound/ import sound.effects.echo __init__.py sound.effects.echo.echofilter(...) formats/ __init__.py wavread.py wavwrite.py from sound.effects import echo aiffread.py echo.echofilter(...) aiffwrite.py auread.py auwrite.py ... from sound.effects.echo import echofilter effects/ echofilter(...) __init__.py echo.py surround.py reverse.py ... filters/ __init__.py equalizer.py vocoder.py karaoke.py ...
  51. 51. Módulos sound/ import sound.effects.echo __init__.py sound.effects.echo.echofilter(...) formats/ __init__.py wavread.py wavwrite.py from sound.effects import echo aiffread.py echo.echofilter(...) aiffwrite.py auread.py auwrite.py ... from sound.effects.echo import echofilter effects/ echofilter(...) __init__.py echo.py surround.py reverse.py ... from sound.effects.echo import * filters/ echofilter(...) __init__.py equalizer.py vocoder.py karaoke.py ...
  52. 52. Módulos sound/ import sound.effects.echo __init__.py sound.effects.echo.echofilter(...) formats/ __init__.py wavread.py wavwrite.py from sound.effects import echo aiffread.py echo.echofilter(...) aiffwrite.py auread.py auwrite.py ... from sound.effects.echo import echofilter effects/ echofilter(...) __init__.py echo.py surround.py reverse.py ... from sound.effects.echo import * filters/ echofilter(...) __init__.py equalizer.py vocoder.py karaoke.py from sound.effects import echo as rev ... rev.echofilter(...)
  53. 53. Índice 1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  54. 54. Estructuras {}
  55. 55. Estructuras {}
  56. 56. Identación >>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance
  57. 57. Identación >>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance PEP 8 4  Espacios  para  indicar  la  identación
  58. 58. ¿PEP  8? PEP 8 •  Guido  van  Rossum  (2001) •  Recomendaciones  de  esNlo •  “Readability  counts” •  “Code  is  read  much  more  oZen  than  it  is  wrien.” •  Muy  recomendable  importante  seguirlo. hp://www.python.org/dev/peps/pep-­‐0008/
  59. 59. Funciones def my_first_function(p1, p2): return "Hello World!"
  60. 60. Funciones 1 def my_first_function(p1, p2): return "Hello World!"
  61. 61. Funciones 2 1 def my_first_function(p1, p2): return "Hello World!"
  62. 62. Funciones 2 1 def my_first_function(p1, p2): 3 return "Hello World!"
  63. 63. Funciones 2 1 def my_first_function(p1, p2): 3 return "Hello World!" PEP 8 Recomendaciones: •  Minúsculas •  Palabras  separadas  por  _ •  Evitar  camelCase
  64. 64. Conversión  de  /pos +info:  hp://docs.python.org/library/func4ons.html
  65. 65. Conversión  de  /pos >>> int(1.3) 1 +info:  hp://docs.python.org/library/func4ons.html
  66. 66. Conversión  de  /pos >>> int(1.3) 1 >>> str(2) '2' +info:  hp://docs.python.org/library/func4ons.html
  67. 67. Conversión  de  /pos >>> int(1.3) 1 >>> str(2) '2' >>> float(1) 1.0 +info:  hp://docs.python.org/library/func4ons.html
  68. 68. Conversión  de  /pos >>> int(1.3) 1 >>> tuple([1,2,3]) (1, 2, 3) >>> str(2) '2' >>> float(1) 1.0 +info:  hp://docs.python.org/library/func4ons.html
  69. 69. 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 +info:  hp://docs.python.org/library/func4ons.html
  70. 70. Funciones  comunes +info:  hp://docs.python.org/library/func4ons.html
  71. 71. Funciones  comunes >>> len("Python Mola") 11 >>> len([1,2,3,4]) 4 +info:  hp://docs.python.org/library/func4ons.html
  72. 72. 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] +info:  hp://docs.python.org/library/func4ons.html
  73. 73. 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] +info:  hp://docs.python.org/library/func4ons.html
  74. 74. 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... +info:  hp://docs.python.org/library/func4ons.html
  75. 75. Funciones  interesantes Son  sólo  un  ejemplo... +info:  hp://docs.python.org/library/func4ons.html
  76. 76. Funciones  interesantes >>> a = [1,2,3] >>> b = [4,5,6] >>> zip(a,b) [(1, 4), (2, 5), (3, 6)] Son  sólo  un  ejemplo... +info:  hp://docs.python.org/library/func4ons.html
  77. 77. 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... +info:  hp://docs.python.org/library/func4ons.html
  78. 78. 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... +info:  hp://docs.python.org/library/func4ons.html
  79. 79. 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... +info:  hp://docs.python.org/library/func4ons.html
  80. 80. Funciones  de  ayuda
  81. 81. 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']
  82. 82. 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)
  83. 83. Clases class 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)
  84. 84. Clases 1 class 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)
  85. 85. Clases 1 2 class 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)
  86. 86. Clases 1 2 class Student(object): 3 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)
  87. 87. Clases 1 2 class Student(object): 3 def __init__(self, name, age): 4 self.name = name self.age = age def hello(self): return 'My name is %s' % self.name s = Student("Jorge", 24)
  88. 88. Clases 1 2 class 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)
  89. 89. Clases 1 2 class 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 Recomendaciones: •  CamelCase
  90. 90. El  operador  () • Es  importante  diferenciar: funcion      vs      funcion() Clase              vs        Clase() • El  operador  ()  permite: • Invocar  funciones: resultado = funcion() • Instanciar  clases: objeto = Clase("param1")
  91. 91. Índice 1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  92. 92. 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?" }
  93. 93. Sentencias:  while $count = 0; while ($count < 5) { echo "Number ".$count; $count+=1; } count = 0 while count < 5: print "Number %i" % count count+=1
  94. 94. Sentencias:  for for ($i=0; $i < 5; $i++) { echo "Number ".$count; } for i in range(4): print "Number %i" % count
  95. 95. Sentencias:  try-­‐except try { $result = 3 / 0; } catch (Exception $e) { echo "Division by Zero" } try: result = 3 / 0 except: print "Division by Zero"
  96. 96. Conclusiones •  Python  es  un  lenguaje  fácil  de  aprender. •  Menos  código: •  Muchos  Muchísimos  menos  errores  de  Sintaxis. •  Mayor  velocidad  de  escritura. •  ProtoNpado...  UNlizado  por  grandes  empresas.
  97. 97. Conclusiones •  Python  es  un  lenguaje  fácil  de  aprender. •  Menos  código: •  Muchos  Muchísimos  menos  errores  de  Sintaxis. •  Mayor  velocidad  de  escritura. •  ProtoNpado...  UNlizado  por  grandes  empresas. etc...
  98. 98. Ejemplo  &  Ejercicio
  99. 99. Índice 1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  100. 100. Evolución  de  la  Web Desarrollo  Web 1ª  Generación 2ª  Generación 3ª  Generación HTML PHP Django CGI ASP Rails JSP Symfony ... ...
  101. 101. Frameworks  web
  102. 102. Django:  Qué  y  dónde
  103. 103. FilosoXa •  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)
  104. 104. FilosoXa •  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.”
  105. 105. FilosoXa •  Explicit  is  beer  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. hp://docs.djangoproject.com/en/dev/misc/design-­‐philosophies/
  106. 106. La  comunidad
  107. 107. La  comunidad • django-­‐users 18.000  miembros
  108. 108. La  comunidad • django-­‐users 18.000  miembros • django-­‐developers 5.900  miembros
  109. 109. La  comunidad • django-­‐users 18.000  miembros • django-­‐developers 5.900  miembros • djangoproject.com 500.000  visitas  únicas  mensuales
  110. 110. ¿Quién  usa  Django?
  111. 111. ¿Quién  usa  Django? etc...
  112. 112. 1.  Instalación  Python $ sudo apt-get install python http://www.python.org/download/ Snow  Leopard  incluye  las  versiones  2.5.4  y  2.6.1
  113. 113. 2.  Instalación  SGBD Configurar  un  motor  de  Base  de  Datos: •  Oficiales:   •  Comunidad:   •  PostgreSQL •  Sybase  SQL  Anywhere •  MySQL •  IBM  DB2 •  MicrosoZ  SQL  Server  2005 •  Oracle •  Firebird •  SQLite •  ODBC
  114. 114. 2.  Instalación  SGBD Configurar  un  motor  de  Base  de  Datos: •  Oficiales:   •  Comunidad:   •  PostgreSQL •  Sybase  SQL  Anywhere •  MySQL •  IBM  DB2 •  MicrosoZ  SQL  Server  2005 •  Oracle •  Firebird •  SQLite •  ODBC
  115. 115. 2.  Instalación  SGBD •  Vamos  a  uNlizar  SQLite  por  comodidad •  Desde  Python  2.5  podemos  uNlizar  sqlite    sin  instalar  nada.
  116. 116. 2.  Instalación  SGBD •  Vamos  a  uNlizar  SQLite  por  comodidad •  Desde  Python  2.5  podemos  uNlizar  sqlite    sin  instalar  nada.
  117. 117. 3.  Instalación  Django A:  Paquetes  de  cada  distro • apt-get install python-django B:  Official  Release • hp://www.djangoproject.com/download/ • python setup.py install C:  Trunk • hp://code.djangoproject.com/svn/django/trunk/
  118. 118. All  Right?
  119. 119. All  Right? >>> import django >>> django.VERSION (1, 1, 0, 'final', 0) >>> import django Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named django
  120. 120. Bienvenidos  al  mundo  de  Oz
  121. 121. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? *  Incluida  la  carpeta  del  proyecto
  122. 122. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Ficheros Carpetas *  Incluida  la  carpeta  del  proyecto
  123. 123. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails Symfony Ficheros 149 117 Carpetas 35 29 *  Incluida  la  carpeta  del  proyecto
  124. 124. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails Symfony Ficheros 149 117 Carpetas 35 29 *  Incluida  la  carpeta  del  proyecto
  125. 125. Ficheros  y  Carpetas ¿Es  Django  tán  simple  y  fácil  de  usar? Rails Symfony Django Ficheros 149 117 4 Carpetas 35 29 1 *  Incluida  la  carpeta  del  proyecto
  126. 126. Let’s  enjoy
  127. 127. Crear  nuestro  proyecto de  4  ficheros  ;-­‐)
  128. 128. Crear  nuestro  proyecto de  4  ficheros  ;-­‐) $ django-admin.py startproject dwitter
  129. 129. Crear  nuestro  proyecto de  4  ficheros  ;-­‐) $ django-admin.py startproject dwitter __init__.py manage.py settings.py urls.py
  130. 130. Crear  nuestro  proyecto de  4  ficheros  ;-­‐) $ django-admin.py startproject dwitter __init__.py manage.py settings.py urls.py -­‐  ¿Esto  es  un  proyecto...  ?      Si  os  ve  mi  jefe...
  131. 131. Crear  nuestro  proyecto de  4  ficheros  ;-­‐) $ django-admin.py startproject dwitter __init__.py manage.py settings.py urls.py -­‐  ¿Esto  es  un  proyecto...  ?      Si  os  ve  mi  jefe... -­‐  Sí,  disponemos  de  un  proyecto  ‘funcional’  en  django.
  132. 132. senngs.py
  133. 133. Arrancar  nuestro  proyecto de  4  ficheros  ;-­‐)
  134. 134. Arrancar  nuestro  proyecto de  4  ficheros  ;-­‐) $ cd dwitter $ python manage.py runserver Validating models... 0 errors found Django version 1.1, using settings 'dwitter.settings' Development server is running at http:// 127.0.0.1:8000/ Quit the server with CONTROL-C.
  135. 135. Arrancar  nuestro  proyecto de  4  ficheros  ;-­‐) $ cd dwitter $ python manage.py runserver Validating models... 0 errors found Django version 1.1, using settings 'dwitter.settings' Development server is running at http:// 127.0.0.1:8000/ Quit the server with CONTROL-C.
  136. 136. Índice 1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  137. 137. MVC  en  Django Modelo  =  Model Vista  =  Template Controlador  =  URL+View
  138. 138. URLs  y  Vistas • El  fichero  urls.py  actúa  como  puerta  de  entrada  para  las   pe4ciones  HTTP • Se  definen  URLs  elegantes  mediante  expresiones  regulares   que  redirigen  a  funciones  de  views.py hp://mysite.com/about/ urls.py ¿urlpaerns? html views.py ...
  139. 139. URLs  y  Vistas • La  función  de  views.py  recibe  como  parámetros  un  objeto   HhpRequest  y  todos  los  parámetros  de  la  URL  capturados,   teniendo  que  devolver  siempre  un  objeto  HhpResponse HhpRequest(),  ... views.py HhpResponse()
  140. 140. 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('', (r'^time/$', hora_actual), ) from django.http import HttpResponse from datetime import datetime views.py def hora_actual(request): now = datetime.now() html = "Son las %s." % now return HttpResponse(html)
  141. 141. 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('', (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)
  142. 142. 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('', (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)
  143. 143. ¡Recuerda!:  MVC
  144. 144. Índice 1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  145. 145. Templates • Separan  la  lógica  de  presentación  a  una  capa  independiente. • Ficheros  independientes  (.html) • Lenguaje  independiente  (¡para  diseñadores!)
  146. 146. Templates • Se  basan  en  dos  4pos  de  objetos:  Template()  y  Context(). • Un  objeto  Template()  con4ene  el  string  de  salida  que   queremos  devolver  en  el  HpResponse  (normalmente   HTML),  pero  incluyendo  e4quetas  especiales  de  Django. • Un  objeto  Context()  con4ene  un  diccionario  con  los   valores  que  dan  contexto  a  una  plan4lla,  los  que  deben   usarse  para  renderizar  un  objeto  Template(). Template: "Bienvenido, {{ user }}." "Bienvenido, alatar." Context: {'user': 'alatar'}
  147. 147. Templates • Primera  aproximación  al  obje4vo:  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)
  148. 148. Templates • Segunda  aproximación  al  obje4vo:  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)
  149. 149. Templates • Segunda  aproximación  al  obje4vo:  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)
  150. 150. Templates • Segunda  aproximación  al  obje4vo:  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)
  151. 151. Templates • Tercera  aproximación  al  obje4vo:  get_template() TEMPLATE_DIRS = ( sezngs.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)
  152. 152. Templates • Tercera  aproximación  al  obje4vo:  get_template() TEMPLATE_DIRS = ( sezngs.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)
  153. 153. Templates • Tercera  aproximación  al  obje4vo:  get_template() TEMPLATE_DIRS = ( sezngs.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): S4ll   now = datetime.now() t = get_template('hora.html') c = Context({'hora': now}) html = t.render(c) boring... return HttpResponse(html)
  154. 154. Templates • Obje4vo  alcanzado:  render_to_response() from django.shortcuts import render_to_response from datetime import datetime def hora_actual(request): now = datetime.now() return render_to_response('hora.html', {'hora': now})
  155. 155. Templates • Obje4vo  alcanzado:  render_to_response() from django.shortcuts import render_to_response from datetime import datetime def hora_actual(request): now = datetime.now() return render_to_response('hora.html', {'hora': now}) Bori ng...?
  156. 156. Templates • Obje4vo  alcanzado:  render_to_response() from django.shortcuts import render_to_response from datetime import datetime def hora_actual(request): now = datetime.now() return render_to_response('hora.html', {'hora': now}) AWESOME!
  157. 157. Templates:  Tip TEMPLATE_DIRS = ( a) sezngs.py '/home/django/templates', )
  158. 158. Templates:  Tip TEMPLATE_DIRS = ( Reusa ble   a) sezngs.py '/home/django/templates', ) apps?
  159. 159. Templates:  Tip TEMPLATE_DIRS = ( Reusa ble   a) sezngs.py '/home/django/templates', ) apps? b) Alterna4va  reu4lizable: TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.load_template_source', 'django.template.loaders.app_directories.load_template_source', ) • La  carpeta  /templates  es  buscada  dentro  de  cada  app. • Conviene  incluir  una  carpeta  con  el  nombre  de  la  app  por  claridad. return render_to_response('website/index.html')
  160. 160. a) Crear  la  app  dwier.website. b) Incluir  la  app  en  senngs.py. c) Definir  URLs  en  urls.py: ‣ user/<username>/status/<tweet_id>/ ‣ user/<username>/follow/ ‣ user/<username>/unfollow/ ‣ user/<username>/ ‣ search/ ‣ users/ d) Crear  una  vista  para  “/”  que  renderice   un  Nmeline  de  twier  en  una  template   index.html  a  parNr  de  datos   hardcodeados  en  un  diccionario. ¡Empieza  nuestro  primer  proyecto!
  161. 161. 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
  162. 162. FilosoXa  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.
  163. 163. Templates:  {{}} <html> <head>Ejemplo templates</head> <body> Hola, {{ username }}. </body> </html> {'username': 'juan'} <html> <head>Ejemplo templates</head> <body> Hola, juan. </body> </html>
  164. 164. Filters  y  Tags
  165. 165. Filters  y  Tags
  166. 166. Filters  y  Tags filter {{ varible|filter }}
  167. 167. Filters  y  Tags filter {{ varible|filter }} inline  tag {% tag var1 var2 %}
  168. 168. Filters  y  Tags filter {{ varible|filter }} inline  tag {% tag var1 var2 %} block  tag {% tag var1 %} ... {% endtag %}
  169. 169. Templates:  tags  {%  %}
  170. 170. Templates:  tags  {%  %} comment {% comment %} Bu! {% endcomment %}
  171. 171. Templates:  tags  {%  %} comment {% comment %} Bu! {% endcomment %} for {% for elemento in lista %} <li>{{ elemento }}<li> {% endfor %}
  172. 172. 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 %}
  173. 173. Tarea  1:  Tags a) UNlizar  tags  para  que  el  Nmeline  se   muestre  con  el  siguiente  formato: • <username>:  <tweet> • <username>:  <tweet> • ...  
  174. 174. 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>
  175. 175. Templates:  Filters
  176. 176. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12
  177. 177. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo
  178. 178. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majo
  179. 179. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majo wordcount {{ username|wordcount }} 3
  180. 180. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majo wordcount {{ username|wordcount }} 3 upper {{ username|upper }} JUAN ES MAJO
  181. 181. Templates:  Filters {'username': 'Juan es majo'} length {{ username|length }} 12 cut {{ username|cut }} Juanesmajo slugify {{ username|slugify }} juan-es-majo wordcount {{ username|wordcount }} 3 upper {{ username|upper }} JUAN ES MAJO {'username': None} default {{ username|default:”Desconocido” }} Desconocido
  182. 182. Templates:  Filters
  183. 183. Templates:  Filters {'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'} striptags {{ username|striptags }} Juan es majo guapo y listo
  184. 184. Templates:  Filters {'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'} striptags {{ username|striptags }} Juan es majo guapo y listo truncatewords_html {{ username|truncatewords_html:4 }} Juan es <b>majo guapo</b> ...
  185. 185. Templates:  Filters {'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'} striptags {{ username|striptags }} Juan es majo guapo y listo truncatewords_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>
  186. 186. Templates:  Filters
  187. 187. Templates:  Filters {'url': 'Visitad http://www.djangoproject.com'} urlize {{ url|urlize }} Visitad <a href=”http://www.djangoproject.com”> http://www.djangoproject.com </a>
  188. 188. Templates:  Filters {'url': 'Visitad http://www.djangoproject.com'} urlize {{ url|urlize }} Visitad <a href=”http://www.djangoproject.com”> http://www.djangoproject.com </a> urlizetrunc {{ url|urlizetrunc:16 }} Visitad <a href=”http://www.djangoproject.com”> http://www.djang...</a>
  189. 189. Templates:  Filters {'lista': ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]}
  190. 190. Templates:  Filters {'lista': ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]} unordered_list {{ lista|unordered_list }} <li>States <ul> <li>Kansas <ul> <li>Lawrence</li> <li>Topeka</li> </ul> </li> <li>Illinois</li> </ul> </li>
  191. 191. Templates:  Filters
  192. 192. Templates:  Filters {'value': 123456789} add {{ value|add:”1” }} 123456790
  193. 193. Templates:  Filters {'value': 123456789} add {{ value|add:”1” }} 123456790 filesizeformat {{ value|filesizeformat }} 117.7MB
  194. 194. Templates:  Filters {'value': 123456789} add {{ value|add:”1” }} 123456790 filesizeformat {{ value|filesizeformat }} 117.7MB {'date': datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) } date {{ date|date:”d M Y” }} 11 Sep 2010
  195. 195. Templates:  Filters {'value': 123456789} add {{ value|add:”1” }} 123456790 filesizeformat {{ 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
  196. 196. Templates:  Filters {'value': 123456789} add {{ value|add:”1” }} 123456790 filesizeformat {{ 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
  197. 197. Tarea  2:  Filters a) Añadir  a  cada  tweet  del  Nmeline  el   Nempo  transcurrido: • <username>:  <tweet> <n>  seconds  ago • <username>:  <tweet> <n>  minutes  ago • ...  
  198. 198. Templates:  tags  {%  %}
  199. 199. Templates:  tags  {%  %} cycle {% for elemento in lista %} <li class="{% cycle 'rojo' 'azul' %}">{{ elemento }}<li> {% endfor %}
  200. 200. Templates:  tags  {%  %} cycle {% for elemento in lista %} <li class="{% cycle 'rojo' 'azul' %}">{{ elemento }}<li> {% endfor %} include {% include "foo/bar.html" %}
  201. 201. 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 %}
  202. 202. 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 %}
  203. 203. Tarea  3:  Tags  avanzados a) Hacer  que  el  Nmeline  muestre  el   mensaje  “No  hay  tweets.”  si  el   diccionario  recibido  está  vacío.  
  204. 204. extend  y  block base.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 %}
  205. 205. Tarea  4:  Herencia  de  templates a) Descargar  nuestra  template  base.html. b) Incluirla  en  vuestra  app. c) Hacer  que  vuestro  index.html  herede   de  base.html  y  exNenda  el  bloque   ‘content’  con  su  contenido.  
  206. 206. Índice 1. Python 2. Django a. Introducción a. Introducción b. Tipos  de  datos b. URLs  y  Vistas c. Operadores c. Templates Proyecto d. Usos  frecuentes d. Modelo e. Estructuras e. Administración f. Sentencias f. Formularios g. Ejercicio g. Magia  avanzada
  207. 207. Modelos
  208. 208. ¿SQL?
  209. 209. Ejemplo  SQL def 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})
  210. 210. Ejemplo  SQL def book_list(request): try: 1 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})
  211. 211. Ejemplo  SQL def book_list(request): try: 1 2 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})
  212. 212. Ejemplo  SQL def 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') 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})
  213. 213. Ejemplo  SQL def 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() names.append(row[0]) db.close() except: return render_to_response('500.html') return render_to_response('book_list.html', {'names':names})
  214. 214. Ejemplo  SQL def 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') return render_to_response('book_list.html', {'names':names})
  215. 215. Ejemplo  SQL def 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})
  216. 216. 12  lineas  de  Python...  ¬_¬
  217. 217. ORM  (Object-­‐RelaNonal  mapping)
  218. 218. ORM  (Object-­‐RelaNonal  mapping)
  219. 219. Ejemplo  ORM def book_list(request): names = Books.objects.all().order_by('name') return render_to_response('book_list.html', {'names':names})
  220. 220. Ejemplo  ORM def book_list(request): 1 names = Books.objects.all().order_by('name') return render_to_response('book_list.html', {'names':names})
  221. 221. Ejemplo  ORM def book_list(request): 1 names = Books.objects.all().order_by('name') 2 return render_to_response('book_list.html', {'names':names})
  222. 222. Fucking  Ninjas!
  223. 223. 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)  
  224. 224. Modelo from django.db import models 1 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)  
  225. 225. Modelo from django.db import models 1 2 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)  
  226. 226. Modelo from django.db import models 1 3 2 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)  
  227. 227. Modelo from django.db import models 1 3 2 class Books(models.Model): name = models.CharField(blank=True, max_length=100) 4 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)  
  228. 228. Modelo from django.db import models 1 3 2 class Books(models.Model): name = models.CharField(blank=True, max_length=100) 4 created = models.DateTimeField(blank=False) 5 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)  
  229. 229. Modelo from django.db import models 1 3 2 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)  
  230. 230. Fucking  Awesome  Ninjas!
  231. 231. 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
  232. 232. 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
  233. 233. 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)
  234. 234. 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)
  235. 235. ¿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;
  236. 236. ¿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;
  237. 237. ¿Es  magia?  No. •  Nombres  de  tablas  generados  automáNcamente. •  <app_name>_lower(<model_name>) •  id  como  Primary  Key  (Personalizable) •  Las  Foreing  Key  terminan  en  _id  (Personalizable) •  Los  Npos  de  datos  se  ajustan  en  función  del  SGBD
  238. 238. Configurar  sesngs.py DATABASE_ENGINE = 'sqlite3' DATABASE_NAME = 'db.sqlite' DATABASE_USER = '' DATABASE_PASSWORD = '' DATABASE_HOST = '' DATABASE_PORT = ''
  239. 239. Configurar  sesngs.py DATABASE_ENGINE = 'sqlite3' 1 DATABASE_NAME = 'db.sqlite' DATABASE_USER = '' DATABASE_PASSWORD = '' DATABASE_HOST = '' DATABASE_PORT = ''
  240. 240. Configurar  sesngs.py DATABASE_ENGINE = 'sqlite3' 1 DATABASE_NAME = 'db.sqlite' 2 DATABASE_USER = '' DATABASE_PASSWORD = '' DATABASE_HOST = '' DATABASE_PORT = ''
  241. 241. Configurar  sesngs.py DATABASE_ENGINE = 'sqlite3' 1 DATABASE_NAME = 'db.sqlite' 2 DATABASE_USER = '' DATABASE_PASSWORD = '' 3 DATABASE_HOST = '' DATABASE_PORT = ''
  242. 242. Creando  Tablas •  Crea  las  tablas  para  todos  los  modelos  de  las  apps  instaladas   en  el  fichero  senngs.py •  No  actualiza  esquemas  si  la  tabla  existe. •  Eliminar  tabla  y  volver  a  ejecutar  syncdb
  243. 243. Creando  Tablas $ python manage.py syncdb •  Crea  las  tablas  para  todos  los  modelos  de  las  apps  instaladas   en  el  fichero  senngs.py •  No  actualiza  esquemas  si  la  tabla  existe. •  Eliminar  tabla  y  volver  a  ejecutar  syncdb
  244. 244. a) Crear  modelo  Tweet b)Configurar  senngs.py c) Ver  el  SQL  generado  con  sqlall Nuestro  primer  modelo
  245. 245. syncdb $ python manage.py syncdb Creating table auth_permission Creating table auth_group Creating table auth_user Creating table auth_message Creating table django_content_type Creating table django_session Creating table django_site Creating table website_tweet You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'neo'): admin E-mail address: user@example.com Password: Password (again): Superuser created successfully. Installing index for auth.Permission model Installing index for auth.Message model Installing index for website.Tweet model
  246. 246. syncdb $ python manage.py syncdb Creating table auth_permission Creating table auth_group Creating table auth_user django.contrib.auth Creating table auth_message Creating table django_content_type Creating table django_session Creating table django_site Creating table website_tweet You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'neo'): admin E-mail address: user@example.com Password: Password (again): Superuser created successfully. Installing index for auth.Permission model Installing index for auth.Message model Installing index for website.Tweet model
  247. 247. ¿Cuantos  sistemas  de  AutenNcación  habéis  programado?
  248. 248. ¿Alguno  era  mejor  que  el  anterior?  ;-­‐)
  249. 249. contrib.auth  puede  ser  el  úlNmo  :D
  250. 250. syncdb $ python manage.py syncdb Creating table auth_permission Creating table auth_group Creating table auth_user Creating table auth_message Creating table django_content_type Creating table django_session Creating table django_site Creating table website_tweet website.tweet You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'neo'): admin E-mail address: user@example.com Password: Password (again): Superuser created successfully. Installing index for auth.Permission model Installing index for auth.Message model Installing index for website.Tweet model
  251. 251. syncdb $ python manage.py syncdb Creating table auth_permission Creating table auth_group Creating table auth_user Creating table auth_message Creating table django_content_type Creating table django_session Creating table django_site Creating table website_tweet You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'neo'): admin django.contrib.auth E-mail address: user@example.com Password: Password (again): Superuser created successfully. Installing index for auth.Permission model Installing index for auth.Message model Installing index for website.Tweet model
  252. 252. BD  Lista  para  usarse
  253. 253. BD  Lista  para  usarse
  254. 254. a) Hacer  syncdb Nuestro  primer  modelo
  255. 255. Previo:  Clases  del  ORM ts = Publisher.objects.all() Model Manager QuerySet
  256. 256. Previo:  __unicode__()
  257. 257. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>]
  258. 258. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>]
  259. 259. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>]
  260. 260. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>] class Publisher(models.Model): ... def __unicode__(self): return self.name
  261. 261. Previo:  __unicode__() >>> Publisher.objects.all() [<Publisher: Publisher object>] class Publisher(models.Model): ... def __unicode__(self): return self.name >>> Publisher.objects.all() [<Publisher: Apress>]
  262. 262. INSERT
  263. 263. 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()
  264. 264. 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='O'Reilly', ... address='10 Fawcett St.', ... city='Cambridge', ... state_province='MA', ... country='U.S.A.', ... website='http://www.oreilly.com/')
  265. 265. UPDATE
  266. 266. UPDATE o.save() >>> ... >>> p.id 1 52 >>> p.name = 'Apress Publishing' >>> p.save()
  267. 267. UPDATE o.save() >>> ... >>> p.id 1 52 >>> p.name = 'Apress Publishing' >>> p.save() queryset.update(...) n >>> Publisher.objects.all().update(country='USA') 2
  268. 268. DELETE
  269. 269. DELETE o.delete() >>> ... >>> p.id 1 52 >>> p.delete()
  270. 270. DELETE o.delete() >>> ... >>> p.id 1 52 >>> p.delete() queryset.delete() >>> ps = Publisher.objects.all() n >>> ps.delete()
  271. 271. SELECT  de  1  resultado
  272. 272. SELECT  de  1  resultado .get(...) >>> Publisher.objects.get(name="Apress") <Publisher: Apress>
  273. 273. 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.
  274. 274. 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.'}
  275. 275. SELECT  de  N  resultados
  276. 276. SELECT  de  N  resultados .all() >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: O'Reilly>]
  277. 277. SELECT  de  N  resultados .all() >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: O'Reilly>] .filter(...) >>> Publisher.objects.filter( country="U.S.A.", state_province="CA") [<Publisher: Apress>]
  278. 278. SELECT  de  N  resultados .all() >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: O'Reilly>] .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: O'Reilly>]
  279. 279. SELECT  de  N  resultadosen   evuelv ¡D s,  no   .all() uery Set Q li stas! >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: O'Reilly>] .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: O'Reilly>]
  280. 280. get(),  filter()  y  exclude()
  281. 281. get(),  filter()  y  exclude() Modelo.objects.filter(campo1="valor1", campo2="valor2") Los  parámetros  pueden  indicar  mucho  más  que  igualdad  (=)
  282. 282. 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
  283. 283. ORDER  BY
  284. 284. ORDER  BY .order_by(...) >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: O'Reilly>]
  285. 285. ORDER  BY .order_by(...) >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: O'Reilly>] >>> Publisher.objects.order_by("-name") [<Publisher: O'Reilly>, <Publisher: Apress>]
  286. 286. ORDER  BY .order_by(...) >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: O'Reilly>] >>> Publisher.objects.order_by("-name") [<Publisher: O'Reilly>, <Publisher: Apress>] MúlNples  campos: >>> Publisher.objects.order_by("-name", "country") [<Publisher: O'Reilly>, <Publisher: Apress>]
  287. 287. ORDER  BY ¡También   devu elve   .order_by(...) uer y Sets! Q >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: O'Reilly>] >>> Publisher.objects.order_by("-name") [<Publisher: O'Reilly>, <Publisher: Apress>] MúlNples  campos: >>> Publisher.objects.order_by("-name", "country") [<Publisher: O'Reilly>, <Publisher: Apress>]
  288. 288. Slicing
  289. 289. Slicing [n:m] >>> Publisher.objects.order_by("name")[0] <Publisher: Apress> >>> Publisher.objects.order_by("name")[:2] [<Publisher: Apress>, <Publisher: O'Reilly>] >>> Publisher.objects.order_by("name")[1:2] [<Publisher: O'Reilly>]
  1. A particular slide catching your eye?

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

×