From 93aef51a61f25ede47c7d2976d15c9bd3647d2eb Mon Sep 17 00:00:00 2001 From: "jp.av.dev" Date: Mon, 16 Nov 2020 21:15:22 -0300 Subject: [PATCH] +readme.md --- Proyecto1/README.md | 476 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 476 insertions(+) create mode 100644 Proyecto1/README.md diff --git a/Proyecto1/README.md b/Proyecto1/README.md new file mode 100644 index 0000000..34f576b --- /dev/null +++ b/Proyecto1/README.md @@ -0,0 +1,476 @@ +**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 +``` +-------- + +### 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 = "

En el %s tendras %s años

" %(ano, edadfutura) + return HttpResponse(doc) + +``` + +*urls.py* +``` +from Proyecto1.views import primeravista, otra, verFecha, calcEdad + +urlpatterns = [ + ... + path('edades/', calcEdad), + ... +``` + +### Contenido Dinámico +*views.py* +``` +import datetime + +def verFecha(request): + fecha_ahora = datetime.datetime.now() + documento = "

Hora y Fecha actual: %s

" % 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* +``` +

Primera plantilla en Django ╮(︶▽︶)╭

+``` + +*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* +``` + + +

+ Primera plantilla en Django ╮(︶▽︶)╭ +

+

El Nombre de prueba es: {{nombre_persona}}

+

El Apellido de prueba es: {{apell_persona}}

+

Día : {{fecha.day}}/{{fecha.month}}/{{fecha.year}}/

+ + +``` + +### 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* +``` +

Temas de estudio

+

+

    + {% if temas %} + {% for tema in temas %} +
  • {{tema}}
  • + {% endfor %} + {% else %} +

    Nada que mostrar

    + {% endif %} +
+

+``` +*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* +``` +

El Nombre de prueba es: {{nombre_persona.upper}}

+

El Apellido de prueba es: {{apell_persona.upper}}

+``` + +### 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 %} + +{% endblock %} + +# Proteccion contra CSRF* (on por defecto) + +
{% 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 +

El Apellido de prueba es: {{apell_persona|upper}}

+ +{% 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 %} +
  • {{tema|first|lower}}
  • +{% 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* +``` + + + +
      +
    • Home
    • +
    • Servicios
    • +
    • Catálogo
    • +
    • Contacto
    • +
    • sobre Nosotros
    • +
    + + +``` +Incrustar en *miplantilla.html* +``` + + + {% 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* +``` + + + + + + {% block title %} {% endblock %}} + + + + + + +

    Titulo Común

    +

    Otro tit. vom.

    + + {% block content %} {% endblock %}} + +

    Parrafo común

    + + + + + +``` + +ej. child +*childpage1.html* +``` +{% extends "base.html" %} + +{% block title %} Pagina hija {% endblock %} + + +{% block content %} + +

    Hoy es {{verFecha}}

    + + + +{% 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)* \ No newline at end of file