Django: Disfruta programando.
-
Upload
jorge-bastida -
Category
Technology
-
view
11.987 -
download
1
description
Transcript of Django: Disfruta programando.
![Page 1: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/1.jpg)
Disfruta programando.
Jorge Bas4da [neo][email protected]
Jaime Irurzun [etox] [email protected]
@jorgebas4da @jaimeirurzun
![Page 2: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/2.jpg)
![Page 3: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/3.jpg)
Disfruta programando.
![Page 4: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/4.jpg)
![Page 5: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/5.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 6: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/6.jpg)
![Page 7: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/7.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 8: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/8.jpg)
• Legible
• Produc/vo
• Portable
• Extenso
• Integrable
• ... y Diver/do
Sintaxis intui4va y estricta
Entre 1/3 y 1/5 más conciso que Java o C++
GNU/Linux, Windows, Mac OS X, ...
Standard Library, Third par4es
C, C++, Java, .NET, COM, WS, CORBA, ...
![Page 9: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/9.jpg)
Instalación
$ sudo apt-get install python
http://www.python.org/download/
Snow Leopard incluye las versiones 2.5.4 y 2.6.1
![Page 10: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/10.jpg)
El Intérprete
![Page 11: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/11.jpg)
El Intérprete
$ python holamundo.py hola mundo!$
Modo Batch
#!/usr/bin/env pythonprint "hola mundo!"
holamundo.py
![Page 12: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/12.jpg)
El Intérprete
$ pythonPython 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) [GCC 4.4.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> print "hola mundo!"hola mundo!
Modo Interac4vo
$ python holamundo.py hola mundo!$
Modo Batch
#!/usr/bin/env pythonprint "hola mundo!"
holamundo.py
![Page 13: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/13.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 14: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/14.jpg)
Tipos de datos
+ info: h\p://docs.python.org/library/stdtypes.html
object
![Page 15: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/15.jpg)
Tipos de datos
+ info: h\p://docs.python.org/library/stdtypes.html
object
1234 3.1415int float35Llong
![Page 16: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/16.jpg)
Tipos de datos
+ info: h\p://docs.python.org/library/stdtypes.html
object
1234 3.1415int float35Llong
True Falsebool
![Page 17: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/17.jpg)
Tipos de datos
+ info: h\p://docs.python.org/library/stdtypes.html
object
1234 3.1415int float35Llong
True Falsebool
'spam' "guido's" """n lines"""str
![Page 18: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/18.jpg)
Tipos de datos
+ info: h\p://docs.python.org/library/stdtypes.html
object
1234 3.1415int float35Llong
True Falsebool
'spam' "guido's" """n lines"""str
[1, [2, 'three'], 4]list
![Page 19: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/19.jpg)
Tipos de datos
+ info: h\p://docs.python.org/library/stdtypes.html
object
1234 3.1415int float35Llong
True Falsebool
'spam' "guido's" """n lines"""str
[1, [2, 'three'], 4]list
{'food': 'spam', 'taste': 'yum'}dict
![Page 20: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/20.jpg)
Tipos de datos
+ info: h\p://docs.python.org/library/stdtypes.html
object
1234 3.1415int float35Llong
True Falsebool
'spam' "guido's" """n lines"""str
[1, [2, 'three'], 4]list
{'food': 'spam', 'taste': 'yum'}dict
(1, 'spam', 4, 'U')tuple
![Page 21: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/21.jpg)
Tipos de datos
+ info: h\p://docs.python.org/library/stdtypes.html
object
1234 3.1415int float35Llong
True Falsebool
'spam' "guido's" """n lines"""str
[1, [2, 'three'], 4]list
{'food': 'spam', 'taste': 'yum'}dict
(1, 'spam', 4, 'U')tuple
¡Tipado
dinámico!
![Page 22: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/22.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 23: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/23.jpg)
Operadores
+ info: h\p://docs.python.org/library/operator.html
![Page 24: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/24.jpg)
Operadores
+ info: h\p://docs.python.org/library/operator.html
numéricosa + b a - b a * b a / b
a % b -a +a a ** b
![Page 25: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/25.jpg)
Operadores
+ info: h\p://docs.python.org/library/operator.html
numéricosa + b a - b a * b a / b
a % b -a +a a ** b
comparadoresa < b a <= b a > b
a >= b a == b a != b
![Page 26: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/26.jpg)
Operadores
+ info: h\p://docs.python.org/library/operator.html
numéricosa + b a - b a * b a / b
a % b -a +a a ** b
comparadoresa < b a <= b a > b
a >= b a == b a != b
lógicos a or b a and b not a
![Page 27: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/27.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 28: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/28.jpg)
Usos frecuentes: list
![Page 29: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/29.jpg)
Usos frecuentes: list>>> nums = [1, 2, 3]>>> nums[0]1
![Page 30: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/30.jpg)
Usos frecuentes: list>>> nums = [1, 2, 3]>>> nums[0]1
>>> 2 in numsTrue
![Page 31: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/31.jpg)
Usos frecuentes: list>>> nums = [1, 2, 3]>>> nums[0]1
>>> nums.append(4)>>> print nums[1, 2, 3, 4]
>>> 2 in numsTrue
![Page 32: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/32.jpg)
Usos frecuentes: list>>> nums = [1, 2, 3]>>> nums[0]1
>>> nums.append(4)>>> print nums[1, 2, 3, 4]
>>> 2 in numsTrue
>>> nums.count()4
![Page 33: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/33.jpg)
Usos frecuentes: str
![Page 34: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/34.jpg)
Usos frecuentes: str>>> "Python mola"[1:4]'yth'
![Page 35: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/35.jpg)
Usos frecuentes: str>>> "Python mola"[1:4]'yth'
>>> "Python mola".find("mola")7
![Page 36: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/36.jpg)
Usos frecuentes: str>>> "Python mola"[1:4]'yth'
>>> "Python mola".find("mola")7
>>> "Python mola".replace("Python", "PHP no")'PHP no mola'
![Page 37: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/37.jpg)
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']
![Page 38: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/38.jpg)
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"
![Page 39: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/39.jpg)
Usos frecuentes: dict
![Page 40: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/40.jpg)
Usos frecuentes: dict>>> user = {'nick': 'neo', 'age': 24}>>> user.keys()['nick', 'age']>>> user.values()['neo', 24]
![Page 41: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/41.jpg)
Usos frecuentes: dict>>> user = {'nick': 'neo', 'age': 24}>>> user.keys()['nick', 'age']>>> user.values()['neo', 24]
>>> user['age']24
>>> user.get('age', 20)24
![Page 42: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/42.jpg)
Usos frecuentes: dict>>> user = {'nick': 'neo', 'age': 24}>>> user.keys()['nick', 'age']>>> user.values()['neo', 24]
>>> user['age']24
>>> user.get('age', 20)24
>>> user.has_key('nick')True
![Page 43: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/43.jpg)
Usos frecuentes: dict>>> user = {'nick': 'neo', 'age': 24}>>> user.keys()['nick', 'age']>>> user.values()['neo', 24]
>>> user['age']24
>>> user.get('age', 20)24
>>> user.has_key('nick')True
>>> user.update({'nick': 'alatar', 'age': 25})>>> user{'nick': 'alatar', 'age': 25}
![Page 44: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/44.jpg)
Usos frecuentes: str %
![Page 45: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/45.jpg)
Usos frecuentes: str %
>>> "%s es muy sabio" % "Hycker"'Hycker es muy sabio'
![Page 46: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/46.jpg)
Usos frecuentes: str %
>>> "%s es muy sabio" % "Hycker"'Hycker es muy sabio'
>>> "%s sabe %i idiomas" % ("Hycker", 5)'Hycker sabe 5 idiomas'
![Page 47: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/47.jpg)
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'
![Page 48: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/48.jpg)
sound/ __init__.py 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 ...
Módulos1. Un módulo es un fichero .py
2. Los módulos pueden
organizarse en paquetes.
3. Un paquete es una carpeta
que conNene un fichero con
nombre __init__.py
![Page 49: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/49.jpg)
sound/ __init__.py 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 ...
Módulos1. Un módulo es un fichero .py
2. Los módulos pueden
organizarse en paquetes.
3. Un paquete es una carpeta
que conNene un fichero con
nombre __init__.py
1
2
3
![Page 50: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/50.jpg)
Módulos
En la lista de directorios que conNene la lista sys.path:
import math ¿Dónde los busca Python?
1. El directorio actual:
2. El directorio site-packages de nuestro Python:
3. Los directorios apuntados por PYTHONPATH:
4. El directorio de la instalación de Python:
./
/usr/local/lib/python2.6/site-packages
/usr/lib/python2.6/
$ env | grep PYTHONPATH
![Page 51: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/51.jpg)
Módulossound/ __init__.py 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 ...
import sound.effects.echosound.effects.echo.echofilter(...)
![Page 52: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/52.jpg)
Módulossound/ __init__.py 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 ...
import sound.effects.echosound.effects.echo.echofilter(...)
from sound.effects import echoecho.echofilter(...)
![Page 53: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/53.jpg)
Módulossound/ __init__.py 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 ...
import sound.effects.echosound.effects.echo.echofilter(...)
from sound.effects import echoecho.echofilter(...)
from sound.effects.echo import echofilterechofilter(...)
![Page 54: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/54.jpg)
Módulossound/ __init__.py 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 ...
import sound.effects.echosound.effects.echo.echofilter(...)
from sound.effects import echoecho.echofilter(...)
from sound.effects.echo import echofilterechofilter(...)
from sound.effects.echo import *echofilter(...)
![Page 55: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/55.jpg)
Módulossound/ __init__.py 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 ...
import sound.effects.echosound.effects.echo.echofilter(...)
from sound.effects import echoecho.echofilter(...)
from sound.effects.echo import echofilterechofilter(...)
from sound.effects.echo import *echofilter(...)
from sound.effects import echo as revrev.echofilter(...)
![Page 56: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/56.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 57: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/57.jpg)
{}Estructuras
![Page 58: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/58.jpg)
{}Estructuras
![Page 59: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/59.jpg)
>>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance
Identación
![Page 60: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/60.jpg)
>>> from __future__ import braces File "<stdin>", line 1 SyntaxError: not a chance
4 Espacios para indicar la identaciónPEP 8
Identación
![Page 61: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/61.jpg)
h\p://www.python.org/dev/peps/pep-‐0008/
• Guido van Rossum (2001)
• Recomendaciones de esNlo
• “Readability counts”
• “Code is read much more oZen than it is wri\en.”
• Muy recomendable importante seguirlo.
PEP 8¿PEP 8?
![Page 62: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/62.jpg)
def my_first_function(p1, p2): return "Hello World!"
Funciones
![Page 63: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/63.jpg)
def my_first_function(p1, p2): return "Hello World!"
1
Funciones
![Page 64: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/64.jpg)
def my_first_function(p1, p2): return "Hello World!"
12
Funciones
![Page 65: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/65.jpg)
def my_first_function(p1, p2): return "Hello World!"
12
3
Funciones
![Page 66: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/66.jpg)
def my_first_function(p1, p2): return "Hello World!"
Recomendaciones:• Minúsculas• Palabras separadas por _• Evitar camelCase
12
3
PEP 8
Funciones
![Page 67: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/67.jpg)
Conversión de /pos
+info: h\p://docs.python.org/library/func4ons.html
![Page 68: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/68.jpg)
Conversión de /pos
+info: h\p://docs.python.org/library/func4ons.html
>>> int(1.3)1
![Page 69: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/69.jpg)
Conversión de /pos
>>> str(2)'2'
+info: h\p://docs.python.org/library/func4ons.html
>>> int(1.3)1
![Page 70: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/70.jpg)
Conversión de /pos
>>> str(2)'2'
+info: h\p://docs.python.org/library/func4ons.html
>>> int(1.3)1
>>> float(1)1.0
![Page 71: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/71.jpg)
Conversión de /pos
>>> str(2)'2'
+info: h\p://docs.python.org/library/func4ons.html
>>> int(1.3)1
>>> float(1)1.0
>>> tuple([1,2,3])(1, 2, 3)
![Page 72: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/72.jpg)
Conversión de /pos
>>> str(2)'2'
+info: h\p://docs.python.org/library/func4ons.html
>>> int(1.3)1
>>> float(1)1.0
>>> list((1,2,3))[1, 2, 3]
>>> tuple([1,2,3])(1, 2, 3)
![Page 73: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/73.jpg)
Funciones comunes
+info: h\p://docs.python.org/library/func4ons.html
![Page 74: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/74.jpg)
Funciones comunes
>>> len("Python Mola")11>>> len([1,2,3,4])4
+info: h\p://docs.python.org/library/func4ons.html
![Page 75: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/75.jpg)
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: h\p://docs.python.org/library/func4ons.html
![Page 76: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/76.jpg)
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]
>>> type(True)<type 'bool'>>>> type("Python Mola")<type 'str'>
+info: h\p://docs.python.org/library/func4ons.html
![Page 77: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/77.jpg)
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]
>>> sum([0,1,2,3,4])10>>> sum(range(5))10
>>> type(True)<type 'bool'>>>> type("Python Mola")<type 'str'>
Y un muy largo etc...
+info: h\p://docs.python.org/library/func4ons.html
![Page 78: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/78.jpg)
Funciones interesantes
Son sólo un ejemplo...
+info: h\p://docs.python.org/library/func4ons.html
![Page 79: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/79.jpg)
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: h\p://docs.python.org/library/func4ons.html
![Page 80: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/80.jpg)
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: h\p://docs.python.org/library/func4ons.html
![Page 81: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/81.jpg)
Funciones interesantes
>>> a = [1,2,3]>>> b = [4,5,6]>>> zip(a,b)[(1, 4), (2, 5), (3, 6)]
>>> round(1.2345,2)1.23
>>> sorted([5,1,3,4,2])[1, 2, 3, 4, 5]
Son sólo un ejemplo...
+info: h\p://docs.python.org/library/func4ons.html
![Page 82: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/82.jpg)
Funciones interesantes
>>> a = [1,2,3]>>> b = [4,5,6]>>> zip(a,b)[(1, 4), (2, 5), (3, 6)]
>>> round(1.2345,2)1.23
>>> sorted([5,1,3,4,2])[1, 2, 3, 4, 5]
>>> map(str,[1,2,3,4,5])['1', '2', '3', '4', '5']
Son sólo un ejemplo...
+info: h\p://docs.python.org/library/func4ons.html
![Page 83: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/83.jpg)
Funciones de ayuda
![Page 84: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/84.jpg)
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']
![Page 85: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/85.jpg)
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)
![Page 86: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/86.jpg)
class Student(object): def __init__(self, name, age): self.name = name self.age = age def hello(self): return 'My name is %s' % self.name
Clases
s = Student("Jorge", 24)
![Page 87: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/87.jpg)
class Student(object): def __init__(self, name, age): self.name = name self.age = age def hello(self): return 'My name is %s' % self.name
1
Clases
s = Student("Jorge", 24)
![Page 88: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/88.jpg)
class Student(object): def __init__(self, name, age): self.name = name self.age = age def hello(self): return 'My name is %s' % self.name
1 2
Clases
s = Student("Jorge", 24)
![Page 89: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/89.jpg)
class Student(object): def __init__(self, name, age): self.name = name self.age = age def hello(self): return 'My name is %s' % self.name
1 2
3
Clases
s = Student("Jorge", 24)
![Page 90: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/90.jpg)
class Student(object): def __init__(self, name, age): self.name = name self.age = age def hello(self): return 'My name is %s' % self.name
1 2
3
4
Clases
s = Student("Jorge", 24)
![Page 91: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/91.jpg)
class Student(object): def __init__(self, name, age): self.name = name self.age = age def hello(self): return 'My name is %s' % self.name
1 2
3
4
5
Clases
s = Student("Jorge", 24)
![Page 92: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/92.jpg)
class Student(object): def __init__(self, name, age): self.name = name self.age = age def hello(self): return 'My name is %s' % self.name
1 2
3
4
5
Recomendaciones:• CamelCase
PEP 8
Clases
s = Student("Jorge", 24)
![Page 93: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/93.jpg)
El operador ()
• Es importante diferenciar:
funcion vs funcion()
Clase vs Clase()
• El operador () permite:
• Invocar funciones:
• Instanciar clases:
resultado = funcion()
objeto = Clase("param1")
![Page 94: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/94.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 95: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/95.jpg)
$name = "Jon";
if($name == "Jon"){ $name = "Jon Rocks!";}elseif($name == "Mary"){ $name = "Hello Mary";}else{ $name = "Who are you?"}
name = "Jon"
if name == "Jon": name = "Jon Rocks!"elif name == "Mary": name = "Hello Mary"else: name = "Who are you?"
Sentencias: if-‐else
![Page 96: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/96.jpg)
$count = 0;while ($count < 5) { echo "Number ".$count; $count+=1;}
count = 0while count < 5: print "Number %i" % count count+=1
Sentencias: while
![Page 97: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/97.jpg)
for ($i=0; $i < 5; $i++) { echo "Number ".$count;}
for i in range(4): print "Number %i" % count
Sentencias: for
![Page 98: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/98.jpg)
try { $result = 3 / 0;} catch (Exception $e) { echo "Division by Zero"}
try: result = 3 / 0except: print "Division by Zero"
Sentencias: try-‐except
![Page 99: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/99.jpg)
• 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.
Conclusiones
![Page 100: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/100.jpg)
• 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...
Conclusiones
![Page 101: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/101.jpg)
Ejemplo & Ejercicio
![Page 102: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/102.jpg)
![Page 103: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/103.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 104: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/104.jpg)
Evolución de la Web
Desarrollo Web
1ª Generación 2ª Generación 3ª Generación
HTML
CGIPHP
ASP
JSP
...
Django
Rails
Symfony
...
![Page 105: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/105.jpg)
Frameworks web
![Page 106: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/106.jpg)
Django: Qué y dónde
![Page 107: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/107.jpg)
• 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)
FilosoXa
![Page 108: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/108.jpg)
• 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.”“
FilosoXa
![Page 109: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/109.jpg)
• Explicit is be\er than implicit.
• Este es un principio de Python.• Django no debe hacer demasiada “Magia”.
• Si algo es “Mágico” ha de haber una buena razón.
• Consistencia• Ha de ser consistente a todos los niveles.
• Eficiencia, Seguridad, Flexibilidad y Simplicidad.
h\p://docs.djangoproject.com/en/dev/misc/design-‐philosophies/
FilosoXa
![Page 110: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/110.jpg)
La comunidad
![Page 111: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/111.jpg)
La comunidad
• django-‐users
18.000 miembros
![Page 112: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/112.jpg)
La comunidad
• django-‐users
18.000 miembros
• django-‐developers
5.900 miembros
![Page 113: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/113.jpg)
La comunidad
• django-‐users
18.000 miembros
• django-‐developers
5.900 miembros
• djangoproject.com
500.000 visitas únicas mensuales
![Page 114: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/114.jpg)
¿Quién usa Django?
![Page 115: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/115.jpg)
etc...
¿Quién usa Django?
![Page 116: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/116.jpg)
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
![Page 117: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/117.jpg)
Configurar un motor de Base de Datos:
• Oficiales: • PostgreSQL• MySQL
• Oracle• SQLite
• Comunidad:
• Sybase SQL Anywhere• IBM DB2
• MicrosoZ SQL Server 2005
• Firebird• ODBC
2. Instalación SGBD
![Page 118: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/118.jpg)
Configurar un motor de Base de Datos:
• Oficiales: • PostgreSQL• MySQL
• Oracle• SQLite
• Comunidad:
• Sybase SQL Anywhere• IBM DB2
• MicrosoZ SQL Server 2005
• Firebird• ODBC
2. Instalación SGBD
![Page 119: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/119.jpg)
• Vamos a uNlizar SQLite por comodidad
• Desde Python 2.5 podemos uNlizar sqlite sin instalar nada.
2. Instalación SGBD
![Page 120: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/120.jpg)
• Vamos a uNlizar SQLite por comodidad
• Desde Python 2.5 podemos uNlizar sqlite sin instalar nada.
2. Instalación SGBD
![Page 121: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/121.jpg)
A: Paquetes de cada distro
• apt-get install python-django
B: Official Release
• h\p://www.djangoproject.com/download/
• python setup.py install
C: Trunk
• h\p://code.djangoproject.com/svn/django/trunk/
3. Instalación Django
![Page 122: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/122.jpg)
All Right?
![Page 123: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/123.jpg)
All Right?
>>> import django>>> django.VERSION(1, 1, 0, 'final', 0)
>>> import djangoTraceback (most recent call last): File "<stdin>", line 1, in <module>ImportError: No module named django
![Page 124: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/124.jpg)
![Page 125: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/125.jpg)
Bienvenidos al mundo de Oz
![Page 126: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/126.jpg)
* Incluida la carpeta del proyecto
Ficheros y Carpetas¿Es Django tán simple y fácil de usar?
![Page 127: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/127.jpg)
* Incluida la carpeta del proyecto
Ficheros y Carpetas
Ficheros
Carpetas
¿Es Django tán simple y fácil de usar?
![Page 128: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/128.jpg)
Rails Symfony
149 117
35 29
* Incluida la carpeta del proyecto
Ficheros y Carpetas
Ficheros
Carpetas
¿Es Django tán simple y fácil de usar?
![Page 129: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/129.jpg)
Rails Symfony
149 117
35 29
* Incluida la carpeta del proyecto
Ficheros y Carpetas
Ficheros
Carpetas
¿Es Django tán simple y fácil de usar?
![Page 130: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/130.jpg)
Rails Symfony
149 117
35 29
* Incluida la carpeta del proyecto
Ficheros y Carpetas
Django
4
1
Ficheros
Carpetas
¿Es Django tán simple y fácil de usar?
![Page 131: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/131.jpg)
Let’s enjoy
![Page 132: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/132.jpg)
Crear nuestro proyectode 4 ficheros ;-‐)
![Page 133: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/133.jpg)
Crear nuestro proyecto
$ django-admin.py startproject dwitter
de 4 ficheros ;-‐)
![Page 134: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/134.jpg)
Crear nuestro proyecto
$ django-admin.py startproject dwitter
__init__.py
manage.py
settings.py
urls.py
de 4 ficheros ;-‐)
![Page 135: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/135.jpg)
Crear nuestro proyecto
$ django-admin.py startproject dwitter
-‐ ¿Esto es un proyecto... ? Si os ve mi jefe...
__init__.py
manage.py
settings.py
urls.py
de 4 ficheros ;-‐)
![Page 136: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/136.jpg)
Crear nuestro proyecto
$ django-admin.py startproject dwitter
-‐ ¿Esto es un proyecto... ? Si os ve mi jefe...
__init__.py
manage.py
settings.py
urls.py
-‐ Sí, disponemos de un proyecto ‘funcional’ en django.
de 4 ficheros ;-‐)
![Page 137: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/137.jpg)
senngs.py
![Page 138: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/138.jpg)
Arrancar nuestro proyectode 4 ficheros ;-‐)
![Page 139: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/139.jpg)
Arrancar nuestro proyectode 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.
![Page 140: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/140.jpg)
Arrancar nuestro proyectode 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.
![Page 141: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/141.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 142: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/142.jpg)
MVC en Django
Modelo = Model Vista = Template Controlador = URL+View
![Page 143: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/143.jpg)
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
urls.py
views.py
h\p://mysite.com/about/
html ...
¿urlpa\erns?
![Page 144: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/144.jpg)
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
views.py
HhpRequest(), ...
HhpResponse()
![Page 145: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/145.jpg)
URLs y VistasEjemplo 1: http://mysite.com/time
from django.conf.urls.defaults import *from mysite.views import hora_actual
urlpatterns = patterns('', (r'^time/$', hora_actual),)
from django.http import HttpResponsefrom datetime import datetime
def hora_actual(request): now = datetime.now() html = "Son las %s." % now
return HttpResponse(html)
urls.py
views.py
![Page 146: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/146.jpg)
URLs y Vistas
from django.conf.urls.defaults import *from mysite.views import dentro_de
urlpatterns = patterns('', (r'^time/plus/(\d{1,2})/$', dentro_de),)
from django.http import HttpResponsefrom datetime import datetime, timedelta
def dentro_de(request, offset): offset = int(offset) dt = datetime.now() + timedelta(hours=offset) html = "En %i hora(s), serán las %s." % (offset, dt)
return HttpResponse(html)
urls.py
views.py
Ejemplo 2: http://mysite.com/time/plus/2
![Page 147: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/147.jpg)
![Page 148: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/148.jpg)
URLs y Vistas
from django.conf.urls.defaults import *from mysite.views import dentro_de
urlpatterns = patterns('', (r'^time/plus/(\d{1,2})/$', dentro_de),)
from django.http import HttpResponsefrom datetime import datetime, timedelta
def dentro_de(request, offset): offset = int(offset) dt = datetime.now() + timedelta(hours=offset) html = "En %i hora(s), serán las %s." % (offset, dt)
return HttpResponse(html)
urls.py
views.py
Ejemplo 2: http://mysite.com/time/plus/2
![Page 149: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/149.jpg)
¡Recuerda!: MVC
![Page 150: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/150.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 151: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/151.jpg)
Templates• Separan la lógica de presentación a una capa independiente.
• Ficheros independientes (.html)
• Lenguaje independiente (¡para diseñadores!)
![Page 152: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/152.jpg)
Templates• Se basan en dos 4pos de objetos: Template() y Context().
• Un objeto Template() con4ene el string de salida que queremos devolver en el H\pResponse (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().
"Bienvenido, {{ user }}."
{'user': 'alatar'}
Template:
Context:
"Bienvenido, alatar."
![Page 153: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/153.jpg)
Templates
from django.http import HttpResponsefrom django.template import Template, Contextfrom 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)
• Primera aproximación al obje4vo: Template + Context
![Page 154: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/154.jpg)
Templates• Segunda aproximación al obje4vo: open(), read(), close()
from django.http import HttpResponsefrom django.template import Template, Contextfrom 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)
![Page 155: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/155.jpg)
Templates• Segunda aproximación al obje4vo: open(), read(), close()
from django.http import HttpResponsefrom django.template import Template, Contextfrom 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)
![Page 156: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/156.jpg)
Templates• Segunda aproximación al obje4vo: open(), read(), close()
from django.http import HttpResponsefrom django.template import Template, Contextfrom 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)
Boring
boilerplate
code!
![Page 157: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/157.jpg)
Templates• Tercera aproximación al obje4vo: get_template()
from django.http import HttpResponsefrom django.template.loader import get_templatefrom django.template import Contextfrom 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)
TEMPLATE_DIRS = ( '/home/django/templates',)
sezngs.py
![Page 158: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/158.jpg)
Templates• Tercera aproximación al obje4vo: get_template()
TEMPLATE_DIRS = ( '/home/django/templates',)
sezngs.py
from django.http import HttpResponsefrom django.template.loader import get_templatefrom django.template import Contextfrom 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)
![Page 159: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/159.jpg)
Templates• Tercera aproximación al obje4vo: get_template()
TEMPLATE_DIRS = ( '/home/django/templates',)
sezngs.py
from django.http import HttpResponsefrom django.template.loader import get_templatefrom django.template import Contextfrom 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)
S4ll
boring...
![Page 160: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/160.jpg)
Templates• Obje4vo alcanzado: render_to_response()
from django.shortcuts import render_to_responsefrom datetime import datetime
def hora_actual(request): now = datetime.now() return render_to_response('hora.html', {'hora': now})
![Page 161: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/161.jpg)
Templates• Obje4vo alcanzado: render_to_response()
from django.shortcuts import render_to_responsefrom datetime import datetime
def hora_actual(request): now = datetime.now() return render_to_response('hora.html', {'hora': now})
Boring...?
![Page 162: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/162.jpg)
Templates• Obje4vo alcanzado: render_to_response()
from django.shortcuts import render_to_responsefrom datetime import datetime
def hora_actual(request): now = datetime.now() return render_to_response('hora.html', {'hora': now})
AWESOME!
![Page 163: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/163.jpg)
Templates: Tip
TEMPLATE_DIRS = ( '/home/django/templates',)
sezngs.pya)
![Page 164: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/164.jpg)
Templates: Tip
TEMPLATE_DIRS = ( '/home/django/templates',)
sezngs.py Reusable
apps?a)
![Page 165: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/165.jpg)
Templates: Tip
TEMPLATE_DIRS = ( '/home/django/templates',)
sezngs.py Reusable
apps?a)
b)
• La carpeta /templates es buscada dentro de cada app.
• Conviene incluir una carpeta con el nombre de la app por claridad.
TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.load_template_source', 'django.template.loaders.app_directories.load_template_source',)
return render_to_response('website/index.html')
Alterna4va reu4lizable:
![Page 166: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/166.jpg)
¡Empieza nuestro primer proyecto!
a) Crear la app dwi\er.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 twi\er en una template index.html a parNr de datos hardcodeados en un diccionario.
![Page 167: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/167.jpg)
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
![Page 168: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/168.jpg)
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.
![Page 169: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/169.jpg)
Templates: {{}}
<html> <head>Ejemplo templates</head> <body> Hola, {{ username }}. </body></html>
{'username': 'juan'}
<html> <head>Ejemplo templates</head> <body> Hola, juan. </body></html>
![Page 170: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/170.jpg)
Filters y Tags
![Page 171: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/171.jpg)
Filters y Tags
![Page 172: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/172.jpg)
Filters y Tags
{{ varible|filter }}filter
![Page 173: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/173.jpg)
Filters y Tags
{{ varible|filter }}filter
{% tag var1 var2 %}inline tag
![Page 174: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/174.jpg)
Filters y Tags
{{ varible|filter }}filter
{% tag var1 var2 %}inline tag
{% tag var1 %} ...{% endtag %}
block tag
![Page 175: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/175.jpg)
Templates: tags {% %}
![Page 176: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/176.jpg)
Templates: tags {% %}
{% comment %} Bu! {% endcomment %}comment
![Page 177: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/177.jpg)
Templates: tags {% %}
{% comment %} Bu! {% endcomment %}comment
for {% for elemento in lista %} <li>{{ elemento }}<li>{% endfor %}
![Page 178: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/178.jpg)
Templates: tags {% %}
{% comment %} Bu! {% endcomment %}comment
for {% for elemento in lista %} <li>{{ elemento }}<li>{% endfor %}
if {% if username == "Juan" %} Hola Juan, me gustas!{% else %} Hola {{ username }},{% endif %}
== != > < >= <=in and or not
![Page 179: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/179.jpg)
Tarea 1: Tagsa) UNlizar tags para que el Nmeline se muestre con el siguiente formato:• <username>: <tweet>• <username>: <tweet>• ...
![Page 180: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/180.jpg)
Templates: Filters
<html> <head>Ejemplo templates</head> <body> Hola, {{ username|title }}. </body></html>
{'username': 'juan'}
<html> <head>Ejemplo templates</head> <body> Hola, Juan. </body></html>
/tle
![Page 181: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/181.jpg)
Templates: Filters
![Page 182: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/182.jpg)
Templates: Filters{'username': 'Juan es majo'}
{{ username|length }}length 12
![Page 183: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/183.jpg)
Templates: Filters{'username': 'Juan es majo'}
{{ username|length }}length 12
{{ username|cut }}cut Juanesmajo
![Page 184: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/184.jpg)
Templates: Filters{'username': 'Juan es majo'}
{{ username|length }}length 12
{{ username|cut }}cut Juanesmajo
{{ username|slugify }}slugify juan-es-majo
![Page 185: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/185.jpg)
Templates: Filters{'username': 'Juan es majo'}
{{ username|length }}length 12
{{ username|cut }}cut Juanesmajo
{{ username|slugify }}slugify juan-es-majo
{{ username|wordcount }}wordcount 3
![Page 186: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/186.jpg)
Templates: Filters{'username': 'Juan es majo'}
{{ username|length }}length 12
{{ username|cut }}cut Juanesmajo
{{ username|slugify }}slugify juan-es-majo
{{ username|upper }}upper JUAN ES MAJO
{{ username|wordcount }}wordcount 3
![Page 187: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/187.jpg)
Templates: Filters{'username': 'Juan es majo'}
{{ username|length }}length 12
{{ username|cut }}cut Juanesmajo
{{ username|slugify }}slugify juan-es-majo
{{ username|upper }}upper JUAN ES MAJO
{{ username|wordcount }}wordcount 3
{{ username|default:”Desconocido” }}default
{'username': None}
Desconocido
![Page 188: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/188.jpg)
Templates: Filters
![Page 189: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/189.jpg)
Templates: Filters{'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'}
{{ username|striptags }}striptags
Juan es majo guapo y listo
![Page 190: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/190.jpg)
Templates: Filters{'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'}
{{ username|striptags }}striptags
Juan es majo guapo y listo
{{ username|truncatewords_html:4 }}truncatewords_html
Juan es <b>majo guapo</b> ...
![Page 191: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/191.jpg)
Templates: Filters{'username': 'Juan es <b>majo, guapo y <em>listo</em></b>'}
{{ username|striptags }}striptags
Juan es majo guapo y listo
{{ username|truncatewords_html:4 }}truncatewords_html
Juan es <b>majo guapo</b> ...
{{ username|removetags:”em a br” }}removetags
Juan es <b>majo guapo y listo</b>
![Page 192: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/192.jpg)
Templates: Filters
![Page 193: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/193.jpg)
Templates: Filters
{'url': 'Visitad http://www.djangoproject.com'}
{{ url|urlize }}urlize
Visitad <a href=”http://www.djangoproject.com”> http://www.djangoproject.com </a>
![Page 194: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/194.jpg)
Templates: Filters
{'url': 'Visitad http://www.djangoproject.com'}
{{ url|urlize }}urlize
Visitad <a href=”http://www.djangoproject.com”> http://www.djangoproject.com </a>
{{ url|urlizetrunc:16 }}urlizetrunc
Visitad <a href=”http://www.djangoproject.com”> http://www.djang...</a>
![Page 195: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/195.jpg)
Templates: Filters{'lista': ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]}
![Page 196: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/196.jpg)
Templates: Filters{'lista': ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]}
{{ lista|unordered_list }}unordered_list
<li>States <ul> <li>Kansas <ul> <li>Lawrence</li> <li>Topeka</li> </ul> </li> <li>Illinois</li></ul></li>
![Page 197: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/197.jpg)
Templates: Filters
![Page 198: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/198.jpg)
Templates: Filters{'value': 123456789}
{{ value|add:”1” }}add 123456790
![Page 199: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/199.jpg)
Templates: Filters{'value': 123456789}
{{ value|add:”1” }}add 123456790
{{ value|filesizeformat }}filesizeformat 117.7MB
![Page 200: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/200.jpg)
Templates: Filters{'value': 123456789}
{{ value|add:”1” }}add 123456790
{{ value|filesizeformat }}filesizeformat 117.7MB
{'date': datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) }
{{ date|date:”d M Y” }}date 11 Sep 2010
![Page 201: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/201.jpg)
Templates: Filters{'value': 123456789}
{{ value|add:”1” }}add 123456790
{{ value|filesizeformat }}filesizeformat 117.7MB
{'date': datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) }
{{ date|date:”d M Y” }}date 11 Sep 2010
{{ date|timesince }}/mesince 4 days, 6 hours
![Page 202: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/202.jpg)
Templates: Filters{'value': 123456789}
{{ value|add:”1” }}add 123456790
{{ value|filesizeformat }}filesizeformat 117.7MB
{'date': datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) }
{{ date|date:”d M Y” }}date 11 Sep 2010
{{ date|timesince }}/mesince 4 days, 6 hours
{{ date|timeuntil }}/meun/l 1 days, 6 hours
![Page 203: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/203.jpg)
Tarea 2: Filtersa) Añadir a cada tweet del Nmeline el Nempo transcurrido:• <username>: <tweet>
<n> seconds ago• <username>: <tweet>
<n> minutes ago• ...
![Page 204: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/204.jpg)
Templates: tags {% %}
![Page 205: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/205.jpg)
Templates: tags {% %}cycle {% for elemento in lista %}
<li class="{% cycle 'rojo' 'azul' %}">{{ elemento }}<li>{% endfor %}
![Page 206: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/206.jpg)
Templates: tags {% %}cycle {% for elemento in lista %}
<li class="{% cycle 'rojo' 'azul' %}">{{ elemento }}<li>{% endfor %}
include {% include "foo/bar.html" %}
![Page 207: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/207.jpg)
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 %}
![Page 208: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/208.jpg)
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 %}
![Page 209: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/209.jpg)
Tarea 3: Tags avanzadosa) Hacer que el Nmeline muestre el mensaje “No hay tweets.” si el diccionario recibido está vacío.
![Page 210: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/210.jpg)
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 %}
![Page 211: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/211.jpg)
Tarea 4: Herencia de templatesa) 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.
![Page 212: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/212.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 213: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/213.jpg)
Modelos
![Page 214: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/214.jpg)
¿SQL?
![Page 215: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/215.jpg)
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})
![Page 216: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/216.jpg)
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})
1
![Page 217: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/217.jpg)
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})
12
![Page 218: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/218.jpg)
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})
12
3
![Page 219: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/219.jpg)
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})
12
34
![Page 220: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/220.jpg)
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})
12
34
5
![Page 221: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/221.jpg)
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})
12
34
5
6
![Page 222: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/222.jpg)
12 lineas de Python... ¬_¬
![Page 223: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/223.jpg)
ORM (Object-‐RelaNonal mapping)
![Page 224: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/224.jpg)
ORM (Object-‐RelaNonal mapping)
![Page 225: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/225.jpg)
Ejemplo ORM
def book_list(request):
names = Books.objects.all().order_by('name')
return render_to_response('book_list.html', {'names':names})
![Page 226: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/226.jpg)
Ejemplo ORM
def book_list(request):
names = Books.objects.all().order_by('name')
return render_to_response('book_list.html', {'names':names})
1
![Page 227: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/227.jpg)
Ejemplo ORM
def book_list(request):
names = Books.objects.all().order_by('name')
return render_to_response('book_list.html', {'names':names})
1 2
![Page 228: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/228.jpg)
Fucking Ninjas!
![Page 229: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/229.jpg)
Modelofrom 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)
![Page 230: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/230.jpg)
Modelofrom 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)
1
• 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)
![Page 231: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/231.jpg)
Modelofrom 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)
2
1
• 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)
![Page 232: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/232.jpg)
Modelofrom 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)
2
1
3
• 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)
![Page 233: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/233.jpg)
Modelofrom 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)
2
1
3
4
• 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)
![Page 234: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/234.jpg)
Modelofrom 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)
2
1
3
4
5
• 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)
![Page 235: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/235.jpg)
Modelofrom 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)
2
1
3
4
5
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)
![Page 236: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/236.jpg)
Fucking Awesome Ninjas!
![Page 237: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/237.jpg)
Tipos de Datos
• AutoField• BigIntegerField• BooleanField• CharField• CommaSeparatedIntegerField• DateField• DateTimeField• DecimalField• EmailField• FileField• FilePathField• FloatField• ImageField• IntegerField
• IPAdressField• NullBooleanField• PositiveIntegerField• PositiveSmallIntegerField• SlugField• SmallIntegerField• TextField• TimeField• URLField• XMLField• ForeingKey• ManyToManyField• OneToOneField
![Page 238: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/238.jpg)
Tipos de Datos
• AutoField• BigIntegerField• BooleanField• CharField• CommaSeparatedIntegerField• DateField• DateTimeField• DecimalField• EmailField• FileField• FilePathField• FloatField• ImageField• IntegerField
• IPAdressField• NullBooleanField• PositiveIntegerField• PositiveSmallIntegerField• SlugField• SmallIntegerField• TextField• TimeField• URLField• XMLField• ForeingKey• ManyToManyField• OneToOneField
![Page 239: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/239.jpg)
Propiedades de las Field
• null (True|Flase)
• blank (True|False)
• choices (lista)
• default (valor)
• editable (True|False)
• help_text (String)
• unique (True|False)
• primary_key
• unique_for_date
• unique_for_month
• unique_for_year
![Page 240: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/240.jpg)
Propiedades de las Field
• null (True|Flase)
• blank (True|False)
• choices (lista)
• default (valor)
• editable (True|False)
• help_text (String)
• unique (True|False)
• primary_key
• unique_for_date
• unique_for_month
• unique_for_year
![Page 241: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/241.jpg)
¿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;
![Page 242: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/242.jpg)
¿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;
![Page 243: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/243.jpg)
¿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
![Page 244: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/244.jpg)
Configurar sesngs.py
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'db.sqlite'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
![Page 245: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/245.jpg)
Configurar sesngs.py
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'db.sqlite'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
1
![Page 246: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/246.jpg)
Configurar sesngs.py
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'db.sqlite'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
1
2
![Page 247: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/247.jpg)
Configurar sesngs.py
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'db.sqlite'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
1
2
3
![Page 248: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/248.jpg)
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
![Page 249: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/249.jpg)
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
![Page 250: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/250.jpg)
Nuestro primer modelo
a)Crear modelo Tweetb)Configurar senngs.pyc) Ver el SQL generado con sqlall
![Page 251: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/251.jpg)
syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweet
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): yesUsername (Leave blank to use 'neo'): admin E-mail address: [email protected]: Password (again): Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
![Page 252: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/252.jpg)
syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweet
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): yesUsername (Leave blank to use 'neo'): admin E-mail address: [email protected]: Password (again): Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
django.contrib.auth
![Page 253: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/253.jpg)
¿Cuantos sistemas de AutenNcación habéis programado?
![Page 254: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/254.jpg)
¿Alguno era mejor que el anterior? ;-‐)
![Page 255: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/255.jpg)
contrib.auth puede ser el úlNmo :D
![Page 256: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/256.jpg)
syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweet
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): yesUsername (Leave blank to use 'neo'): admin E-mail address: [email protected]: Password (again): Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
website.tweet
![Page 257: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/257.jpg)
syncdb$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweet
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): yesUsername (Leave blank to use 'neo'): admin E-mail address: [email protected]: Password (again): Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model
django.contrib.auth
![Page 258: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/258.jpg)
BD Lista para usarse
![Page 259: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/259.jpg)
BD Lista para usarse
![Page 260: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/260.jpg)
Nuestro primer modelo
a)Hacer syncdb
![Page 261: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/261.jpg)
![Page 262: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/262.jpg)
Previo: Clases del ORM
ts = Publisher.objects.all()
Model
Manager
QuerySet
![Page 263: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/263.jpg)
Previo: __unicode__()
![Page 264: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/264.jpg)
Previo: __unicode__()>>> Publisher.objects.all()[<Publisher: Publisher object>]
![Page 265: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/265.jpg)
Previo: __unicode__()>>> Publisher.objects.all()[<Publisher: Publisher object>]
![Page 266: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/266.jpg)
Previo: __unicode__()>>> Publisher.objects.all()[<Publisher: Publisher object>]
![Page 267: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/267.jpg)
Previo: __unicode__()
class Publisher(models.Model): ... def __unicode__(self): return self.name
>>> Publisher.objects.all()[<Publisher: Publisher object>]
![Page 268: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/268.jpg)
Previo: __unicode__()
class Publisher(models.Model): ... def __unicode__(self): return self.name
>>> Publisher.objects.all()[<Publisher: Publisher object>]
>>> Publisher.objects.all()[<Publisher: Apress>]
![Page 269: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/269.jpg)
INSERT
![Page 270: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/270.jpg)
INSERT
>>> p = Publisher(... name='Apress',... address='2855 Telegraph Avenue',... city='Berkeley',... state_province='CA',... country='U.S.A.',... website='http://www.apress.com/')>>> p.save()
a)
o = Model(...) o.save()
![Page 271: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/271.jpg)
INSERT
>>> 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/')
>>> p = Publisher(... name='Apress',... address='2855 Telegraph Avenue',... city='Berkeley',... state_province='CA',... country='U.S.A.',... website='http://www.apress.com/')>>> p.save()
a)
o = Model(...) o.save()
manager.create(...)
b)
![Page 272: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/272.jpg)
UPDATE
![Page 273: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/273.jpg)
UPDATE
>>> ...>>> p.id52>>> p.name = 'Apress Publishing'>>> p.save()
o.save()
1
![Page 274: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/274.jpg)
UPDATE
>>> Publisher.objects.all().update(country='USA')2
>>> ...>>> p.id52>>> p.name = 'Apress Publishing'>>> p.save()
o.save()
queryset.update(...)
1
n
![Page 275: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/275.jpg)
DELETE
![Page 276: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/276.jpg)
DELETE
>>> ...>>> p.id52>>> p.delete()
o.delete()
1
![Page 277: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/277.jpg)
DELETE
>>> ps = Publisher.objects.all()>>> ps.delete()
>>> ...>>> p.id52>>> p.delete()
o.delete()
queryset.delete()
1
n
![Page 278: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/278.jpg)
SELECT de 1 resultado
![Page 279: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/279.jpg)
SELECT de 1 resultado
>>> Publisher.objects.get(name="Apress")<Publisher: Apress>
.get(...)
![Page 280: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/280.jpg)
SELECT de 1 resultado
>>> Publisher.objects.get(name="Apress")<Publisher: Apress>
.get(...)
>>> Publisher.objects.get(name="Anaya")Traceback (most recent call last): ...DoesNotExist: Publisher matching query does not exist.
![Page 281: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/281.jpg)
SELECT de 1 resultado
>>> Publisher.objects.get(name="Apress")<Publisher: Apress>
.get(...)
>>> 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.'}
>>> Publisher.objects.get(name="Anaya")Traceback (most recent call last): ...DoesNotExist: Publisher matching query does not exist.
![Page 282: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/282.jpg)
SELECT de N resultados
![Page 283: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/283.jpg)
SELECT de N resultados
>>> Publisher.objects.all()[<Publisher: Apress>, <Publisher: O'Reilly>]
.all()
![Page 284: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/284.jpg)
SELECT de N resultados
>>> Publisher.objects.all()[<Publisher: Apress>, <Publisher: O'Reilly>]
.all()
>>> Publisher.objects.filter( country="U.S.A.", state_province="CA")[<Publisher: Apress>]
.filter(...)
![Page 285: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/285.jpg)
SELECT de N resultados
>>> Publisher.objects.all()[<Publisher: Apress>, <Publisher: O'Reilly>]
.all()
>>> Publisher.objects.filter( country="U.S.A.", state_province="CA")[<Publisher: Apress>]
.filter(...)
>>> Publisher.objects.exclude( country="U.S.A.", state_province="CA")[<Publisher: O'Reilly>]
.exclude(...)
![Page 286: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/286.jpg)
SELECT de N resultados
>>> Publisher.objects.all()[<Publisher: Apress>, <Publisher: O'Reilly>]
.all()
>>> Publisher.objects.filter( country="U.S.A.", state_province="CA")[<Publisher: Apress>]
.filter(...)
>>> Publisher.objects.exclude( country="U.S.A.", state_province="CA")[<Publisher: O'Reilly>]
.exclude(...)
¡Devuelven
QuerySets, n
o
listas!
![Page 287: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/287.jpg)
get(), filter() y exclude()
![Page 288: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/288.jpg)
get(), filter() y exclude()
Modelo.objects.filter(campo1="valor1", campo2="valor2")
Los parámetros pueden indicar mucho más que igualdad (=)
![Page 289: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/289.jpg)
get(), filter() y exclude()
Modelo.objects.filter(campo1="valor1", campo2="valor2")
Los parámetros pueden indicar mucho más que igualdad (=)
campo__exact=''
campo__iexact=''
campo__contains=''
campo__icontains=''
campo__isnull=T|F
campo__day=31
campo__gt=0
campo__gte=0
campo__lt=0
campo__lte=0
campo__in=[ ,]
campo__month=12
campo__startswith=''
campo__istartswith=''
campo__endswith=''
campo__iendswith=''
campo__range=( ,)
campo__year=2010
![Page 290: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/290.jpg)
ORDER BY
![Page 291: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/291.jpg)
ORDER BY
>>> Publisher.objects.order_by("name")[<Publisher: Apress>, <Publisher: O'Reilly>]
.order_by(...)
![Page 292: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/292.jpg)
ORDER BY
>>> Publisher.objects.order_by("name")[<Publisher: Apress>, <Publisher: O'Reilly>]
.order_by(...)
>>> Publisher.objects.order_by("-name")[<Publisher: O'Reilly>, <Publisher: Apress>]
![Page 293: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/293.jpg)
ORDER BY
>>> Publisher.objects.order_by("name")[<Publisher: Apress>, <Publisher: O'Reilly>]
.order_by(...)
>>> Publisher.objects.order_by("-name")[<Publisher: O'Reilly>, <Publisher: Apress>]
>>> Publisher.objects.order_by("-name", "country")[<Publisher: O'Reilly>, <Publisher: Apress>]
MúlNples campos:
![Page 294: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/294.jpg)
ORDER BY
>>> Publisher.objects.order_by("name")[<Publisher: Apress>, <Publisher: O'Reilly>]
.order_by(...)
>>> Publisher.objects.order_by("-name")[<Publisher: O'Reilly>, <Publisher: Apress>]
>>> Publisher.objects.order_by("-name", "country")[<Publisher: O'Reilly>, <Publisher: Apress>]
MúlNples campos:
¡También
devuelve
QuerySets!
![Page 295: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/295.jpg)
Slicing
![Page 296: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/296.jpg)
Slicing
>>> Publisher.objects.order_by("name")[0]<Publisher: Apress>
[n:m]
>>> Publisher.objects.order_by("name")[:2][<Publisher: Apress>, <Publisher: O'Reilly>]
>>> Publisher.objects.order_by("name")[1:2][<Publisher: O'Reilly>]
![Page 297: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/297.jpg)
Slicing
>>> Publisher.objects.order_by("name")[0]<Publisher: Apress>
[n:m]
>>> Publisher.objects.order_by("name")[:2][<Publisher: Apress>, <Publisher: O'Reilly>]
>>> Publisher.objects.order_by("name")[1:2][<Publisher: O'Reilly>]
LIMIT
![Page 298: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/298.jpg)
Slicing
>>> Publisher.objects.order_by("name")[0]<Publisher: Apress>
[n:m]
>>> Publisher.objects.order_by("name")[:2][<Publisher: Apress>, <Publisher: O'Reilly>]
>>> Publisher.objects.order_by("name")[1:2][<Publisher: O'Reilly>]
LIMIT
OFFSET
![Page 299: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/299.jpg)
Related Objects
![Page 300: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/300.jpg)
Related ObjectsOneToOneField
class Coche(models.Model): motor = OneToOneField(Motor)
class Motor(models.Model): ...
1
1
![Page 301: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/301.jpg)
Related ObjectsOneToOneField
class Coche(models.Model): motor = OneToOneField(Motor)
class Motor(models.Model): ...
>>> c.motor<Motor: Motor object>
¿Cómo usamos la relación desde las instancias?
Gracias a nosotros
1
1
![Page 302: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/302.jpg)
Related ObjectsOneToOneField
class Coche(models.Model): motor = OneToOneField(Motor)
class Motor(models.Model): ...
>>> c.motor<Motor: Motor object>
>>> m.coche<Coche: Coche object>
¿Cómo usamos la relación desde las instancias?
Gracias a nosotros Gracias a Django
1
1
![Page 303: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/303.jpg)
Related Objects
![Page 304: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/304.jpg)
Related ObjectsForeignKeyField
class Blog(models.Model): ...
class Post(models.Model): blog = ForeignKeyField(Blog)
1
n
![Page 305: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/305.jpg)
Related ObjectsForeignKeyField
class Blog(models.Model): ...
class Post(models.Model): blog = ForeignKeyField(Blog)
>>> p.blog<Blog: Blog object>
>>> b.post_set.all()[<Post: Post object>, ...]
¿Cómo usamos la relación desde las instancias?
Gracias a nosotros Gracias a Django
1
n
![Page 306: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/306.jpg)
Related Objects
![Page 307: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/307.jpg)
Related ObjectsManyToManyField
class Post(models.Model): tags = ManyToManyField(Tag)
class Tag(models.Model): ...
n
m
![Page 308: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/308.jpg)
Related ObjectsManyToManyField
class Post(models.Model): tags = ManyToManyField(Tag)
class Tag(models.Model): ...
>>> p.tags.add(t1, t2)>>> p.tags.all()[<Tag: Tag object>, ...]
>>> t.post_set.add(p1, p2)>>> t.post_set.all()[<Post: Post object>, ...]
¿Cómo usamos la relación desde las instancias?
Gracias a nosotros Gracias a Django
n
m
![Page 309: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/309.jpg)
Related Objects
![Page 310: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/310.jpg)
Related ObjectsEn todas ellas podemos renombrar el puntero inverso
class Blog(models.Model): ...
class Post(models.Model): blog = ForeignKeyField(Blog, related_name='posts')
1
n
![Page 311: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/311.jpg)
Related ObjectsEn todas ellas podemos renombrar el puntero inverso
class Blog(models.Model): ...
class Post(models.Model): blog = ForeignKeyField(Blog, related_name='posts')
>>> p.blog<Blog: Blog object>
>>> b.posts.all()[<Post: Post object>, ...]
Gracias a nosotros Gracias a Django
1
n
![Page 312: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/312.jpg)
Related ObjectsEn todas ellas podemos renombrar el puntero inverso
class Blog(models.Model): ...
class Post(models.Model): blog = ForeignKeyField(Blog, related_name='posts')
>>> p.blog<Blog: Blog object>
>>> b.posts.all()[<Post: Post object>, ...]
Gracias a nosotros Gracias a Django
1
n
Cuando haya 2 relaciones entre 2 modelos, será obligatorio
![Page 313: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/313.jpg)
Y la guinda final: ¡Todo es LAZY!
![Page 314: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/314.jpg)
Laziness
![Page 315: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/315.jpg)
Laziness• Las consultas sólo se ejecutarán cuando realmente se necesite obtener los objetos. En las siguientes situaciones:
• Iteraciones
• Slicing
• Serialización
• repr()
• len() !!!
• list()
• bool()
for p in Publisher.objects.all():
Publisher.objects.filter(country='USA')[0]
[Caché]
[<Publisher: Publisher object>]
len(Publisher.objects.all())
list(Publisher.objects.all())
if Publisher.objects.filter(country='USA'):
![Page 316: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/316.jpg)
Usando el ORM
a) Insertar varios Tweets desde la shellb)Modificar views.index para que uNlice los Tweets reales de la BD
c) Implementar URL y View para ofrecer permalinks a los tweets:‣ URL: user/<username>/status/<tweet_id>
‣ View: tweet_page
‣ Template: tweet_page.html (Bajar)
d)shortcut!: get_object_or_404()
![Page 317: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/317.jpg)
Profiles
![Page 318: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/318.jpg)
Profile
• Problema: El modelo User de django.contrib.auth no puede
contener toda la información que necesitamos.
• Username, Password, Name.... y poco más.
• Solución: Definir un Profile (Un Modelo Agregado) para
guardar esa información.
![Page 319: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/319.jpg)
Profilemodels.py
![Page 320: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/320.jpg)
Profile
class Profile(models.Model): user = models.OneToOneField(User, unique=True)
models.py
![Page 321: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/321.jpg)
Profile
class Profile(models.Model): user = models.OneToOneField(User, unique=True) bio = models.CharField(blank=True, max_length=200)
models.py
![Page 322: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/322.jpg)
Profile
class Profile(models.Model): user = models.OneToOneField(User, unique=True) bio = models.CharField(blank=True, max_length=200) ...
models.py
![Page 323: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/323.jpg)
Profile
class Profile(models.Model): user = models.OneToOneField(User, unique=True) bio = models.CharField(blank=True, max_length=200) ...
AUTH_PROFILE_MODULE = "website.Profile"
sesngs.py
models.py
![Page 324: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/324.jpg)
Profile
class Profile(models.Model): user = models.OneToOneField(User, unique=True) bio = models.CharField(blank=True, max_length=200) ...
AUTH_PROFILE_MODULE = "website.Profile"
sesngs.py
models.py
• Cada objeto User de django.contrib.auth dispone de un método get_profile() que nos permiNrá acceder al Profile.
![Page 325: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/325.jpg)
Profile
•Donde tengamos el User tendremos el Profile.•Donde tengamos el Profile, tendremos el User.
![Page 326: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/326.jpg)
Profile
>>> from django.contrib.auth.models import User>>> u = User.objects.get(id=1)>>> type(u)<class 'django.contrib.auth.models.User'>
>>> profile = u.get_profile()>>> type(profile)<class 'website.models.Profile'>
•Donde tengamos el User tendremos el Profile.•Donde tengamos el Profile, tendremos el User.
![Page 327: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/327.jpg)
1 User = 1 Profile ¿Cuándo se crea un User?
![Page 328: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/328.jpg)
Signals
• Django incorpora un dispacher de señales para ayudar a crear aplicaciones reuNlizables.• Permite subscribirnos a “eventos” a lo largo de todo el framework y actuar frente a ellos.
• Señales interesantes:• pre_save, post_save• pre_delete, post_delete• m2m_changed• request_started, request_finished
h\p://docs.djangoproject.com/en/dev/ref/signals/
![Page 329: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/329.jpg)
Signals
![Page 330: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/330.jpg)
Signals
def profile_signal_callback(sender, **kwargs): if kwargs.get('created'): profile = Profile() profile.user = User.objects.get(id=kwargs.get('instance').id) profile.save()
from django.db.models.signals import post_save
post_save.connect(profile_signal_callback, sender=User, dispatch_uid="users-profilecreation-signal")
1
![Page 331: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/331.jpg)
Signals
def profile_signal_callback(sender, **kwargs): if kwargs.get('created'): profile = Profile() profile.user = User.objects.get(id=kwargs.get('instance').id) profile.save()
from django.db.models.signals import post_save
post_save.connect(profile_signal_callback, sender=User, dispatch_uid="users-profilecreation-signal")
1
2
![Page 332: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/332.jpg)
Signals
def profile_signal_callback(sender, **kwargs): if kwargs.get('created'): profile = Profile() profile.user = User.objects.get(id=kwargs.get('instance').id) profile.save()
from django.db.models.signals import post_save
post_save.connect(profile_signal_callback, sender=User, dispatch_uid="users-profilecreation-signal")
1
2
3
![Page 333: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/333.jpg)
Signals
def profile_signal_callback(sender, **kwargs): if kwargs.get('created'): profile = Profile() profile.user = User.objects.get(id=kwargs.get('instance').id) profile.save()
from django.db.models.signals import post_save
post_save.connect(profile_signal_callback, sender=User, dispatch_uid="users-profilecreation-signal")
1
2
3
4
![Page 334: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/334.jpg)
Signals
def profile_signal_callback(sender, **kwargs): if kwargs.get('created'): profile = Profile() profile.user = User.objects.get(id=kwargs.get('instance').id) profile.save()
from django.db.models.signals import post_save
post_save.connect(profile_signal_callback, sender=User, dispatch_uid="users-profilecreation-signal")
1
2
3
4
Puede estar en cualquier app de nuestro proyecto.
Se recomienda models.py
![Page 335: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/335.jpg)
Users en dwi\er
a)Crear el modelo Profileb)Crear trigger de agregación con User mediante signals
c) Eliminar BDd)Hacer syncdb
![Page 336: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/336.jpg)
Followers
![Page 337: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/337.jpg)
Profilemodels.py
![Page 338: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/338.jpg)
Profile
class Profile(models.Model): user = models.OneToOneField(User, unique=True) bio = models.CharField(blank=True, max_length=200)
models.py
![Page 339: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/339.jpg)
Profile
class Profile(models.Model): user = models.OneToOneField(User, unique=True) bio = models.CharField(blank=True, max_length=200) followers = models.ManyToManyField("self", blank=True,
models.py
![Page 340: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/340.jpg)
Profile
class Profile(models.Model): user = models.OneToOneField(User, unique=True) bio = models.CharField(blank=True, max_length=200) followers = models.ManyToManyField("self", blank=True, symmetrical=False,
models.py
![Page 341: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/341.jpg)
Profile
class Profile(models.Model): user = models.OneToOneField(User, unique=True) bio = models.CharField(blank=True, max_length=200) followers = models.ManyToManyField("self", blank=True, symmetrical=False, related_name="following")
models.py
![Page 342: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/342.jpg)
Profile
class Profile(models.Model): user = models.OneToOneField(User, unique=True) bio = models.CharField(blank=True, max_length=200) followers = models.ManyToManyField("self", blank=True, symmetrical=False, related_name="following")
models.py
• m2m symmetrical (por defecto)• Si yo te sigo a N, tú me sigues a mi.
• related_name (en este caso)• Limpieza y evitar profile_set
![Page 343: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/343.jpg)
Users en dwi\er
a)Añadir ManyToMany para los followersb)Eliminar BD c) Hacer syncdb
![Page 344: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/344.jpg)
1,2,3 Borrar la BD.... 1,2,3... Borrar la BD
![Page 345: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/345.jpg)
Fixtures
![Page 346: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/346.jpg)
Fixtures• Es muy aburrido crear juegos de datos cada vez que se elimina una tabla / BD.• No nos gustan las cosas aburridas.• Ficheros (json/xml/yaml) para inicializar una Tabla.• Pueden crearse una vez dispongamos de la información:
![Page 347: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/347.jpg)
Fixtures• Es muy aburrido crear juegos de datos cada vez que se elimina una tabla / BD.• No nos gustan las cosas aburridas.• Ficheros (json/xml/yaml) para inicializar una Tabla.• Pueden crearse una vez dispongamos de la información:
python manage.py dumpdata <appName appName appName.model ...>
![Page 348: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/348.jpg)
Fixtures• Es muy aburrido crear juegos de datos cada vez que se elimina una tabla / BD.• No nos gustan las cosas aburridas.• Ficheros (json/xml/yaml) para inicializar una Tabla.• Pueden crearse una vez dispongamos de la información:
python manage.py dumpdata <appName appName appName.model ...>
• Se cargan uNlizando:
python manage.py loaddata <fixture fixture ...>
• Si se llaman iniAal_data y están dentro de la carpeta fixtures de la app, se cargan al ahcer el syncdb.
![Page 349: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/349.jpg)
El poder de los fixtures
a)Crear la carpeta website/fixturesb)Descargar iniNal_data.json y meterlo en la carpeta fixtures
c) Hacer syncdbd)Implementar URL y View para ofrecer páginas de usuario:‣ URL: user/<username>/
‣ View: user_page
‣ Template: user_page.html (Bajar)
![Page 350: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/350.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 351: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/351.jpg)
CRUD: Create, Retrieve, Update & Delete
![Page 352: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/352.jpg)
django.contrib.admin
1
2
3
![Page 353: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/353.jpg)
django.contrib.admin
1
2
3
![Page 354: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/354.jpg)
django.contrib.admin
1
![Page 355: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/355.jpg)
Django admin: Instalación
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:# from django.contrib import admin# admin.autodiscover()
urlpatterns = patterns('',
...
# (r'^admin/', include(admin.site.urls)),
...
)
1
2
urls.py
![Page 356: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/356.jpg)
Django admin: Instalación
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:from django.contrib import adminadmin.autodiscover()
urlpatterns = patterns('',
...
(r'^admin/', include(admin.site.urls)),
...
)
1
2
urls.py
![Page 357: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/357.jpg)
Django admin: Instalación
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', ...)
sezngs.py
![Page 358: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/358.jpg)
Django admin: Instalación
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.admin', ...)
sezngs.py
1
![Page 359: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/359.jpg)
Actualizando la BD
![Page 360: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/360.jpg)
Actualizando la BD
$ python manage.py syncdb
Creating table django_admin_log
Installing index for admin.LogEntry model
Admin lista para usar
![Page 361: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/361.jpg)
¿Y nuestra app?
?
![Page 362: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/362.jpg)
¿Y nuestra app?
![Page 363: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/363.jpg)
admin.py• Cada app debe de tener el suyo.
• Define qué modelos serán visibles desde el admin y permite personalizar su aspecto.
from django.contrib import admin
from website.models import Tweet
class TweetAdmin(admin.ModelAdmin):
list_display = ('id','user','message','timestamp')
admin.site.register(Tweet, TweetAdmin)
![Page 364: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/364.jpg)
Instalar Admin
a)Configurar urls.pyb)Configurar senngs.pyc) Hacer syncdbd)Comprobar que no está Tweete)Añadir admin.pyf) Probar Administración
![Page 365: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/365.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 366: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/366.jpg)
Formularios
![Page 367: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/367.jpg)
Clases involucradas
![Page 368: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/368.jpg)
Clases involucradas
Widget Componente visual equivalente a HTMLTextInput
CheckboxInput
<input type='text'...>
<input type='checkbox'...>
![Page 369: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/369.jpg)
Clases involucradas
Widget Componente visual equivalente a HTMLTextInput
CheckboxInput
<input type='text'...>
<input type='checkbox'...>
Field Lógica de un campo, asociado a un WidgetEmailField
IPAddressFieldwidget, initial, error, ...
![Page 370: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/370.jpg)
Clases involucradas
Widget Componente visual equivalente a HTMLTextInput
CheckboxInput
<input type='text'...>
<input type='checkbox'...>
Field Lógica de un campo, asociado a un WidgetEmailField
IPAddressFieldwidget, initial, error, ...
Form Conjunto de Fields de un formularioContactForm [nombre, email, telefono, mensaje, ...]
![Page 371: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/371.jpg)
Fields
![Page 372: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/372.jpg)
Fields■ BooleanField
■ CharField
■ ChoiceField
■ TypedChoiceField
■ DateField
■ DateTimeField
■ DecimalField
■ EmailField
■ FileField
■ FilePathField
■ FloatField
■ ImageField
■ IntegerField
■ IPAddressField
■ MultipleChoiceField
■ NullBooleanField
■ RegexField
■ SlugField
■ TimeField
■ URLField
■ ComboField
■ MultiValuefield
■ SplitDateTimeField
■ ModelChoiceField
■ ModelMultipleChoiceField
![Page 373: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/373.jpg)
Fields■ BooleanField
■ CharField
■ ChoiceField
■ TypedChoiceField
■ DateField
■ DateTimeField
■ DecimalField
■ EmailField
■ FileField
■ FilePathField
■ FloatField
■ ImageField
■ IntegerField
■ IPAddressField
■ MultipleChoiceField
■ NullBooleanField
■ RegexField
■ SlugField
■ TimeField
■ URLField
■ ComboField
■ MultiValuefield
■ SplitDateTimeField
■ ModelChoiceField
■ ModelMultipleChoiceField
![Page 374: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/374.jpg)
Creación de un Form
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100, label='Topic')
email = forms.EmailField(required=False)
message = forms.CharField(widget=forms.Textarea)
• Paso 1/3: Definición del formulario en forms.py
![Page 375: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/375.jpg)
Creación de un Form
<html><body> <h1>Contact us</h1>
{% if form.errors %} <p style="color: red;"> Please correct the error{{ form.errors|pluralize }} below. </p> {% endif %}
<form action="" method="post"> <table> {{ form.as_table }} </table> <input type="submit" value="Submit"> </form></body></html>
• Paso 2/3: Maquetación del formulario en su template
![Page 376: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/376.jpg)
Creación de un Form
from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(cd['subject'], cd['message'], ...)
# ...
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
return render_to_response('contact_form.html', {'form': form})
• Paso 3/3: Programación de la vista en views.py
![Page 377: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/377.jpg)
Creación de un Form
from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(cd['subject'], cd['message'], ...)
# ...
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
return render_to_response('contact_form.html', {'form': form})
• Paso 3/3: Programación de la vista en views.py
Pa\ern
![Page 378: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/378.jpg)
Creación de un Form
from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(cd['subject'], cd['message'], ...)
# ...
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
return render_to_response('contact_form.html', {'form': form})
• Paso 3/3: Programación de la vista en views.py
Pa\ern
![Page 379: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/379.jpg)
Creación de un Form
from django.shortcuts import render_to_response
from mysite.contact.forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(cd['subject'], cd['message'], ...)
# ...
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm()
return render_to_response('contact_form.html', {'form': form})
• Paso 3/3: Programación de la vista en views.py
Pa\ern
![Page 380: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/380.jpg)
Validación propia
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
email = forms.EmailField(required=False)
message = forms.CharField(widget=forms.Textarea)
def clean_message(self):
message = self.cleaned_data['message']
num_words = len(message.split())
if num_words < 4:
raise forms.ValidationError("Not enough words!")
return message
Podemos programar validación extra asociada a cada Field del formulario escribiendo un método clean_<fieldname>:
![Page 381: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/381.jpg)
Validación propia
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
email = forms.EmailField(required=False)
message = forms.CharField(widget=forms.Textarea)
def clean_message(self):
message = self.cleaned_data['message']
num_words = len(message.split())
if num_words < 4:
raise forms.ValidationError("Not enough words!")
return message
Podemos programar validación extra asociada a cada Field del formulario escribiendo un método clean_<fieldname>:
![Page 382: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/382.jpg)
Maquetación propia
...<form action="" method="post"> <div class="field"> {{ form.subject.errors }} <label for="id_subject">Subject:</label> {{ form.subject }} </div> <div class="field"> {{ form.email.errors }} <label for="id_email">E-mail:</label> {{ form.email }} </div> ... <input type="submit" value="Submit"></form>...
Podemos personalizar la maquetación tanto como queramos, prescindiendo de las ayudas de form.as_table:
<style type="text/css"> ul.errorlist { ... } .errorlist li { ... }
</style>
Para los diseñadores:
![Page 383: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/383.jpg)
Forms a parNr de Models: El COLMO del DRY
![Page 384: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/384.jpg)
Forms a par/r de Modelsfrom django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
birth_date = models.DateField(blank=True, null=True)
country = models.ModelChoiceField(Country)
...
from django import forms
from books.models import Author
class AuthorForm(forms.ModelForm):
class Meta:
model = Author
exclude = ('country',)
models.py
forms.py
![Page 385: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/385.jpg)
Primer Form en dwi\er
a)Crear un Form que permita publicar tweets desde index.html al usuario que esté logueado desde django.contrib.admin (no tenemos login propio).
![Page 386: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/386.jpg)
Índice
1.Python
a. Introducción
b.Tipos de datos
c. Operadores
d.Usos frecuentes
e. Estructuras
f. Sentencias
g. Ejercicio
2.Django
a. Introducción
b.URLs y Vistas
c. Templates
d.Modelo
e. Administración
f. Formularios
g. Magia avanzada
Proyecto
![Page 387: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/387.jpg)
Magia avanzada
![Page 388: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/388.jpg)
Magia avanzada
1. Context Processors
2.Middleware
3. Caching
4. Deploying Django
5. Apps recomendadas
![Page 389: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/389.jpg)
Magia avanzada
1. Context Processors
2.Middleware
3. Caching
4. Deploying Django
5. Apps recomendadas
![Page 390: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/390.jpg)
Context ProcessorsProblema
!
! ! !
!
!
!
!
![Page 391: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/391.jpg)
Context ProcessorsSolución: el objeto RequestContext()
c = RequestContext(request, {'tweets': tweets})
• Sus4tuye a Context().
• Recibe un H\pRequest() antes del diccionario.
• Automá4camente alimenta nuestro diccionario con todos
los diccionarios devueltos por los Context Processors que
tengamos habilitados.
![Page 392: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/392.jpg)
Context Processors¿Context Processors? Son funciones.
• Reciben un H\pRequest() como único parámetro.
• Devuelven un diccionario para ser usado como Context().
![Page 393: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/393.jpg)
Context Processors¿Context Processors? Son funciones.
def ip_address_processor(request): return {'ip_address': request.META['REMOTE_ADDR']}
• Reciben un H\pRequest() como único parámetro.
• Devuelven un diccionario para ser usado como Context().
![Page 394: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/394.jpg)
Context Processors¿Context Processors? Son funciones.
def ip_address_processor(request): return {'ip_address': request.META['REMOTE_ADDR']}
• Reciben un H\pRequest() como único parámetro.
• Devuelven un diccionario para ser usado como Context().
TEMPLATE_CONTEXT_PROCESSORS = ( "django.contrib.auth.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", "django.contrib.messages.context_processors.messages", "website.context_processors.ip_address_processor",)
![Page 395: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/395.jpg)
Context Processors¿Qué ocurre con render_to_response()?
def some_view(request):
# ...
return render_to_response('my_template.html',
my_data_dictionary,
context_instance=RequestContext(request))
![Page 396: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/396.jpg)
Context Processors¿Qué ocurre con render_to_response()?
def some_view(request):
# ...
return render_to_response('my_template.html',
my_data_dictionary,
context_instance=RequestContext(request))
![Page 397: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/397.jpg)
Context Processors¿Qué ocurre con render_to_response()?
def some_view(request):
# ...
return render_to_response('my_template.html',
my_data_dictionary,
context_instance=RequestContext(request))
from django.shortcuts import render_to_responsefrom django.template import RequestContext
def render_response(req, *args, **kwargs): kwargs['context_instance'] = RequestContext(req) return render_to_response(*args, **kwargs)
Consejo
![Page 398: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/398.jpg)
Magia avanzada
1. Context Processors
2.Middleware
3. Caching
4. Deploying Django
5. Apps recomendadas
![Page 399: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/399.jpg)
MiddlewareNos permite escribir funcionalidad reu4lizable que se inserta en el flujo de ejecución de Django
![Page 400: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/400.jpg)
Middlewareclass MyMiddleware(object):
def process_request(self, request): """Se ejecuta antes de que Django decida a qué View llamar. -> HttpRequest(): Se corta el flujo de middleware. -> None: El flujo sigue con el siguiente middleware.""" # ... def process_view(self, request, view_func, view_args, view_kwargs): """Se ejecuta antes de que se llame a la View. -> HttpRequest(): Se corta el flujo de middleware. -> None: El flujo sigue con el siguiente middleware.""" # ...
def process_response(self, request, response): """Se ejecuta después de que la View devuelva una response. -> HttpResponse()""" # ...
def process_exception(self, request, exception): """Se ejecuta cuando una View lanza una excepción. -> HttpResponse(). -> None: La excepción se propaga hasta el cliente.""" # ...
![Page 401: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/401.jpg)
MiddlewareTenemos que incluir nuestro middleware en el lugar que nos convenga, teniendo en cuenta el orden de
ejecución en la Request y en la Response:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
![Page 402: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/402.jpg)
Magia avanzada
1. Context Processors
2.Middleware
3. Caching
4. Deploying Django
5. Apps recomendadas
![Page 403: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/403.jpg)
caching
•Si queremos escalar nuestro proyecto rápidamente.... Cache!
•Recomendado = memcached
•Acceder a la BD es caro, muy caro.
•El Hardware es “gra4s” en comparación con op4mizar código op4mizado.
•Ejemplo (Facebook):
![Page 404: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/404.jpg)
caching
•Si queremos escalar nuestro proyecto rápidamente.... Cache!
•Recomendado = memcached
•Acceder a la BD es caro, muy caro.
•El Hardware es “gra4s” en comparación con op4mizar código op4mizado.
•Ejemplo (Facebook):
300+Tb Memcached
![Page 405: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/405.jpg)
caching
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)def my_view(request): ...
views
![Page 406: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/406.jpg)
caching
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)def my_view(request): ...
views
{% load cache %}{% cache 500 sidebar %} .. sidebar ..{% endcache %}
templates
![Page 407: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/407.jpg)
caching
low level
![Page 408: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/408.jpg)
caching
low level
>>> from django.core.cache import cache>>> cache.set('my_key', 'hello, world!', 30)>>> cache.get('my_key')'hello, world!'
•Podemos cachear cualquier 4po de objeto que se pueda serializar.
• QuerySets• Listas• ...
![Page 409: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/409.jpg)
memcached DEMO
![Page 410: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/410.jpg)
Magia avanzada
1. Context Processors
2.Middleware
3. Caching
4. Deploying Django
5. Apps recomendadas
![Page 411: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/411.jpg)
Deploying Django
![Page 412: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/412.jpg)
Deploying Django
Virtualenv + PIP + Fabric
![Page 413: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/413.jpg)
Virtualenv
•Independencia completa de las librerías del sitema.
•Cada proyecto 4ene su juego de librerías en la versión que necesita•Sin miedo a actualizar
•Sin miedo a migrar
•etc...
![Page 414: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/414.jpg)
Virtualenv
•Independencia completa de las librerías del sitema.
•Cada proyecto 4ene su juego de librerías en la versión que necesita•Sin miedo a actualizar
•Sin miedo a migrar
•etc...
$ virtualenv --no-site-packages mi_entorno
crear
![Page 415: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/415.jpg)
Virtualenv
•Independencia completa de las librerías del sitema.
•Cada proyecto 4ene su juego de librerías en la versión que necesita•Sin miedo a actualizar
•Sin miedo a migrar
•etc...
$ virtualenv --no-site-packages mi_entorno
crear
$ source mi_entorno/bin/activate
ac/var
![Page 416: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/416.jpg)
PIP
•Gestor de paquetes del siglo 21 :D•Permite especificar un fichero de REQUIREMENTS con un listado de paquetes a instalar.
![Page 417: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/417.jpg)
PIP
•Gestor de paquetes del siglo 21 :D•Permite especificar un fichero de REQUIREMENTS con un listado de paquetes a instalar.
Django==1.2.1psycopg2feedparser==4.1stripogram==1.5GChartWrapper==0.8
pip install -E mi_entorno -r REQUIREMENTS
![Page 418: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/418.jpg)
Fabric
Repetition leads to boredom, boredom to horrifying mistakes, horrifying mistakes to God-I-wish-I-was-still-bored“
![Page 419: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/419.jpg)
Fabric
env.user = "example"env.hosts = ["example.com"]def deploy(): run('svn up /home/example/') sudo('/etc/init.d/lighttpd restart')
fabfile.py
Repetition leads to boredom, boredom to horrifying mistakes, horrifying mistakes to God-I-wish-I-was-still-bored“
![Page 420: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/420.jpg)
Fabric
env.user = "example"env.hosts = ["example.com"]def deploy(): run('svn up /home/example/') sudo('/etc/init.d/lighttpd restart')
fabfile.py
fabric deploy
uso
Repetition leads to boredom, boredom to horrifying mistakes, horrifying mistakes to God-I-wish-I-was-still-bored“
![Page 421: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/421.jpg)
Magia avanzada
1. Context Processors
2.Middleware
3. Caching
4. Deploying Django
5. Apps recomendadas
![Page 422: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/422.jpg)
Apps
![Page 423: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/423.jpg)
django-‐registra/on
h\p://bitbucket.org/ubernostrum/django-‐registra4on/
![Page 424: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/424.jpg)
django-‐registra/on
h\p://bitbucket.org/ubernostrum/django-‐registra4on/
•Sistema completo para la ges4ón de usuarios.
•Desde el registro, ac4vación etc...
•DRY!!
•Instalación muy sencilla.
•Recomedado ++
![Page 425: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/425.jpg)
django-‐registra/on
h\p://bitbucket.org/ubernostrum/django-‐registra4on/
![Page 426: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/426.jpg)
django-‐registra/on
h\p://bitbucket.org/ubernostrum/django-‐registra4on/
/ac4vate/complete//ac4vate/<ac4va4on_key>// register// register/complete// register/closed// login// logout// password/change// password/change/done// password/reset// password/reset/confirm/<token>/ password/reset/complete// password/reset/done// reac4vate/
![Page 427: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/427.jpg)
django-‐socialregistra/on
h\p://github.com/flashingpumpkin/django-‐socialregistra4on
![Page 428: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/428.jpg)
django-‐socialregistra/on
h\p://github.com/flashingpumpkin/django-‐socialregistra4on
•Configuración sencilla
•Auten4cación con:
•twi\er, facebook, oauth, openid
•Integración perfecta con contrib.auth
![Page 429: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/429.jpg)
dajaxproject
h\p://dajaxproject.com
![Page 430: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/430.jpg)
dajaxproject
h\p://dajaxproject.com
•Comunicación AJAX muy sencilla
•CrossBrowsing
•Muy ú4l si no sabemos demasiado JS
![Page 431: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/431.jpg)
django-‐locale-‐url
h\p://code.google.com/p/django-‐localeurl/
![Page 432: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/432.jpg)
django-‐locale-‐url
h\p://code.google.com/p/django-‐localeurl/
• Nos permite especificar el idioma en la url
www.example.com/en/
www.example.com/es/
• Mejoras en el SEO
• Cada página 4ene una única url.
• Configuración no tan sencilla, pero interesante.
![Page 433: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/433.jpg)
django-‐piston
h\p://bitbucket.org/jespern/django-‐piston/wiki/Home
![Page 434: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/434.jpg)
django-‐piston
h\p://bitbucket.org/jespern/django-‐piston/wiki/Home
• Framework para crear APIs RESTful
• Muy fácil instalación
• Serialización a:
•JSON, YAML, Python Pyckle, XML ...
•OAuth
•Recomendado +++++
![Page 435: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/435.jpg)
django-‐sentry
h\p://github.com/dcramer/django-‐sentry
![Page 436: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/436.jpg)
django-‐sentry
h\p://github.com/dcramer/django-‐sentry
![Page 437: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/437.jpg)
django-‐debug-‐toolbar
h\p://github.com/robhudson/django-‐debug-‐toolbar
![Page 438: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/438.jpg)
django-‐command-‐extensions
h\p://code.google.com/p/django-‐command-‐extensions/
![Page 439: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/439.jpg)
django-‐command-‐extensions
h\p://code.google.com/p/django-‐command-‐extensions/
•Extensión para “manage.py”
•Muchas u4lidades para el día a día
•Una de las mejores: graph_models
•Usando GraphViz genera un modelo relacional de los modelos de
nuestro proyecto.
![Page 440: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/440.jpg)
django-‐command-‐extensions
![Page 441: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/441.jpg)
django-‐command-‐extensions
![Page 442: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/442.jpg)
django-‐command-‐extensions
![Page 443: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/443.jpg)
django-‐command-‐extensions
![Page 444: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/444.jpg)
Textmate + Django
h\ps://bitbucket.org/bkerr/django-‐textmate-‐bundles
![Page 445: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/445.jpg)
Textmate + Django
h\ps://bitbucket.org/bkerr/django-‐textmate-‐bundles
•Shortcuts para crear:•Modelos
•Fields•Filters•TemplateTags
•Forms
•Admin
Durante el curso lo hemos u4lizado.
![Page 446: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/446.jpg)
La punta del iceberg
![Page 448: Django: Disfruta programando.](https://reader031.fdocuments.net/reader031/viewer/2022012918/5491f671b47959cb5b8b4579/html5/thumbnails/448.jpg)
Disfruta programando.
Jorge Bas4da [neo][email protected]
Jaime Irurzun [etox] [email protected]
@jorgebas4da @jaimeirurzun