• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Introducción a DJango
 

Introducción a DJango

on

  • 704 views

 

Statistics

Views

Total Views
704
Views on SlideShare
694
Embed Views
10

Actions

Likes
0
Downloads
12
Comments
0

2 Embeds 10

http://www.linkedin.com 8
http://us-w1.rockmelt.com 2

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Introducción a DJango Introducción a DJango Presentation Transcript

  • Luis Cruz @7Talks@lcruzc
  • CTO & Co-founder Experimento Social
  • Python
  • Python• Lenguaje dinámico• Fuertemente tipado• Código abierto y multiplataforma• Archivos extensión .py
  • SintaxisNo utiliza estructuras del tipo “{ ... } “ paradefinir bloques, sino que utiliza identaciónif a == 1: print “Algo”print “Algo mas”if a == 1: print “Algo” print “Algo mas”for a in arr: print “Otra cosa”def myfunc(): return “y aún más”
  • Tipos de datosLos típicos string, int, float, long,bool>>> 1 + 23>>> 1 + 212>>> 1 + 2Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: cannot concatenate str and intobjects
  • Cosas InteresantesSwap>>> a = 2>>> b = 3>>> a, b = b, ay con split...>>> year, month, day = "2011-12-01".split("-")
  • Cosas InteresantesManera tradicionalif (a == b) { c = x} else { c = y}the python way..c = x if a == b else y
  • Cosas Interesantes ¿Números entre 0 y 15 que sean divisibles por 1 o 5?>>> a = [i for i in range(15) if not (i%3 and i%5)]>>> a[0, 3, 5, 6, 9, 10, 12]filter(lambda x:not (x%5 and x%3), range(15))
  • Cosas Interesantes “Generadores”Generadoresdef date_range(start, end): for n in range((end-start).days): yield start + datetime.timedelta(n)Usostart = datetime.datetime(2011, 01, 1)end = datetime.datetime(2011, 01, 15)for date in date_range(start, end): print date
  • Cosas Interesantes “Decoradores”Caso:def hacer_algo(): print "algo"hacer_algo()Caso con Logs:def hacer_algo_con_logs(): print "inicio" hacer_algo() print "end"hacer_algo_con_logs()
  • Cosas Interesantes “Decoradores”Implementar un decoradordef log_decorator(f): def wrapper(): print "inicio" f() print "end" return wrapperMucho más elegante@log_decoratordef hacer_algo(): print "algo"hacer_algo()
  • Primeros Pasos
  • Python Shelldevelop$ pythonPython 2.6.7 (r267:88850, Aug 22 2011, 18:14:53)[GCC 4.2.1 (Based on Apple Inc. build 5658)(LLVM build 2335.15.00)] on darwinType "help", "copyright", "credits" or "license"for more information.>>>
  • Python Shell>>> range(1,10)[1, 2, 3, 4, 5, 6, 7, 8, 9]>>> from djangolab.myapp.models import MyModel>>> import __hello__>>> import this
  • VirtualEnv
  • VirtualEnvDescargarhttp://pypi.python.org/pypi/virtualenvInstalarpython setup.py install
  • Comandos basicos de virtualenvCreando una ambientelabs$ virtualenv WS_ENVNew python executable in WS_ENV/bin/pythonInstalling setuptools............done.Installing pip...............doneActivando un ambientesource WS_ENV/bin/activateDesactivando un ambientedeactivate
  • DJango
  • Caracteristicas• Don’t Repeat Yourself• Estructura de trabajo MTV• URL amigables• Sistema de admistración• Plantillas• Soprte GIS
  • Flujo Request Enrutamiento Vista HTML Response
  • InstalaciónCon virtualenvmyambiente/bin/pip install django
  • Organización
  • Organización- proyecto - aplicación 1 - views.py - models.py - aplicación 2 - views.py - models.py - aplicación 3 - views.py - models.py - settings.py - urls.py
  • Archivos del Proyecto• settings.py: almacena los parametros de configuración de la aplicación• urls.py: almacena los ruteos• manage.py: comandos y utilidades para ejecutar sobre el proyecto
  • Archivos de la Aplicación• models.py: modelos propios de la aplicación• views.py: vistas (controladores)• tests.py: aquí se incluyen nuestros tests o
  • Creando una Aplicación
  • Creando un proyectoCrear un proyectoworkshop$ django-admin.py startproject labdjangoCrear un aplicaciónlabdjango$ python manage.py startapp myapp
  • Configurando la base de datosDATABASES = { default: { ENGINE: django.db.backends.sqlite3, NAME: database.db, USER: , PASSWORD: , HOST: , PORT: , }}
  • Ejecutando el servidorlabdjango$ python manage.py runserverValidating models...0 errors foundDjango version 1.3, using settings labdjango.settingsDevelopment server is running at http://127.0.0.1:8000/Quit the server with CONTROL-C.[17/Nov/2011 20:11:31] "GET / HTTP/1.1" 200 2057
  • Corriendo la aplicación
  • Persistencia
  • Creando un modelofrom django.db import modelsclass Noticia(models.Model): fecha = models.DateField(null=True) categoria = models.ForeignKey(Categoria) titulo = models.CharField(max_length=100, blank=True) detalle = models.TextField(max_length=100)
  • Sincoronizando con nuestra base de datoslabdjango$ python manage.py syncdbCreating tables ...You just installed Djangos auth system, which means youdont have any superusers defined.Would you like to create one now? (yes/no): yesUsername (Leave blank to use lcruzc): adminE-mail address: lcruzc@gmail.comPassword:Password (again):Superuser created successfully.Installing custom SQL ...Installing indexes ...No fixtures found.
  • ORM ILlamado al nuestro shell bajo “django”workshop$ python manage.py shellObteniendo los objetos>> Categoria.objects.all()Creando un objeto>> categoria = Categoria(nombre = ‘Deportes’)>> categoria.save()
  • ORM IIRecuperando un objeto>> categoria = Categoria.objects.get(pk=1)Recuperando un objeto>> categoria = Categoria.objects.get(nombre=‘Deportes’)Buscando un conjunto de objetos>> noticias = noticia.objects.filter(estado = Publicada)
  • ORM IIIRecuperando un objeto (join)>> Noticia.objects.filter(categoria__nombre = Deportes)Recuperando objetos relacionados>> categoria = Categoria.objects.get(pk=1)>> categoria.noticia_set.all()[<Noticia: Ganamos la copa america>]Borrando>> categoria.delete()
  • Enrutamiento y Vistas
  • Configurando mis ruteosurlpatterns = patterns(, (r^articles/2003/$, ), (r^/$, myapp.views.index), (r^noticias/$, myapp.views.listado), (r^noticia/(?P<id>d+)/$, myapp.views.detalle),)
  • Configurando mis ruteosfrom django.shortcuts import renderfrom labdjango.myapp.models import Categoria, Noticiadef index(request): categoria = Categoria.objects.all() return render(request, index.html, { categoria:categoria })def noticias(request): noticias = Noticia.objects.all() return render(request, index.html, { noticias:noticias })def noticias(request, key): noticia = Noticia.objects.get(pk = int(key)) return render(request, index.html, { noticia:noticia })
  • Plantillas
  • Plantillas I <div class="row">! ! {% for noticia in noticias %} <div class="span5"> <h2>{{noticia.titulo}}</h2> <p>{{noticia.detalle}}</p> <p> <a href="/noticia/{{noticia.id}}/">Ver detalle</a> </p> </div> ! ! {% endfor %}</div>
  • Plantillas II{% extends "base.html" %}{% block "content" %}<div class="row">! <div class="span12">! ! <h2>{{noticia.titulo}} - {{noticia.fecha|date:"d/m/Y"}}</h2>! ! <p>{{noticia.detalle}}</p>! ! <p><a class="btn" href="/">Volver &raquo;</a></p>! </div></div>{% endblock%}
  • Administrador
  • Administrador
  • Registrando mis modelosfrom labdjango.myapp.models import Region, Sucursaladmin.site.register(Region)admin.site.register(Sucursal)
  • Registrando mis modelosINSTALLED_APPS = ( django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.sites, django.contrib.messages, django.contrib.staticfiles, labdjango.myapp # Uncomment the next line to enable the admin: django.contrib.admin,)
  • Registrando mis modelosfrom django.conf.urls.defaults import patterns,include, urlfrom django.contrib import adminadmin.autodiscover()urlpatterns = patterns(, # Uncomment the next line to enable the admin: url(r^admin/, include(admin.site.urls)),)
  • Administrador muy configurableclass NoticiaAdmin(admin.ModelAdmin):! search_fields = [titulo, detalle]! list_filter = (estado,)! list_display = (categoria, titulo,fecha)! date_hierarchy = fecha!
  • Forms
  • Forms Ifrom django import formsclass ContactoForm(forms.Form): asunto = forms.CharField(max_length=100) mensaje = forms.CharField() email = forms.EmailField()
  • Forms IIdef contacto(request): if request.method == POST: form = ContactoForm(request.POST) if form.is_valid(): # Hacemos Algo return redirect(/gracias/) else: form = ContactoForm() return render(request, contacto.html,{ form: form })
  • Forms III<div class="row">! <form action="/contacto/" method="post">{% csrf_token %}! {{ form.as_p }}! <input type="submit" value="Enviar" />! </form></div>
  • Vistas Genéricas
  • direct_to_templatefrom django.views.generic.simple import direct_to_template...(r^gracias/$, direct_to_template, {template: gracias.html, extra_context:context}),
  • list_detail.object_list(r^ultimas/$, list_detail.object_list, rule_info),rule_info = { queryset: Noticia.objects.order_by(-fecha)[:3], extra_context:context, template_name: ultimas.html,}
  • FinLuis Cruz@lcruzc