intro_Django/Proyecto1/README.md
2020-11-16 21:15:22 -03:00

476 lines
11 KiB
Markdown
Raw Blame History

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](https://gitea.kickto.net/jp.av.dev/intro_Django#user-content-django-wiki)*,
*[Proyecto y apps (bd)](https://gitea.kickto.net/jp.av.dev/intro_Django/wiki/2_Apps%26BD#user-content-proyecto-y-aplicacion-es)*
-------
### 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](https://docs.djangoproject.com/en/3.0/ref/request-response/#django.http.HttpRequest)
--------
## 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](https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#filter)
### 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](https://docs.djangoproject.com/en/3.0/topics/http/shortcuts/)
*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](https://gitea.kickto.net/jp.av.dev/intro_Django#user-content-django-wiki)*,
*[Proyecto y apps (bd)](https://gitea.kickto.net/jp.av.dev/intro_Django/wiki/2_Apps%26BD#user-content-proyecto-y-aplicacion-es)*