No programes sin framework
Python & Django
Pasamos de...
Lenguaje de alto nivel
Rápida curva de aprendizaje => novatos
Fácil lectura
Más tiempo leyendo código que programando
Multiplataforma
Multipropósito
Fácil manejo de datos
Manejo de listas
Objetos
Obtener atributos
Setearlos
Programación orientada a objetos "bonita"
Sintaxis limpia
PEP
Si el elemento no está en la lista
# Declaración
a = 5
b = 4
# Tipado dinámico
a = 5
b = 'Hola mundo'
a = b
# Intercambiar valores
a = 5
b = 4
a,b = [b,a]
>>> lista = ["abc", 42, 3.1415]
>>> lista[0] # Acceder a un elemento por su índice
'abc'
>>> lista[-1] # Acceder a un elemento usando un índice negativo
3.1415
>>> lista.append(True) # Añadir un elemento al final de la lista
>>> lista
['abc', 42, 3.1415, True]
>>> del lista[3] # Borra un elemento de la lista usando un índice (en este caso: True)
>>> lista[0] = "xyz" # Re-asignar el valor del primer elemento de la lista
>>> lista[0:2] # Mostrar los elementos de la lista del índice "0" al "2" (sin incluir este último)
['xyz', 42]
>>> lista_anidada = [lista, [True, 42L]] # Es posible anidar listas
>>> lista_anidada
[['xyz', 42, 3.1415], [True, 42L]]
>>> lista_anidada[1][0] # Acceder a un elemento de una lista dentro de otra lista (del segundo elemento, mostrar el primer elemento)
True
Métodos nativos como:
sort, reverse, len, min, max, remove, count, map, slice
>>> tupla = ("abc", 42, 3.1415)
>>> tupla[0] # Acceder a un elemento por su índice
'abc'
>>> del tupla[0] # No es posible borrar (ni añadir) un elemento en una tupla, lo que provocará una excepción
( Excepción )
>>> tupla[0] = "xyz" # Tampoco es posible re-asignar el valor de un elemento en una tupla, lo que también provocará una excepción
( Excepción )
>>> tupla[0:2] # Mostrar los elementos de la tupla del índice "0" al "2" (sin incluir este último)
('abc', 42)
>>> tupla_anidada = (tupla, (True, 3.1415)) # También es posible anidar tuplas
>>> 1, 2, 3, "abc" # Esto también es una tupla, aunque es recomendable ponerla entre paréntesis (recuerda que requiere, al menos, una coma)
(1, 2, 3, 'abc')
>>> (1) # Aunque entre paréntesis, esto no es una tupla, ya que no posee al menos una coma, por lo que únicamente aparecerá el valor
1
>>> (1,) # En cambio, en este otro caso, sí es una tupla
(1,)
>>> (1, 2) # Con más de un elemento no es necesaria la coma final
(1, 2)
>>> (1, 2,) # Aunque agregarla no modifica el resultado
(1, 2)
>>> diccionario = {"cadena": "abc", "numero": 42, "lista": [True, 42L]}
>>> diccionario["cadena"] # Usando una clave, se accede a su valor
'abc'
>>> diccionario["lista"][0]
True
>>> diccionario["cadena"] = "xyz" # Re-asignar el valor de una clave
>>> diccionario["cadena"]
'xyz'
>>> diccionario["decimal"] = 3.1415927 # Insertar un nuevo elemento clave:valor
>>> diccionario["decimal"]
3.1415927
# También es posible que un valor sea un diccionario
>>> diccionario_mixto = {"tupla": (True, 3.1415), "diccionario": diccionario}
# Acceder a un elemento dentro de una lista, que se encuentra dentro de un diccionario
>>> diccionario_mixto["diccionario"]["lista"][1]
42L
Métodos nativos como:
keys(), values(), items(), copy(), has_key()
>>> conjunto_inmutable = frozenset(["a", "b", "a"])
>>> conjunto_inmutable
frozenset(['a', 'b'])
>>> conjunto1 = set(["a", "b", "a"]) # Primer conjunto mutable
>>> conjunto1
set(['a', 'b'])
>>> conjunto2 = set(["a", "b", "c", "d"]) # Segundo conjunto mutable
>>> conjunto2
set(['a', 'c', 'b', 'd']) # Recuerda, no mantienen el orden, como los diccionarios
>>> conjunto1 & conjunto2 # Intersección
set(['a', 'b'])
>>> conjunto1 | conjunto2 # Unión
set(['a', 'c', 'b', 'd'])
>>> conjunto1 - conjunto2 # Diferencia (1)
set([])
>>> conjunto2 - conjunto1 # Diferencia (2)
set(['c', 'd'])
>>> conjunto1 ^ conjunto2 # Diferencia simétrica
set(['c', 'd'])
Métodos nativos como:
intersection, diferencia, union, diferencia_simétrica
>>> range(5)
[0, 1, 2, 3, 4]
>>> [i*i for i in range(5)]
[0, 1, 4, 9, 16]
>>> lista = [(i, i + 2) for i in range(5)]
>>> lista
[(0, 2), (1, 3), (2, 4), (3, 5), (4, 6)]
>>> g = [ x ** 2 for x in range (10)]
[0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 , 81]
>>> x = range (1 , 10)
>>> x
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x [:3]
[0 , 1, 2]
>>> x[:2]
[1, 2]
>>> x[:2]
[1, 2]
>>> x[-1]
9
>>> x[1:6:2]
[2, 4, 6]
x[start:end:step]
>>> [ x ** 2 for x in xrange (1000000000000000)]
# Tu ordenador explota
¿Qué son?
>>> cuadrados = ( x ** 2 for x in range (1 , 11))
>>> cuadrados
< generator object < genexpr > at 0 x7f8b82504eb0 >
>>> next ( cuadrados )
1
>>> next ( cuadrados )
4
>>> cuadrados = ( x ** 2 for x in range (100000000000000))
>>> cuadrados
< generator object < genexpr > at 0 x7f8b82504eb0 >
>>> next ( cuadrados )
1
>>> next ( cuadrados )
4
&& => and
|| => or
! => not
>>> verdadero = True
>>> if verdadero: # No es necesario poner "verdadero == True"
... print "Verdadero"
... else:
... print "Falso"
Verdadero
>>> lenguaje = "Python"
>>> if lenguaje == "C":
... print "Lenguaje de programación: C"
... elif lenguaje == "Python":
... print "Lenguaje de programación: Python"
... else:
... print "Lenguaje de programación: indefinido"
...
Lenguaje de programación: Python
>>> if verdadero and lenguaje == "Python":
... print "Verdadero y Lenguaje de programación: Python"
...
Verdadero y Lenguaje de programación: Python
>> x = 4
>> x == 3 or x == 5 or x == 7:
False
>> x in (3 , 5 , 7)
False
>>> any ([ False , True , False ])
True
>>> any ([ False , False ])
False
>>> any ([])
False
>>> all ([ False , True , False ])
False
>>> all ([ True ])
True
>>> all ([])
True
En casi todos los lenguajes
test ? a : b
En python
a if test else b
>>> x = 2
>>> " uno " if x == 1 else " otra cosa "
"otra cosa"
>>> lista = ["a", "b", "c"]
>>> for i in lista: # Iteramos sobre una lista, que es iterable
... print i
...
a
b
c
>>> numero = 0
>>> while numero < 10:
... numero += 1
... print numero,
...
1 2 3 4 5 6 7 8 9
Totálmente compatible con POO
Herencia múltiple
Sobrecarga de métodos
>>> cadena = "abc"
>>> cadena.upper()
'ABC'
>>> lista = [True, 3.1415] #List
>>> lista.append(42L)
>>> lista
[True, 3.1415, 42L]
>>> int ( True )
1
>>> int ( False )
0
>>> 37 + True
38
>>> 7 / False
Traceback ( most recent call last ):
File " < stdin > " , line 1, in < module >
ZeroDivisionError : float division
os
sys
Nació en el otoño de 2003
The World Online
Toda su línea editorial en la red está basada en su propia versión del padre de Django
Syncdb
SELECT * FROM Alumno WHERE edad = 17
Alumno.objects.filter(edad = 17)
No te convenció?. Tal vez esto sí lo haga
SELECT * FROM “autores_autor” INNER JOIN “autor_libro” ON (“autores_autor”.”id” = “autores_libro”.”autor_id”)
INNER JOIN “autores_libro_librerias” ON (“autores_libro”.”id” = “autores_libro_librerias”.”libro_id”)
INNER JOIN “autores_libreria” ON (“autores_libro_librerias”.”libreria_id” = “autores_libreria”.”id”) WHERE “autores_libreria”.”nombre” = “La Cultura”
Autor.objects.filter(libros__libreria__nombre = “La Cultura”)
Function Views
<table class="table datatable table-bordered table-striped">
<thead>
<tr>
<th class="text-center">Acción</th>
<th>Nombre</th>
<th>Apellidos</th>
<th>Email</th>
<th>Grupos</th>
<th>Último inicio de sesión</th>
</tr>
</thead>
<tbody>
{% for u in user_list %}
<tr>
<td class="text-center">
<a href="{% url 'team:teammember_detail' u.pk %}">
<i class="fa fa-pencil"></i>
</a>
</td>
<td>{{ u.first_name }}</td>
<td>{{ u.last_name }}</td>
<td><a href="mailto:{{ u.email }}">{{ u.email }}</a></td>
<td>
{% for g in u.groups.all %}
{{ g.name }}<br>
{% endfor %}
</td>
<td>{{ u.last_login|default:"Nunca" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
Separar lógica de presentación
Herencia de plantillas
Bloques
Condicionales
Bucles
Template Tags
Custom Template Tags
urlpatterns = [
path('visits-variant-visit/<int:pk>/',
VisitGetVariant.as_view(),
name='visit_variant_visit'
),
path('visit-variant-forbidden-dates/<int:pk>/',
VisitVariantForbiddenDates.as_view(),
name='visit_variant_forbidden_dates'
),
path('visit-variant-rate-day/<int:pk>/<int:year>/<int:month>/<int:day>/',
VisitVariantRateDay.as_view(),
name='visit_variant_rate_date'),
path('visit-variant-available-dates/<int:pk>/',
VisitVariantAvailableDates.as_view(),
name='visit_variant_available_dates'),
path('', include(router.urls))
]
django-crispy-forms
django-rosetta
django-modeltranslation
django packages
django packages
instagram, the new york times, pinterest, nasa, mercedes, national geographic, the whashington post,
http://django.es/docs/
http://stackoverflow.com/
El admin de django es el mejor invento del mundo a la hora de tener un panel de control de entidades, relaciones y datos.
Sorry. . .
Tranquilos
¿Algo que objetar?
?
@bienvenidosaez