Table of Contents
- Creacion Entorno Virtual
- Usar virt-env
- Installar Django
- Crear Proyecto
- Detalle del proyecto:
- Creación de base de datos
- Correr servidor de pruebas
- Clases utilizadas por Django para manejar 'http Request and Responses'
- Primera Vista
- Paso de parametros en URL
- Templates o Plantillas
- Uso de variables en plantillas
- Acceso a objetos y propiedades desde plantillas (uso de dicc. en contexto)
- Uso de listas en contexto y plantillas
- Estructuras de control de flujo en plantillas
- Tags
- Fitros
- Cargadores de Plantillas (loader)
- Simplificación de código con paquete shortcuts
- Pantillas dentro de plantillas ( incrustadas )
- Herencia de plantillas
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Ir a: Repositorio, Proyecto y apps (bd)
Creacion Entorno Virtual
python3 -m venv .django-env
Usar virt-env
source .django-evn/bin/activate
Installar Django
pip3 install Django
Crear Proyecto
django-admin startproject NombreProyecto
Detalle del proyecto:
- init.py : Tratar directorio como paquete de Python
- settings.py : Configuracion del Proyecto (ej.TIMEZONE)
- urls.py : "Indice" de urls del sitio
- wsgi.py : Interfaz entre apps del servidor y Django y/o Python frameworks
Creación de base de datos
python3 manage.py migrate
Correr servidor de pruebas
python3 manage.py runserver <ip:puerto>
Clases utilizadas por Django para manejar 'http Request and Responses'
módulo django.http
HttpRequest: Pasa como primer argumento a la función view una instancia de dicha clase (metadata del request).
HttpResponse: Cada view es responsable de enviar un objeto HttpResponse.
Primera Vista
crear Proyecto1/views.py
from django.http import HttpResponse
def primeravista(request):
return HttpResponse("Esta es la primera vista ٩(◕‿◕。)۶ con Django")
def otra(request);
return HttpResponse("Otra vista ( ̄▽ ̄)ノ con Django")
'Enlazar' vista con una URL
urls.py
from Proyecto1.views import primeravista, otra
url_patterns = [
path('admin/', admin.site.urls),
path('primera/', primeravista),
path('mas/', otra),
]
Paso de parametros en URL
views.py
def calcEdad(request, edad, ano):
periodo = ano - 2020
edadfutura = edad + periodo
doc = "<html><body><h3>En el %s tendras %s años</h3></body></html>" %(ano, edadfutura)
return HttpResponse(doc)
urls.py
from Proyecto1.views import primeravista, otra, verFecha, calcEdad
urlpatterns = [
...
path('edades/<int:ano>', calcEdad),
...
Contenido Dinámico
views.py
import datetime
def verFecha(request):
fecha_ahora = datetime.datetime.now()
documento = "<html><body><h3> Hora y Fecha actual: %s</h3></body></html>" % fecha_ahora
return HttpResponse(documento)
urls.py
from Proyecto1.views import primeravista, otra, verFecha
urlpatterns = [
...
path('fecha/', verFecha),
...
Templates o Plantillas
en su mayoria HTML, se usan para separar la lógica de lo visual de un documento web. "temas":["Vistas", "Modelos", "Plantillas", "Formularios", "Despliege"] #Uso:
- Creación de objeto Template
plant = Template(doc_externo.read())
- Creacion de contexto (datos adicionales ej, vars, func., etc)
ctx = Context()
- Renderizado del objeto Template
documento = plant.render(ctx)
Proyecto1/plantillas/miplantilla.html
<html><body><h3>Primera plantilla en Django ╮(︶▽︶)╭</h3></body></html>
views.py
from django.template import Template, Context
def primeravista(request):
doc_externo = open("/home/sat/weblocal/PildorasInf/Proyecto1/Proyecto1/plantillas/miplantilla.html", 'r')
plantilla = Template(doc_externo.read())
doc_externo.close()
ctx = Context()
documento = plantilla.render(ctx)
return HttpResponse(documento)
Uso de variables en plantillas
views.py
from django.template import Template, Context
def primeravista(request):
nombre = "Zerafín"
apellido = "Menendes"
fecha = datetime.datetime.now()
doc_externo = open("/home/sat/weblocal/PildorasInf/Proyecto1/Proyecto1/plantillas/miplantilla.html", 'r')
plantilla = Template(doc_externo.read())
doc_externo.close()
ctx = Context({"nombre_persona":nombre, "apell_persona":apellido, "fecha":fecha})
documento = plantilla.render(ctx)
return HttpResponse(documento)
miplantilla.html
<html>
<body>
<h2 style="color: magenta">
Primera plantilla en Django ╮(︶▽︶)╭
</h2>
<p>El Nombre de prueba es: <strong>{{nombre_persona}}</strong></p>
<p>El Apellido de prueba es: <strong>{{apell_persona}}</strong></p>
<p>Día : {{fecha.day}}/{{fecha.month}}/{{fecha.year}}/</p>
</body>
</html>
Acceso a objetos y propiedades desde plantillas (uso de dicc. en contexto)
views.py
class Persona(object):
def __init__(self, nombre, apellido):
self.nombre = nombre
self.apell = apellido
def primeravista(request):
p1 = Persona("Zerafín", "Menendes")
fecha = datetime.datetime.now()
doc_externo = open("/home/sat/weblocal/PildorasInf/Proyecto1/Proyecto1/plantillas/miplantilla.html", 'r')
plantilla = Template(doc_externo.read())
doc_externo.close()
ctx = Context({"nombre_persona":p1.nombre, "apell_persona":p1.apellido, "fecha":fecha})
documento = plantilla.render(ctx)
return HttpResponse(documento)
Uso de listas en contexto y plantillas
views.py
temas_curso = ["Vistas", "Modelos", "Plantillas", "Formularios", "Despliege"]
ctx = Context({"nombre_persona":p1.nombre, "apell_persona":p1.apellido, "fecha":fecha, "temas":temas_curso})
Estructuras de control de flujo en plantillas
miplantilla.html
<p><strong>Temas de estudio</strong></p>
<p>
<ul>
{% if temas %}
{% for tema in temas %}
<li>{{tema}}</li>
{% endfor %}
{% else %}
<p>Nada que mostrar</p>
{% endif %}
</ul>
</p>
recordar: La lógica va en las vistas. Estas lineas son con el fin de comprender el funcionamiento de Django
Jerarquía de llamadas desde plantilla
- Diccionario
- Atributo
- Método
- Índice lista
Métodos en plantillas
miplantilla.html
<p>El Nombre de prueba es: <strong>{{nombre_persona.upper}}</strong></p>
<p>El Apellido de prueba es: <strong>{{apell_persona.upper}}</strong></p>
Tags
# autoescape on por defecto
{% autoescape on %}
{{ body }}
{% endautoescape %}
# Comentarios
{# COMENTARIO DE UNA LINEA #}
{% comment "nota opcional" %}
Comentario con nota, multilinea,
no visible para web inspector de navegador*
{% endcomment %}
# Herencia, para 'esqueletos' de plantillas (elementos comunes del sitio
{% block barra_lateral %}
<ul>
<li><a href="/">https://docs.djangoproject.com/en/3.0/ref/templates/language/</a></li>
<li><a href="https://docs.djangoproject.com/en/3.0/ref/templates/language/#template-inheritance">Blog</a></li>
</ul>
{% endblock %}
# Proteccion contra CSRF* (on por defecto)
<form method="post">{% csrf_token %}
# Cross Site Request Forgery
# for
{% for x, y in points %}
There is a point at {{ x }},{{ y }}
{% empty %}
No values
{% endfor %}
Variantes del ciclo for
- forloop.counter :
Itera con indexado 1
- forloop.counter0 :
Itera con indexado 0
- forloop.revcounter :
Iteracíon inversa con indexado 1
- forloop.revcounter0 :
Iteracíon inversa con indexado 0
- forloop.first :
Verdadero si es la primera iteración
- forloop.last :
Verdadero si es la última iteración
- forloop.parentloop :
Para 'loops' anidados, Este es el loop padre
Fitros
miplantilla.html
# filtro upper
<p>El Apellido de prueba es: <strong>{{apell_persona|upper}}</strong></p>
{% filter force_escape|lower %}
This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}
{% firstof var1 var2 var3 %}
% firstof var1 var2 var3 "valor por defecto" %}
{% for tema in temas %}
<li>{{tema|first|lower}}</li>
{% endfor %}
Cargadores de Plantillas (loader)
De esta forma, el objeto render no adminte un contexto como parametro.
Debe recibir un diccionario
views.py
....
from django.template.loader import get_template
....
plantilla = get_template('miplantilla.html')
documento = plantilla.render({"nombre_persona":p1.nombre, "apell_persona":p1.apell, "fecha":fecha, "temas":temas_curso})
return HttpResponse(documento)
Especificar ruta a plantillas
settings.py
TEMLPATES = [
...
'DIRS': ['/home/sat/weblocal/PildorasInf/Proyecto1/Proyecto1/plantillas'],
...
]
Simplificación de código con paquete shortcuts
Django-doc
views.py
...
from django.shortcuts import render
# render recibe como argumento (request, 'plantilla', {contexto})
...
return render(request, "miplantilla.html", {"nombre_persona":p1.nombre, "apell_persona":p1.apellido, "fecha":fecha, "temas":temas_curso})
Pantillas dentro de plantillas ( incrustadas )
ej. barra navegacion simple /plantillas/superior/barra.html
<html>
<style>
#barra{
margin: 0;
padding: 0;
list-style: none;
text-transform: uppercase;
}
#barra li{
display: inline;
margin: 0 20px
}
</style>
<body>
<ul id="barra">
<li>Home</li>
<li>Servicios</li>
<li>Catálogo</li>
<li>Contacto</li>
<li>sobre Nosotros</li>
</ul>
</body>
</html>
Incrustar en miplantilla.html
<html>
<body>
{% include "superior/barra.html" %}
...
Herencia de plantillas
Creación de plantilla padre,de la que se basa el resto de plantillas.
Parent.html
⭣
⮡ Child1.html {% extends "Parent.html" %}
⭣
⮡ Child2.html {% extends "Parent.html" %}
⭣
⮡ Child3.html {% extends "Parent.html" %}
ej. Parent plantillas/base.html
<html>
<head>
<title>
{% block title %} {% endblock %}}
</title>
</head>
<body>
<h1>Titulo Común</h1>
<h3>Otro tit. vom.</h3>
{% block content %} {% endblock %}}
<p>Parrafo común</p>
</body>
</html>
ej. child childpage1.html
{% extends "base.html" %}
{% block title %} Pagina hija {% endblock %}
{% block content %}
<p>Hoy es {{verFecha}}</p>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/d1-UX6aR_TM?start=813" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
{% endblock %}
Registrar vista views.py y url en urls.py
def herencia1(request):
fecha_ahora = datetime.datetime.now()
return render(request, "childpage1.html", {"verFecha":fecha_ahora})
# lo mismo para childpage2.html
from Proyecto1.views import primeravista, otra, verFecha, calcEdad, herencia1, herencia2
urlpatterns = [
...
path('hija1/', herencia1),
path('hija2/', herencia2),
]
Ir a: Repositorio, Proyecto y apps (bd)