6 1_DjangoTemplates
Fuzan edited this page 2021-07-02 22:02:26 -04:00
This file contains ambiguous Unicode characters

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.

Django Doc


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 %}

django-doc

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)