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

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