435

El libro de Django - vandsproject.files.wordpress.com · El libro de Django - vandsproject.files.wordpress.com ... 5

  • Upload
    lamtram

  • View
    264

  • Download
    3

Embed Size (px)

Citation preview

  • El libro de Django

  • 2

  • ndice general

    Preliminares 19Reconocimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Sobre los autores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Sobre el editor tcnico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Sobre los traductores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

    Sobre el libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

    Introduccin 21

    1. Introduccin a Django 231.1. Qu es un Framework Web? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231.2. El patrn de diseo MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241.3. La historia de Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261.4. Cmo leer este libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    1.4.1. Conocimientos de programacin requeridos . . . . . . . . . . . . . . . . . . . . . 271.4.2. Conocimientos de Python requeridos . . . . . . . . . . . . . . . . . . . . . . . . . 281.4.3. Nuevas caractersticas de Django . . . . . . . . . . . . . . . . . . . . . . . . . . . 281.4.4. Obteniendo ayuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    1.5. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    2. Empezando 292.1. Instalar Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.2. Instalar Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    2.2.1. Instalar un lanzamiento ocial . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.2.2. Instalar Django desde Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    2.3. Congurando la base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.3.1. Usar Django con PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.3.2. Usar Django con SQLite 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.3.3. Usar Django con MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322.3.4. Usar Django sin una base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    2.4. Comenzando un proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322.4.1. El servidor de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    2.5. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    3. Los principios de las pginas Web dinmicas 353.1. Tu primera Vista: Contenido dinmico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.2. Mapeando URLs a Vistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363.3. Cmo se procesa una peticin en Django . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

    3.3.1. Cmo se procesa una peticin en Django: todos los detalles . . . . . . . . . . . . 403.4. URLconfs y el acoplamiento dbil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.5. Errores 404 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    3

  • 4 NDICE GENERAL

    3.6. Tu Segunda Vista: URLs Dinmicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.6.1. Algunas palabras acerca de las URLs bonitas . . . . . . . . . . . . . . . . . . . . 423.6.2. Comodines en los patrones URL . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    3.7. Pginas de error bonitas con Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.8. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    4. El sistema de plantillas de Django 494.1. Sistema bsico de plantillas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494.2. Empleo del sistema de plantillas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    4.2.1. Creacin de objetos Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514.2.2. Renderizar una plantilla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524.2.3. Mltiples contextos, mismas plantillas . . . . . . . . . . . . . . . . . . . . . . . . 544.2.4. Bsqueda del contexto de una variable . . . . . . . . . . . . . . . . . . . . . . . . 544.2.5. Jugando con objetos Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

    4.3. Etiquetas de plantillas bsicas y ltros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584.3.1. Etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584.3.2. Filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    4.4. Filosofa y Limitaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634.5. Uso de plantillas en las vistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644.6. Cargadores de plantillas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

    4.6.1. render_to_response() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674.6.2. El truco locals() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694.6.3. Subdirectorios en get_template() . . . . . . . . . . . . . . . . . . . . . . . . . . . 694.6.4. La etiqueta de plantilla include . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

    4.7. Herencia de plantillas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704.8. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    5. Interactuar con una base de datos: Modelos 755.1. La manera tonta de hacer una consulta a la base de datos en las vistas . . . . . . . . . 755.2. El patrn de diseo MTV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765.3. Conguracin de la base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775.4. Tu primera aplicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805.5. Denir modelos en Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815.6. Tu Primer Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825.7. Instalando el Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835.8. Acceso Bsico a Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865.9. Agregando strings de representacin del Modelo . . . . . . . . . . . . . . . . . . . . . . . 865.10. Insertando y Actualizando Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885.11. Seleccionar objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

    5.11.1. Filtrar datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 895.11.2. Obteniendo objetos individuales . . . . . . . . . . . . . . . . . . . . . . . . . . . 905.11.3. Ordenando datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915.11.4. Encadenando bsquedas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925.11.5. Rebanando datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

    5.12. Eliminando objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925.13. Realizando cambios en el esquema de una base de datos . . . . . . . . . . . . . . . . . . 93

    5.13.1. Agregando campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935.13.2. Eliminando campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955.13.3. Eliminando campos Many-to-Many . . . . . . . . . . . . . . . . . . . . . . . . . . 955.13.4. Eliminando modelos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

    5.14. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

  • NDICE GENERAL 5

    6. El sitio de Administracin Django 976.1. Activando la interfaz de administracin . . . . . . . . . . . . . . . . . . . . . . . . . . . 976.2. Usando la interfaz de administracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

    6.2.1. Usuarios, Grupos y Permisos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 996.3. Personalizando la interfaz de administracin . . . . . . . . . . . . . . . . . . . . . . . . . 1076.4. Personalizando la apariencia de la interfaz de administracin . . . . . . . . . . . . . . . 1096.5. Personalizando la pgina ndice del administrador . . . . . . . . . . . . . . . . . . . . . . 1096.6. Cuando y porqu usar la interfaz de administracin . . . . . . . . . . . . . . . . . . . . . 1106.7. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

    7. Procesamiento de formularios 1137.1. Bsquedas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1137.2. El formulario perfecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157.3. Creacin de un formulario para comentarios . . . . . . . . . . . . . . . . . . . . . . . . . 1167.4. Procesamiento de los datos suministrados . . . . . . . . . . . . . . . . . . . . . . . . . . 1197.5. Nuestras propias reglas de validacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1207.6. Una presentacin personalizada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1217.7. Creating Forms from Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1227.8. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

    8. Vistas avanzadas y URLconfs 1258.1. Trucos de URLconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

    8.1.1. Importacin de funciones de forma efectiva . . . . . . . . . . . . . . . . . . . . . 1258.1.2. Usar mltiples prejos de vista . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1278.1.3. Casos especiales de URLs en modo Debug . . . . . . . . . . . . . . . . . . . . . . 1278.1.4. Usar grupos con nombre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1288.1.5. Comprender el algoritmo de combinacin/agrupacin . . . . . . . . . . . . . . . . 1298.1.6. Pasarle opciones extra a las funciones vista . . . . . . . . . . . . . . . . . . . . . 1298.1.7. Usando argumentos de vista por omisin . . . . . . . . . . . . . . . . . . . . . . . 1348.1.8. Manejando vistas en forma especial . . . . . . . . . . . . . . . . . . . . . . . . . . 1358.1.9. Capturando texto en URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1358.1.10. Entendiendo dnde busca una URLconf . . . . . . . . . . . . . . . . . . . . . . . 136

    8.2. Incluyendo otras URLconfs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1378.2.1. Cmo trabajan los parmetros capturados con include() . . . . . . . . . . . . . . 1378.2.2. Cmo funcionan las opciones extra de URLconf con include() . . . . . . . . . . . 138

    8.3. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

    9. Vistas genricas 1419.1. Usar vistas genricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1419.2. Vistas genricas de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1439.3. Extender las vistas genricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

    9.3.1. Crear contextos de plantilla amistosos . . . . . . . . . . . . . . . . . . . . . . . 1449.3.2. Agregar un contexto extra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1459.3.3. Mostrar subconjuntos de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . 1469.3.4. Filtrado complejo con funciones wrapper . . . . . . . . . . . . . . . . . . . . . . . 1469.3.5. Realizar trabajo extra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

    9.4. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

    10.Extendiendo el sistema de plantillas 15110.1. Revisin del lenguaje de plantillas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15110.2. Procesadores de contexto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

    10.2.1. django.core.context_processors.auth . . . . . . . . . . . . . . . . . . . . . . . . . 15510.2.2. django.core.context_processors.debug . . . . . . . . . . . . . . . . . . . . . . . . 156

  • 6 NDICE GENERAL

    10.2.3. django.core.context_processors.i18n . . . . . . . . . . . . . . . . . . . . . . . . . 15610.2.4. django.core.context_processors.request . . . . . . . . . . . . . . . . . . . . . . . 15610.2.5. Consideraciones para escribir tus propios procesadores de contexto . . . . . . . . 156

    10.3. Detalles internos de la carga de plantillas . . . . . . . . . . . . . . . . . . . . . . . . . . 15710.4. Extendiendo el sistema de plantillas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

    10.4.1. Creando una biblioteca para plantillas . . . . . . . . . . . . . . . . . . . . . . . . 15810.4.2. Escribiendo ltros de plantilla personalizados . . . . . . . . . . . . . . . . . . . . 15910.4.3. Escribiendo etiquetas de plantilla personalizadas . . . . . . . . . . . . . . . . . . 16010.4.4. Un atajo para etiquetas simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16510.4.5. Etiquetas de inclusin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

    10.5. Escribiendo cargadores de plantillas personalizados . . . . . . . . . . . . . . . . . . . . . 16710.6. Usando la referencia de plantillas incorporadas . . . . . . . . . . . . . . . . . . . . . . . 16810.7. Congurando el sistema de plantillas en modo autnomo . . . . . . . . . . . . . . . . . . 16810.8. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

    11.Generacin de contenido no HTML 17111.1. Lo bsico: Vistas y tipos MIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17111.2. Produccin de CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17211.3. Generando PDFs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

    11.3.1. Instalando ReportLab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17311.3.2. Escribiendo tu Vista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17411.3.3. PDFs complejos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

    11.4. Otras posibilidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17511.5. El Framework de Feeds de Sindicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

    11.5.1. Inicializacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17611.5.2. Un Feed simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17711.5.3. Un Feed ms complejo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17811.5.4. Especicando el tipo de Feed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18011.5.5. Enclosures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18011.5.6. Idioma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18011.5.7. URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18111.5.8. Publicando feeds Atom y RSS conjuntamente . . . . . . . . . . . . . . . . . . . . 181

    11.6. El framework Sitemap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18111.6.1. Instalacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18211.6.2. Inicializacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18211.6.3. Clases Sitemap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18311.6.4. Accesos directos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18411.6.5. Creando un ndice Sitemap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18511.6.6. Haciendo ping a Google . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

    11.7. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

    12.Sesiones, usuario e inscripciones 18712.1. Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

    12.1.1. Cmo denir y leer los valores de las cookies . . . . . . . . . . . . . . . . . . . . 18812.1.2. Las cookies tienen doble lo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

    12.2. El entorno de sesiones de Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19012.2.1. Activar sesiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19012.2.2. Usar las sesiones en una vista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19012.2.3. Comprobar que las cookies sean utilizables . . . . . . . . . . . . . . . . . . . . . 19212.2.4. Usar las sesiones fuera de las vistas . . . . . . . . . . . . . . . . . . . . . . . . . . 19312.2.5. Cundo se salvan las sesiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19312.2.6. Sesiones breves frente a sesiones persistentes . . . . . . . . . . . . . . . . . . . . . 19312.2.7. Otras caractersticas de las sesiones . . . . . . . . . . . . . . . . . . . . . . . . . . 194

  • NDICE GENERAL 7

    12.3. Usuarios e identicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19512.3.1. Habilitando el soporte de autenticacin . . . . . . . . . . . . . . . . . . . . . . . 196

    12.4. Utilizando usuarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19612.4.1. Iniciar y cerrar sesin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19812.4.2. Limitar el acceso a los usuarios identicados . . . . . . . . . . . . . . . . . . . . . 20012.4.3. Limitar el acceso a usuarios que pasan una prueba . . . . . . . . . . . . . . . . . 20112.4.4. Gestionar usuarios, permisos y grupos . . . . . . . . . . . . . . . . . . . . . . . . 20212.4.5. Usar informacin de autenticacin en plantillas . . . . . . . . . . . . . . . . . . 205

    12.5. El resto de detalles: permisos, grupos, mensajes y perles . . . . . . . . . . . . . . . . . 20512.5.1. Permisos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20612.5.2. Grupos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20612.5.3. Mensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20712.5.4. Perles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

    12.6. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

    13.Cache 20913.1. Activando el Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

    13.1.1. Memcached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21013.1.2. Cache en Base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21013.1.3. Cache en Sistema de Archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21113.1.4. Cache en Memoria local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21113.1.5. Cache Simple (para desarrollo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21113.1.6. Cache Dummy (o estpida) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21213.1.7. Argumentos de CACHE_BACKEND . . . . . . . . . . . . . . . . . . . . . . . . 212

    13.2. La cache por sitio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21213.3. Cache por vista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

    13.3.1. Especicando la cache por vista en URLconf . . . . . . . . . . . . . . . . . . . . 21413.4. La API de cache de bajo nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21413.5. Caches upstream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216

    13.5.1. Usando el encabezado Vary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21613.5.2. Otros Encabezados de cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218

    13.6. Otras optimizaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21913.7. Orden de MIDDLEWARE_CLASSES . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21913.8. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

    14.Otros sub-frameworks contribuidos 22114.1. La biblioteca estndar de Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22114.2. Sites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

    14.2.1. Escenario 1: reuso de los datos en mltiples sitios . . . . . . . . . . . . . . . . . . 22214.2.2. Escenario 2: alojamiento del nombre/dominio de tu sitio en un solo lugar . . . . 22214.2.3. Modo de uso del framework sites . . . . . . . . . . . . . . . . . . . . . . . . . . . 22314.2.4. Las capacidades del framework Sites . . . . . . . . . . . . . . . . . . . . . . . . . 22314.2.5. CurrentSiteManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22614.2.6. El uso que hace Django del framework Sites . . . . . . . . . . . . . . . . . . . . . 227

    14.3. Flatpages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22814.3.1. Usando atpages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22814.3.2. Agregando, modicando y eliminando atpages . . . . . . . . . . . . . . . . . . . 22914.3.3. Usando plantillas de atpages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

    14.4. Redirects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23014.4.1. Usando el framework redirects . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23014.4.2. Agregando, modicando y eliminando redirecciones . . . . . . . . . . . . . . . . . 231

    14.5. Proteccin contra CSRF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23214.5.1. Un ejemplo simple de CSRF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232

  • 8 NDICE GENERAL

    14.5.2. Un ejemplo ms complejo de CSRF . . . . . . . . . . . . . . . . . . . . . . . . . 23214.5.3. Previniendo la CSRF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232

    14.6. Haciendo los datos mas humanos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23414.6.1. apnumber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23414.6.2. intcomma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23414.6.3. intword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23414.6.4. ordinal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

    14.7. Filtros de marcado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23514.8. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

    15.Middleware 23715.1. Qu es middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23715.2. Instalacin de Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23815.3. Mtodos de un Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

    15.3.1. Inicializar: __init__(self) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23815.3.2. Pre-procesador de peticin: process_request(self, request) . . . . . . . . . . . . . 23915.3.3. Pre-procesador de vista: process_view(self, request, view, args, kwargs) . . . . . 23915.3.4. Pos-procesador de respuesta: process_response(self, request, response) . . . . . . 23915.3.5. Pos-procesador de excepcin: process_exception(self, request, exception) . . . . . 240

    15.4. Middleware incluido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24015.4.1. Middleware de soporte de autenticacin . . . . . . . . . . . . . . . . . . . . . . . 24015.4.2. Middleware Common . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24015.4.3. Middleware de compresin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24115.4.4. Middleware de GET condicional . . . . . . . . . . . . . . . . . . . . . . . . . . . 24115.4.5. Soporte de proxy inverso (Middleware X-Forwarded-For) . . . . . . . . . . . . . . 24215.4.6. Middleware de soporte de sesin . . . . . . . . . . . . . . . . . . . . . . . . . . . 24215.4.7. Middleware de cache de todo el sitio . . . . . . . . . . . . . . . . . . . . . . . . . 24215.4.8. Middleware de transaccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24215.4.9. Middleware X-View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

    15.5. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

    16.Integracin con Base de datos y Aplicaciones existentes 24316.1. Integracin con una base de datos existente . . . . . . . . . . . . . . . . . . . . . . . . . 243

    16.1.1. Empleo de inspectdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24316.1.2. Limpiar los modelos generados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

    16.2. Integracin con un sistema de autenticacin . . . . . . . . . . . . . . . . . . . . . . . . 24516.2.1. Especicar los back-ends de autenticacin . . . . . . . . . . . . . . . . . . . . . 24516.2.2. Escribir un back-end de autenticacin . . . . . . . . . . . . . . . . . . . . . . . . 245

    16.3. Integracin con aplicaciones web existentes . . . . . . . . . . . . . . . . . . . . . . . . . 24716.4. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

    17.Extendiendo la Interfaz de Administracin de Django 24917.1. El Zen de la aplicacin Admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250

    17.1.1. Usuarios conables ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25017.1.2. ... editando ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25017.1.3. ... contenido estructurado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25117.1.4. Parada Completa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

    17.2. Pesonalizando las plantillas de la interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . 25117.2.1. Plantillas de modelos propios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25217.2.2. JavaScript Personalizado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

    17.3. Creando vistas de administracin personalizadas . . . . . . . . . . . . . . . . . . . . . . 25417.4. Sobreescribiendo vistas incorporadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25617.5. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

  • NDICE GENERAL 9

    18.Internacionalizacin 25918.1. Especicando cadenas de traduccin en cdigo Python . . . . . . . . . . . . . . . . . . . 260

    18.1.1. Funciones estndar de traduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . 26018.1.2. Marcando cadenas como no-op . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26118.1.3. Traduccin perezosa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26118.1.4. Pluralizacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262

    18.2. Especicando cadenas de traduccin en cdigo de plantillas . . . . . . . . . . . . . . . . 26218.3. Creando archivos de idioma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263

    18.3.1. Creando los archivos de mensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . 26318.3.2. Compilando archivos de mensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . 265

    18.4. Cmo descubre Django la preferencia de idioma . . . . . . . . . . . . . . . . . . . . . . . 26518.5. La vista de redireccin set_language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26718.6. Usando traducciones en tus propios proyectos . . . . . . . . . . . . . . . . . . . . . . . . 26818.7. Traducciones y JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269

    18.7.1. La vista javascript_catalog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26918.7.2. Usando el catlogo de traducciones JavaScript . . . . . . . . . . . . . . . . . . . 27018.7.3. Creando catlogos de traducciones JavaScript . . . . . . . . . . . . . . . . . . . . 270

    18.8. Notas para usuarios familiarizados con gettext . . . . . . . . . . . . . . . . . . . . . . . 27018.9. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271

    19.Seguridad 27319.1. El tema de la seguridad en la Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27319.2. Inyeccin de SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274

    19.2.1. La solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27419.3. Cross-Site Scripting (XSS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275

    19.3.1. La solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27619.4. Cross-Site Request Forgery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27619.5. Session Forging/Hijacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

    19.5.1. La solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27719.6. Inyeccin de cabeceras de email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278

    19.6.1. La solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27819.7. Directory Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279

    19.7.1. La solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27919.8. Exposicin de mensajes de error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280

    19.8.1. La solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28019.9. Palabras nales sobre la seguridad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28119.10.Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281

    20.Implementando Django 28320.1. Nada Compartido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28420.2. Un nota sobre preferencias personales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28520.3. Usando Django con Apache y mod_python . . . . . . . . . . . . . . . . . . . . . . . . . 285

    20.3.1. Conguracin bsica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28620.3.2. Corriendo multiples instalaciones de Django en la misma instancia Apache . . . 28720.3.3. Corriendo un servidor de desarrollo con mod_python . . . . . . . . . . . . . . . 28820.3.4. Sirviendo Django y archivos multimedia desde la misma instancia Apache . . . . 28820.3.5. Manejo de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28920.3.6. Manejando fallas de segmentacin . . . . . . . . . . . . . . . . . . . . . . . . . . 289

    20.4. Usando Django con FastCGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29020.4.1. Descripcin de FastCGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29020.4.2. Ejecutando tu Servidor FastCGI . . . . . . . . . . . . . . . . . . . . . . . . . . . 29020.4.3. Usando Django con Apache y FastCGI . . . . . . . . . . . . . . . . . . . . . . . . 29120.4.4. FastCGI y lighttpd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

  • 10 NDICE GENERAL

    20.4.5. Ejecutando Django en un Proveedor de Hosting Compartido con Apache . . . . . 29320.5. Escalamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

    20.5.1. Ejecutando en un Servidor nico . . . . . . . . . . . . . . . . . . . . . . . . . . . 29520.5.2. Separando el Servidor de Bases de Datos . . . . . . . . . . . . . . . . . . . . . . 29520.5.3. Ejecutando un Servidor de Medios Separado . . . . . . . . . . . . . . . . . . . . . 29620.5.4. Implementando Balance de Carga y Redundancia . . . . . . . . . . . . . . . . . . 29620.5.5. Yendo a lo grande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

    20.6. Ajuste de Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29920.6.1. No hay tal cosa como demasiada RAM . . . . . . . . . . . . . . . . . . . . . . . . 29920.6.2. Deshabilita Keep-Alive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30120.6.3. Usa memcached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30120.6.4. Usa memcached siempre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30120.6.5. nete a la Conversacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

    20.7. Qu sigue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

    A. Casos de estudio 303A.1. Casting de personajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303A.2. Por qu Django? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304A.3. Comenzando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305A.4. Portando cdigo existente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306A.5. Cmo les fue? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306A.6. Estructura de Equipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308A.7. Implementacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308

    B. Referencia de la Denicin de Modelos 311B.1. Campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311

    B.1.1. AutoField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312B.1.2. BooleanField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312B.1.3. CharField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312B.1.4. CommaSeparatedIntegerField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312B.1.5. DateField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312B.1.6. DateTimeField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312B.1.7. EmailField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313B.1.8. FileField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313B.1.9. FilePathField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314B.1.10. FloatField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314B.1.11. ImageField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314B.1.12. IntegerField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315B.1.13. IPAddressField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315B.1.14.NullBooleanField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315B.1.15. PhoneNumberField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315B.1.16. PositiveIntegerField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315B.1.17. PositiveSmallIntegerField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315B.1.18. SlugField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315B.1.19. SmallIntegerField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316B.1.20.TextField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316B.1.21.TimeField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316B.1.22.URLField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316B.1.23.USStateField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316B.1.24.XMLField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316

    B.2. Opciones Universales de Campo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316B.2.1. null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316B.2.2. blank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317

  • NDICE GENERAL 11

    B.2.3. choices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317B.2.4. db_column . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317B.2.5. db_index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318B.2.6. default . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318B.2.7. editable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318B.2.8. help_text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318B.2.9. primary_key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318B.2.10. radio_admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318B.2.11. unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318B.2.12. unique_for_date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318B.2.13. unique_for_month . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319B.2.14. unique_for_year . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319B.2.15. verbose_name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

    B.3. Relaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319B.3.1. Relaciones Muchos-a-Uno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319B.3.2. Relaciones Muchos-a-Muchos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321

    B.4. Opciones de los Metadatos del Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322B.4.1. db_table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323B.4.2. get_latest_by . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323B.4.3. order_with_respect_to . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323B.4.4. ordering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324B.4.5. permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324B.4.6. unique_together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324B.4.7. verbose_name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325B.4.8. verbose_name_plural . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325

    B.5. Managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325B.5.1. Nombres de Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325B.5.2. Managers Personalizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326

    B.6. Mtodos de Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328B.6.1. __str__ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329B.6.2. get_absolute_url . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329B.6.3. Ejecutando SQL personalizado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330B.6.4. Sobreescribiendo los Mtodos por omisin del Modelo . . . . . . . . . . . . . . . 330

    B.7. Opciones del Administrador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331B.7.1. date_hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331B.7.2. elds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331B.7.3. js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333B.7.4. list_display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333B.7.5. list_display_links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334B.7.6. list_lter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335B.7.7. list_per_page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335B.7.8. list_select_related . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335B.7.9. ordering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335B.7.10. save_as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336B.7.11. save_on_top . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336B.7.12. search_elds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336

    C. Referencia API para Base de Datos 339C.1. Creando Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340

    C.1.1. Qu pasa cuando t grabas? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340C.1.2. Autoincrementando Primary Keys . . . . . . . . . . . . . . . . . . . . . . . . . . 340

    C.2. Grabando Cambios de Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341C.3. Recuperando Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342

  • 12 NDICE GENERAL

    C.4. Caching and QuerySets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343C.5. Filtrando Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343

    C.5.1. Chaining Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343C.5.2. Limitando QuerySets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344C.5.3. Mtodos Query Que Retornan Nuevos QuerySets . . . . . . . . . . . . . . . . . . 345C.5.4. QuerySet Methods That Do Not Return QuerySets . . . . . . . . . . . . . . . . . 349

    C.6. Field Lookups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351C.6.1. exact . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351C.6.2. iexact . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351C.6.3. contains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352C.6.4. icontains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352C.6.5. gt, gte, lt, and lte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352C.6.6. in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352C.6.7. startswith . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353C.6.8. istartswith . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353C.6.9. endswith and iendswith . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353C.6.10. range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353C.6.11. year, month, and day . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353C.6.12. isnull . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353C.6.13. search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354C.6.14.The pk Lookup Shortcut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354

    C.7. Complex Lookups with Q Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354C.8. Related Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355

    C.8.1. Lookups That Span Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . 355C.8.2. Foreign Key Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356C.8.3. Reverse Foreign Key Relationships . . . . . . . . . . . . . . . . . . . . . . . . . 356C.8.4. Many-to-Many Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358C.8.5. Queries Over Related Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358

    C.9. Deleting Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359C.10.Extra Instance Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359

    C.10.1. get_FOO_display() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359C.10.2. get_next_by_FOO(**kwargs) and get_previous_by_FOO(**kwargs) . . . . . 360C.10.3. get_FOO_lename() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360C.10.4. get_FOO_url() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360C.10.5. get_FOO_size() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360C.10.6. save_FOO_le(lename, raw_contents) . . . . . . . . . . . . . . . . . . . . . . . 360C.10.7. get_FOO_height() and get_FOO_width() . . . . . . . . . . . . . . . . . . . . . 360

    C.11.Shortcuts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360C.11.1. get_object_or_404() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361C.11.2. get_list_or_404() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361

    C.12.Falling Back to Raw SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361

    D. Referencia de las vistas genricas 363D.1. Argumentos comunes a todas las vistas genricas . . . . . . . . . . . . . . . . . . . . . . 363D.2. Vistas genricas simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364

    D.2.1. Representar una plantilla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364D.2.2. Redirigir a otra URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364

    D.3. Vistas de listado/detalle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365D.3.1. Listas de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365D.3.2. Vista de detalle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367

    D.4. Vistas genricas basadas en fechas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369D.4.1. ndice de archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369D.4.2. Archivos anuales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371

  • NDICE GENERAL 13

    D.4.3. Archivos mensuales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372D.4.4. Archivos semanales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374D.4.5. Archivos diarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375D.4.6. Archivo para hoy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376D.4.7. Pginas de detalle basadas en fecha . . . . . . . . . . . . . . . . . . . . . . . . . . 377

    D.5. Create/Update/Delete Generic Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378D.5.1. Create Object View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379D.5.2. Update Object View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380D.5.3. Delete Object View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381

    E. Variables de conguracin 383E.1. Qu es un archivo de conguracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383

    E.1.1. Valores por omisin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383E.1.2. Viendo cules variables de conguracin has cambiado . . . . . . . . . . . . . . . 384E.1.3. Usando variables de conguracin en cdigo Python . . . . . . . . . . . . . . . . 384E.1.4. Modicando variables de conguracin en tiempo de ejecucin . . . . . . . . . . 384E.1.5. Seguridad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384E.1.6. Creando tus propias variables de conguracin . . . . . . . . . . . . . . . . . . . 384

    E.2. Designating the Settings: DJANGO_SETTINGS_MODULE . . . . . . . . . . . . . . . 385E.2.1. The django-admin.py Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385E.2.2. On the Server (mod_python) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385

    E.3. Using Settings Without Setting DJANGO_SETTINGS_MODULE . . . . . . . . . . . 385E.3.1. Custom Default Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386E.3.2. Either congure() or DJANGO_SETTINGS_MODULE Is Required . . . . . . . 386

    E.4. Available Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387E.4.1. ABSOLUTE_URL_OVERRIDES . . . . . . . . . . . . . . . . . . . . . . . . . . 387E.4.2. ADMIN_FOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387E.4.3. ADMIN_MEDIA_PREFIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387E.4.4. ADMINS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387E.4.5. ALLOWED_INCLUDE_ROOTS . . . . . . . . . . . . . . . . . . . . . . . . . . 387E.4.6. APPEND_SLASH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388E.4.7. CACHE_BACKEND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388E.4.8. CACHE_MIDDLEWARE_KEY_PREFIX . . . . . . . . . . . . . . . . . . . . . 388E.4.9. DATABASE_ENGINE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388E.4.10. DATABASE_HOST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388E.4.11. DATABASE_NAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388E.4.12. DATABASE_OPTIONS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388E.4.13. DATABASE_PASSWORD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388E.4.14. DATABASE_PORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388E.4.15. DATABASE_USER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389E.4.16. DATE_FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389E.4.17. DATETIME_FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389E.4.18. DEBUG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389E.4.19. DEFAULT_CHARSET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389E.4.20. DEFAULT_CONTENT_TYPE . . . . . . . . . . . . . . . . . . . . . . . . . . . 389E.4.21. DEFAULT_FROM_EMAIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389E.4.22. DISALLOWED_USER_AGENTS . . . . . . . . . . . . . . . . . . . . . . . . . . 390E.4.23. EMAIL_HOST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390E.4.24. EMAIL_HOST_PASSWORD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390E.4.25. EMAIL_HOST_USER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390E.4.26. EMAIL_PORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390E.4.27. EMAIL_SUBJECT_PREFIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390E.4.28. FIXTURE_DIRS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390

  • 14 NDICE GENERAL

    E.4.29. IGNORABLE_404_ENDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390E.4.30. IGNORABLE_404_STARTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390E.4.31. INSTALLED_APPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391E.4.32. INTERNAL_IPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391E.4.33. JING_PATH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391E.4.34. LANGUAGE_CODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391E.4.35. LANGUAGES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391E.4.36.MANAGERS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392E.4.37.MEDIA_ROOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392E.4.38.MEDIA_URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392E.4.39.MIDDLEWARE_CLASSES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392E.4.40.MONTH_DAY_FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392E.4.41. PREPEND_WWW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392E.4.42. PROFANITIES_LIST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392E.4.43. ROOT_URLCONF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393E.4.44. SECRET_KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393E.4.45. SEND_BROKEN_LINK_EMAILS . . . . . . . . . . . . . . . . . . . . . . . . . 393E.4.46. SERIALIZATION_MODULES . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393E.4.47. SERVER_EMAIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393E.4.48. SESSION_COOKIE_AGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393E.4.49. SESSION_COOKIE_DOMAIN . . . . . . . . . . . . . . . . . . . . . . . . . . . 393E.4.50. SESSION_COOKIE_NAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393E.4.51. SESSION_COOKIE_SECURE . . . . . . . . . . . . . . . . . . . . . . . . . . . 393E.4.52. SESSION_EXPIRE_AT_BROWSER_CLOSE . . . . . . . . . . . . . . . . . . 394E.4.53. SESSION_SAVE_EVERY_REQUEST . . . . . . . . . . . . . . . . . . . . . . . 394E.4.54. SITE_ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394E.4.55. TEMPLATE_CONTEXT_PROCESSORS . . . . . . . . . . . . . . . . . . . . . 394E.4.56. TEMPLATE_DEBUG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394E.4.57. TEMPLATE_DIRS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394E.4.58. TEMPLATE_LOADERS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394E.4.59. TEMPLATE_STRING_IF_INVALID . . . . . . . . . . . . . . . . . . . . . . . 395E.4.60. TEST_RUNNER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395E.4.61. TEST_DATABASE_NAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395E.4.62. TIME_FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395E.4.63. TIME_ZONE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395E.4.64. URL_VALIDATOR_USER_AGENT . . . . . . . . . . . . . . . . . . . . . . . . 395E.4.65. USE_ETAGS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396E.4.66. USE_I18N . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396E.4.67. YEAR_MONTH_FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396

    F. Etiquetas de plantilla y ltros predenidos 397F.1. Etiquetas predenidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397

    F.1.1. block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397F.1.2. comment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397F.1.3. cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397F.1.4. debug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398F.1.5. extends . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398F.1.6. lter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398F.1.7. rstof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398F.1.8. for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399F.1.9. if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399F.1.10. ifchanged . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400F.1.11. ifequal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401

  • NDICE GENERAL 15

    F.1.12. ifnotequal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401F.1.13. include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401F.1.14. load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401F.1.15. now . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402F.1.16. regroup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404F.1.17. spaceless . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405F.1.18. ssi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405F.1.19. templatetag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405F.1.20. url . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406F.1.21. widthratio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406

    F.2. Filtros predenidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406F.2.1. add . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406F.2.2. addslashes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407F.2.3. caprst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407F.2.4. center . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407F.2.5. cut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407F.2.6. date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407F.2.7. default . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407F.2.8. default_if_none . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407F.2.9. dictsort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408F.2.10. dictsortreversed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408F.2.11. divisibleby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408F.2.12. escape . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408F.2.13. lesizeformat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408F.2.14. rst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409F.2.15. x_ampersands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409F.2.16. oatformat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409F.2.17. get_digit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409F.2.18. join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409F.2.19. length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410F.2.20. length_is . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410F.2.21. linebreaks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410F.2.22. linebreaksbr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410F.2.23. linenumbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410F.2.24. ljust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410F.2.25. lower . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410F.2.26. make_list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411F.2.27. phone2numeric . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411F.2.28. pluralize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411F.2.29. pprint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411F.2.30. random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411F.2.31. removetags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412F.2.32. rjust . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412F.2.33. slice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412F.2.34. slugify . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412F.2.35. stringformat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412F.2.36. striptags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412F.2.37. time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413F.2.38. timesince . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413F.2.39. timeuntil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413F.2.40. title . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413F.2.41. truncatewords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413F.2.42. truncatewords_html . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414

  • 16 NDICE GENERAL

    F.2.43. unordered_list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414F.2.44. upper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414F.2.45. urlencode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414F.2.46. urlize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415F.2.47. urlizetrunc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415F.2.48. wordcount . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415F.2.49. wordwrap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415F.2.50. yesno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415

    G. El utilitario django-admin 417G.1. Uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417G.2. Acciones Disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418

    G.2.1. adminindex [appname appname ...] . . . . . . . . . . . . . . . . . . . . . . . . . . 418G.2.2. createcachetable [tablename] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418G.2.3. dbshell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418G.2.4. disettings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418G.2.5. dumpdata [appname appname ...] . . . . . . . . . . . . . . . . . . . . . . . . . . . 418G.2.6. ush . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418G.2.7. inspectdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419G.2.8. loaddata [xture xture ...] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419G.2.9. reset [appname appname ...] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420G.2.10.runfcgi [options] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420G.2.11.runserver [nmero de puerto opcional, or direccinIP:puerto] . . . . . . . . . . . 420G.2.12.shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421G.2.13.sql [appname appname ...] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421G.2.14.sqlall [appname appname ...] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421G.2.15.sqlclear [appname appname ...] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421G.2.16.sqlcustom [appname appname ...] . . . . . . . . . . . . . . . . . . . . . . . . . . . 422G.2.17.sqlindexes [appname appname ...] . . . . . . . . . . . . . . . . . . . . . . . . . . . 422G.2.18.sqlreset [appname appname ...] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422G.2.19.sqlsequencereset [appname appname ...] . . . . . . . . . . . . . . . . . . . . . . . 422G.2.20.startapp [appname] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422G.2.21.startproject [projectname] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422G.2.22.syncdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422G.2.23.test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423G.2.24.validate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423

    G.3. Opciones Disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423G.3.1. --settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423G.3.2. --pythonpath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423G.3.3. --format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423G.3.4. --help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423G.3.5. --indent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424G.3.6. --noinput . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424G.3.7. --noreload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424G.3.8. --version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424G.3.9. --verbosity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424G.3.10.--adminmedia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424

  • NDICE GENERAL 17

    H. Objetos Peticin y Respuesta 425H.1. HttpRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425

    H.1.1. Objetos QueryDict . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428H.1.2. Un ejemplo completo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429

    H.2. HttpResponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430H.2.1. Construccin de HttpResponses . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430H.2.2. Establecer las cabeceras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431H.2.3. Subclases de HttpResponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431H.2.4. Retornar Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432H.2.5. Personalizar la Vista 404 (Not Found) . . . . . . . . . . . . . . . . . . . . . . . . 432H.2.6. Personalizar la Vista 500 (Server Error) . . . . . . . . . . . . . . . . . . . . . . . 433

    I. Docutils System Messages 435

  • 18 NDICE GENERAL

  • Preliminares

    Reconocimientos

    El aspecto ms graticante de trabajar con Django es la comunidad. Hemos sido especialmenteafortunados de que Django haya atrado a tanta gente inteligente, motivada y amistosa. Un segmento deesa comunidad nos sigui durante el lanzamiento online beta de este libro. Sus revisiones y comentariosfueron indispensables; este libro no hubiese sido posible sin esa maravillosa revisin de pares. Casi milpersonas dejaron comentarios que ayudaron a mejorar la claridad, calidad y el ujo del libro nal.Queremos agradecer a todos y cada uno de ellos.

    Estamos especialmente agradecidos con aquellos que dispusieron de su tiempo para revisar el libroen profundidad y dejarnos decenas (a veces cientos) de comentarios: Marty Alchin, Max Battcher,Oliver Beat- tie, Rod Begbie, Paul Bissex, Matt Boersma, Robbin Bonthond, Peter Bowyer, NestaCampbell, Jon Colverson, Je Croft, Chris Dary, Alex Dong, Matt Drew, Robert Dzikowski, NickEord, Ludvig Ericson, Eric Floehr, Brad Fults, David Grant, Simon Greenhill, Robert Haveman,Kent Johnson, Andrew Kember, Marek Kubica, Eduard Kucera, Anand Kumria, Scott Lamb, FredrikLundh, Vadim Macagon, Markus Majer, Orestis Markou, R. Mason, Yasushi Masuda, Kevin Menard,Carlo Miron, James Mulholland, R.D. Nielsen, Michael O'Keefe, Lawrence Oluyede, Andreas Pfrengle,Frankie Robertson, Mike Robinson, Armin Ronacher, Daniel Roseman, Johan Samyn, Ross Shannon,Carolina F. Silva, Paul Smith, Bjrn Stabell, Bob Stepno, Graeme Stevenson, Justin Stockton, KevinTeague, Daniel Tietze, Brooks Travis, Peter Tripp, Matthias Urlichs, Peter van Kampen, AlexandreVassalotti, Jay Wang, Brian Will, y Joshua Works.

    Muchas gracias a nuestro editor tcnico, Jeremy Dunck. Sin Jeremy, este libro habra quedado endesorden, con errores, inexactitudes y cdigo roto. Nos sentimos realmente afortunados de que alguiencon el talento de Jeremy encontrase el tiempo de ayudarnos.

    Un especial agradecimiento a SimonWillison por escribir el capitulo de procesamiento de formularios.Realmente apreciamos la ayuda y nos emociona que la excelente escritura de Simon pueda ser parte deeste libro.

    Estamos agradecidos por todo el duro trabajo que la gente de Apress puso en este libro. Su ayuda ypaciencia ha sido asombrosa; este libro no habra quedado terminado sin todo ese trabajo de su parte.Nos pone especialmente felices que Apress haya apoyado e incluso alentado el lanzamiento libre de estelibro on line; es maravilloso ver a un editor tan abrazado al espritu del open source.

    Finalmente, por supuesto, gracias a nuestros amigos, familias y compaeros que gentilmente toler-aron nuestra ausencia mental mientras terminbamos este trabajo.

    Sobre los autores

    Adrian Holovaty, desarrollador Web y periodista, es uno de los creadores y desarrolladores del n-cleo de Django. Es el fundador de EveryBlock, una Web startup local de noticias. Cuando no est traba-jando en mejoras para Django, Adrian hackea en proyectos de benecio publico, como chicagocrime.org,uno de los mashups originales de Google Maps. Vive en Chicago y mantiene un weblog en holovaty.com.

    Jacob Kaplan-Moss es uno de los principales desarrolladores de Django. En su empleo diurno, esel desarrollador principal para el Lawrence Journal-World, un peridico de dueos locales en Lawrence,

    19

    http://holovaty.com/
  • 20 NDICE GENERAL

    Kansas, donde Django fue desarrollado. En el Journal-World, supervisa el desarrollo de Ellington, unaplataforma de publicacin online de noticias para compaas de medios de comunicacin. A Jacob se lopuede encontrar online en jacobian.org.

    Sobre el editor tcnico

    Jeremy Dunck es el principal desarrollador de Pegasus News, un sitio local personalizado con baseen Dallas, Texas. Es uno de los primeros colaboradores de Greasemonkey y Django y ve la tecnologacomo una herramienta para la comunicacin y el acceso al conocimiento.

    Sobre los traductores

    La traduccin al espaol de El libro de Django fue posible gracias a la colaboracin voluntariade la comunidad Django en Espaol y Python Argentina. El proyecto se lleva a cabo desde http://humitos.homelinux.net/django-book . A la fecha, han contribuido de una u otra manera a estetrabajo:

    Manuel Kaufmann

    Martn Gaitn

    Leonardo Gastn De Luca

    Guillermo Heizenreder

    Alejandro Autaln

    Renzo Carbonara

    Milton Mazzarri

    Ramiro Morales

    Juan Ignacio Rodrguez de Len

    Percy Prez Pinedo

    Toms Casquero

    Marcos Agustn Lewis

    Lenidas Hernn Olivera

    Sobre el libro

    Ests leyendo El libro de Django, publicado en Diciembre de 2007 por Apress con el ttulo TheDenitive Guide to Django: Web Development Done Right .

    Hemos lanzado este libro libremente por un par de razones. La primera es que amamos Djangoy queremos que sea tan accesible como sea posible. Muchos programadores aprenden su arte desdematerial tcnico bien escrito, as que nosotros intentamos escribir una gua destacada que sirva ademscomo referencia para Django.

    La segunda, es que resulta que escribir libros sobre tecnologa es particularmente difcil: sus palabrasse vuelven anticuadas incluso antes de que el libro llegue a la imprenta. En la web, sin embargo, latinta nunca se seca -- podremos mantener este libro al da (y as lo haremos) --.

    La respuesta de los lectores es una parte crtica de ese proceso. Hemos construido un sistema decomentarios que te dejar comentar sobre cualquier parte del libro; leeremos y utilizaremos estos co-mentarios en nuevas versiones.

    http://jacobian.org/http://www.django.eshttp://www.python.org/arhttp://humitos.homelinux.net/django-bookhttp://humitos.homelinux.net/django-bookhttp://nqnwebs.comhttp://www.milmazz.comhttp://tomascasquero.comhttp://www.apress.com/http://www.apress.com/book/view/1590597257/http://www.apress.com/book/view/1590597257/http://www.djangobook.com/about/comments/http://www.djangobook.com/about/comments/
  • Introduccin

    Al comienzo, los desarrolladores web escriban cada una de las pginas a mano. Actualizar un sitioweb signicaba editar HTML; un rediseo implicaba rehacer cada una de las pginas, una por vez.

    Como los sitios web crecieron y se hicieron ms ambiciosos, rpidamente se hizo obvio que estasituacin era tediosa, consuma tiempo y al nal era insostenible. Un grupo de emprendedores del NCSA(Centro Nacional de Aplicaciones para Supercomputadoras, donde Mosaic, el primer navegador webgrco, fue desarrollado) solucion este problema permitiendo que el servidor web invocara programasexternos capaces de generar HTML dinmicamente. Ellos llamaron a este protocolo Puerta de EnlaceComn, o CGI [1], y esto cambi la web para siempre.

    Ahora es duro imaginar lo que una revelacin CGI debe haber sido: en vez de tratar con pginasHTML como simples archivos del disco, CGI te permite pensar en pginas como recursos generadosdinmicamente por demanda. El desarrollo de CGI hace pensar en la primera generacin de pgina webdinmicas.

    Sin embargo, CGI tiene sus problemas: los scripts CGI necesitan contener gran cantidad de cdigorepetitivo, que hacen difcil la reutilizacin de cdigo, y que puede ser difcil para los desarrolladoresnovatos escribir y entender.

    PHP solucion varios de estos problemas y tom el mundo por sorpresa --ahora es, por lejos, laherramienta ms popular usada para crear sitios web dinmicos, y decenas de lenguajes y entornossimilares (ASP, JSP, etc.) siguieron de cerca el diseo de PHP. La mayor innovacin de PHP es que esfcil de usar: el cdigo PHP es simple de embeber en un HTML plano; la curva de aprendizaje paraalgunos que recin conocen HTML es extremadamente llana.

    Pero PHP tiene sus propios problemas; por su facilidad de uso alienta a la produccin de cdigo malhecho. Lo que es peor, PHP hace poco para proteger a los programadores en cuanto a vulnerabilidadesde seguridad, por lo que muchos desarrolladores de PHP se encontraron con que tenan que aprendersobre seguridad cuando ya era demasiado tarde.

    Estas y otras frustraciones similares, condujeron directamente al desarrollo de los actuales frame-works de desarrollo web de tercera generacin. Estos frameworks -- Django y Ruby on Rails parecenser muy populares en estos das -- reconocen que la importancia web se ha intensicado en los ltimostiempos. Con esta nueva explosin del desarrollo web comienza otro incremento en la ambicin; losdesarrolladores web esperan hacer ms y ms cada da.

    Django fue inventado para satisfacer esas nuevas ambiciones. Django te permite construir en profun-didad, de forma dinmica, sitios interesantes en un tiempo extremadamente corto. Django est diseadopara hacer foco en la diversin, en las partes interesantes de tu trabajo, al mismo tiempo que alivia eldolor de los bits repetitivos. Al hacerlo, proporciona abstracciones de alto nivel de patrones comunesdel desarrollo web, atajos para tareas frecuentes de programacin y claras convenciones sobre cmo re-solver problemas. Al mismo tiempo, Django intenta estar fuera de tu camino, dejando tu trabajo fueradel alcance del framework cuando es necesario. Escribimos este libro porque creemos rmemente queDjango hace el desarrollo web mejor. Est diseado para poner rpidamente en movimiento tu propioproyecto de Django, en ltima instancia aprenders todo lo que necesites saber para producir un diseo,desarrollo y despliegue de sitios satisfactorios y de los cuales te sientas orgulloso.

    Estamos extremadamente interesados en la retroalimentacin. La versin online de este libro tepermite dejar un comentario en cualquier parte del libro y discutir con otros lectores. Hacemos cuantopodemos para leer todos los comentarios posteados all y responder tantos como sea posible. Si preeres

    21

  • 22 NDICE GENERAL

    utilizar el correo electrnico, por favor envanos unas lneas (en ingls) a [email protected] cualquier modo, nos encantara escucharte! Nos alegra que ests aqu, y esperamos que encuentresa Django tan emocionante, divertido y til como nosotros.

    [1] N. del T.: Common Gateway Interface

    mailto:[email protected]
  • Captulo 1

    Introduccin a Django

    Este libro es sobre Django, un framework de desarrollo Web que ahorra tiempo y hace que eldesarrollo Web sea divertido. Utilizando Django puedes crear y mantener aplicaciones Web de altacalidad con mnimo esfuerzo.

    En su mejor estado, el desarrollo web es un acto entretenido y creativo; en su peor estado, puedeser una molestia repetitiva y frustrante. Django te permite enfocarte en la parte divertida -- el quidde tus aplicaciones Web -- al mismo tiempo que mitiga el esfuerzo de las partes repetitivas. De estaforma, provee un alto nivel de abstraccin de patrones comunes en el desarrollo Web, atajos para tareasfrecuentes de programacin y convenciones claras sobre como solucionar problemas. Al mismo tiempo,Django intenta no entrometerse, dejndote trabajar fuera del mbito del framework segn sea necesario.

    El objetivo de este libro es convertirte en un experto de Django. El enfoque es doble. Primero,explicamos, en profundidad, lo que hace Django y como crear aplicaciones Web con l. Segundo, discu-tiremos conceptos de alto nivel cuando se considere apropiado, contestando la pregunta Cmo puedoaplicar estas herramientas de forma efectiva en mis propios proyectos? Al leer este libro, aprenderslas habilidades necesarias para desarrollar sitios Web poderosos de forma rpida, con cdigo limpio yde fcil mantenimiento.

    En este captulo ofrecemos una visin general de Django.

    1.1. Qu es un Framework Web?

    Django es un miembro importante de una nueva generacin de frameworks Web. Y qu signicaese trmino exactamente?

    Para contestar esa pregunta, consideremos el diseo de una aplicacin Web escrita usando el estndarCommon Gateway Interface (CGI), una forma popular de escribir aplicaciones Web alrededor del ao1998. En esa poca, cuando escribas una aplicacin CGI, hacas todo por ti mismo -- el equivalentea hacer una torta desde cero --. Por ejemplo, aqu hay un script CGI sencillo, escrito en Python, quemuestra los diez libros ms recientemente publicados de una base de datos:

    #!/usr/bin/python

    import MySQLdb

    print "Content-Type: text/html"

    print

    print "Libros"

    print ""

    print "Los ultimos 10 libros"

    print ""

    23

  • 24 CAPTULO 1. INTRODUCCIN A DJANGO

    conexion = MySQLdb.connect(user='yo', passwd='dejame_entrar', db='mi_base')

    cursor = connection.cursor()

    cursor.execute("SELECT nombre FROM libros ORDER BY fecha_pub DESC LIMIT 10")

    for fila in cursor.fetchall():

    print " %s" % fila[0]

    print ""

    print ""

    conexion.close()

    Este cdigo es fcil de entender. Primero imprime una lnea de Content-Type, seguido de una lneaen blanco, tal como requiere CGI. Imprime HTML introductorio, se conecta a la base de datos y ejecutauna consulta que obtiene los diez libros ms recientes. Hace un bucle sobre esos libros y genera unalista HTML desordenada. Finalmente imprime el cdigo para cerrar el HTML y cierra la conexin conla base de datos.

    Con una nica pgina dinmica como esta, el enfoque desde cero no es necesariamente malo. Por unlado, este cdigo es sencillo de comprender -- incluso un desarrollador novato puede leer estas 16 lneasde Python y entender todo lo que hace, de principio a n --. No hay ms nada que aprender; no hayms cdigo para leer. Tambin es sencillo de utilizar: tan slo guarda este cdigo en un archivo llamadoultimoslibros.cgi, sube ese archivo a un servidor Web y visita esa pgina con un navegador.

    Pero a medida que una aplicacin Web crece ms all de lo trivial, este enfoque se desmorona y teenfrentas a una serie de problemas:

    Qu sucede cuando mltiples pginas necesitan conectarse a la base de datos? Seguroque ese cdigo de conexin a la base de datos no debera estar duplicado en cada unode los scripts CGI, as que la forma pragmtica de hacerlo sera refactorizarlo en unafuncin compartida.

    Debera un desarrollador realmente tener que preocuparse por imprimir la lnea deContent-Type y acordarse de cerrar la conexin con la base de datos? Este tipo decdigo repetitivo reduce la productividad del programador y produce la oportunidadpara que se produzcan errores. Esta conguracin y estas tareas de cierre estaran mejormanejadas por una infraestructura comn.

    Qu sucede cuando este cdigo es reutilizado en mltiples mbitos, cada uno con unabase de datos y passwords diferentes? En ese punto, una conguracin especica parael mbito se vuelve esencial.

    Qu sucede cuando un diseador Web que no tiene experiencia programando enPython desea redisear la pgina? Lo ideal sera que la lgica de la pgina -- la bsque-da de libros en la base de datos -- est separada del cdigo HTML de la pgina, demodo que el diseador pueda hacer modicaciones sin afectar la bsqueda.

    Precisamente estos son los problemas que un framework Web tiene intencin de resolver. Un frame-work Web provee una infraestructura de programacin para tus aplicaciones, para que puedas focalizarteen escribir cdigo limpio y de fcil mantenimiento sin tener que reinventar la rueda. En resumidas cuen-tas, eso es lo que hace Django.

    1.2. El patrn de diseo MVC

    Comencemos con un rpido ejemplo que demuestra la diferencia entre el enfoque anterior y elempleado al usar un framework Web. As es como se podra escribir el cdigo CGI anterior usandoDjango:

  • 1.2. EL PATRN DE DISEO MVC 25

    # models.py (las tablas de la base de datos)

    from django.db import models

    class Book(models.Model):

    name = models.CharField(maxlength=50)

    pub_date = models.DateField()

    # views.py (la parte lgica)

    from django.shortcuts import render_to_response

    from models import Book

    def latest_books(request):

    book_list = Book.objects.order_by('-pub_date')[:10]

    return render_to_response('latest_books.html', {'book_list': book_list})

    # urls.py (la configuracin URL)

    from django.conf.urls.defaults import *

    import views

    urlpatterns = patterns('',

    (r'latest/$', views.latest_books),

    )

    # latest_books.html (la plantilla)

    Books

    Books

    { % for book in book_list %}

    {{ book.name }}

    { % endfor %}

    Todava no es necesario preocuparse por los detalles de cmo funciona esto -- tan slo queremos quete acostumbres al diseo general --. Lo que hay que notar principalmente en este caso es las cuestionesde separacin:

    El archivo models.py contiene una descripcin de la tabla de la base de datos, comouna clase Python. A esto se lo llama el modelo. Usando esta clase se puede crear,buscar, actualizar y borrar entradas de tu base de datos usando cdigo Python sencilloen lugar de escribir declaraciones SQL repetitivas.

    El archivo views.py contiene la lgica de la pgina, en la funcin latest_books(). Aesta funcin se la denomina vista.

    El archivo urls.py especica que vista es llamada segn el patrn URL. En este caso,la URL /latest/ ser manejada por la funcin latest_books().

  • 26 CAPTULO 1. INTRODUCCIN A DJANGO

    El archivo latest_books.html es una plantilla HTML que describe el diseo de lapgina.

    Tomadas en su conjunto, estas piezas se aproximan al patrn de diseo Modelo Vista Controlador(MVC). Dicho de manera ms fcil, MVC dene una forma de desarrollar software en la que el cdigopara denir y acceder a los datos (el modelo) est separado del pedido lgico de asignacin de ruta (elcontrolador), que a su vez est separado de la interfaz del usuario (la vista).

    Una ventaja clave de este enfoque es que los componentes son loosely coupled. Eso signica que cadapieza de la aplicacin Web Django-powered tiene un nico propsito clave que puede ser modicadoindependientemente sin afectar las otras piezas. Por ejemplo, un desarrollador puede cambiar la URLde cierta parte de la aplicacin sin afectar la implementacin subyacente. Un diseador puede cambiarel HTML de una pgina sin tener que tocar el cdigo Python que la renderiza. Un administrador debase de datos puede renombrar una tabla de la base de datos y especicar el cambio en un nico lugar,en lugar de tener que buscar y reemplazar en varios archivos.

    En este libro, cada componente tiene su propio captulo. Por ejemplo, el captulo 3 trata sobre lasvistas, el captulo 4 sobre las plantillas, y el captulo 5 sobre los modelos. El captulo 5 tambin toca enprofundidad la losofa MVC de Django.

    1.3. La historia de Django

    Antes de continuar con ms cdigo, deberamos tomarnos un momento para explicar la historia deDjango. Es til entender por qu se creo el framework, porque el conocimiento de la historia pone encontexto la razn por la cual Django trabaja de la forma en que lo hace.

    Si has estado creando aplicaciones Web por un tiempo, probablemente ests familiarizado con losproblemas del ejemplo CGI presentado con anterioridad. El camino clsico de un desarrollador Web esalgo como esto:

    1. Escribir una aplicacin Web desde cero.

    2. Escribir otra aplicacin Web desde cero.

    3. Darse cuenta que la aplicacin del paso 1 tiene muchas cosas en comn con laaplicacin del paso 2.

    4. Refactorizarlo el cdigo para que la aplicacin 1 comparta cdigo con la aplicacin2.

    5. Repetir los pasos 2-4 varias veces.

    6. Darse cuenta que acaba de inventar un framework.

    As es precisamente como fue creado Django.Django creci orgnicamente de aplicaciones de la vida real escritas por un equipo de desarrolladores

    Web en Lawrence, Kansas. Naci en el otoo boreal de 2003, cuando los programadores Web del diarioLawrence Journal-World, Adrian Holovaty y Simon Willison, comenzaron a usar Python para crear susaplicaciones. El equipo de The World Online, responsable de la produccin y mantenimiento de variossitios locales de noticias, prosperaban en un entorno de desarrollo dictado por las fechas lmite delperiodismo. Para los sitios -- incluidos LJWorld.com, Lawrence.com y KUsports.com -- los periodistas(y los directivos) exigan que se agregaran nuevas caracterstica y que aplicaciones enteras se crearana una velocidad vertiginosa, a menudo con slo das u horas de preaviso. Es as que Adrian y Simondesarrollaron por necesidad un framework de desarrollo Web que les ahorrara tiempo -- era la nicaforma en que podan crear aplicaciones mantenibles en tan poco tiempo -- .

    En el verano boreal de 2005, luego de haber desarrollado este framework hasta el punto