Práctica_2_1 - myTeachingURJC/2018-19-LTAW GitHub Wiki
- Tiempo: 2h
- Fecha: Lunes, 18-Febrero-2019
-
Objetivos de la sesión:
- Toma de contacto con django
- Crear el primer proyecto "Hola mundo", desde cero, creando URLs y usando plantillas
Crear una tienda usando django (En el laboratorio tenemos django 1.11, para python2. Es importante que uséis esta misma versión). Debe incluir las siguientes cosas:
- Almenos 3 productos diferentes
- Caja de búsqueda para que el cliente (humano) pueda buscar en el catálogo (base de datos) de la tienda
- El sitio debe generar varias vistas: la general, sólo producto-1, sólo producto-2, sólo producto-3, los resultados de las búsquedas, etc...
- Se deben utilizar plantillas para generar los contenidos dinámicos concretos
- El cliente debe poder rellenar un formulario para relizar un pedido concreto, que se recibe en el servidor y se inserta en la base de datos
- Diseña los modelos de datos y la aplicaón de la tienda
- Cuida el aspecto usando CSS y HTML5
- Como base de datos usar SQLite
Actividades guiadas por el profesor. Haremos lo siguiente:
- Comprobar la instalación de Django: Abrir un terminal y ejecutar
$ django-admin --version
1.11.11
- Comprobar que desde python tenemos acceso a los módulos de django. Abrir un terminal de python y ejecutar:
$ python
Python 2.7.15rc1 (default, Nov 12 2018, 14:31:15)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.VERSION
(1, 11, 11, u'final', 0)
>>>
- Creamos la estructura de directorios y ficheros para nuestra tienda. Ejecutamos el comando:
django-admin startproject mi_tienda
- Echar un vistazo a la estructura creada: Muy pocos ficheros (eso es bueno!!)
- Arrancamos nuestro proyecto:
$ python manage.py runserver
En la terminal aparecerá un mensaje similar a este, y se lanzará el servidor en la dirección: http://127.0.0.1:8000/
Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
February 18, 2019 - 08:14:49
Django version 1.11.11, using settings 'mi_tienda.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C
En el navegador veremos nuestro proyecto hola mundo
El punto de entrada a nuestra tienda es el fichero urls.py, donde se definen todas las URLs que implementaremos. Echamos un vistazo:
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
Se define el objecto urlpatterns que contiene todas las URLs implementadas. Para la implementación de las URLs se utilizan expresiones regulares de python. Estas expresiones son cadenas que comienzan on la letra r: r'expresion regular' y en su interior contiene una serie de caracteres especiales para indicar la estructura de la URL
-
'^' seguido de caracteres indica que es una palabra situada al comienzo de la cadena
-
Así, en el proyecto hola mundo se define la URL "admin/"
-
Actividad 1: Lanzar el proyecto y comprobar qué ocurre al acceder a esa URL: http://127.0.0.1:8000/admin
-
Actividad 2: Modificar la URL para que la parte de administración se encuentre en /test
- Vamos a crear nuestra primera URL, que se llamará /hola, y estará accesible desde http://127.0.0.1:8000/hola/
- Creamos un nuevo fichero, views.py, donde implementaremos qué hacer con esa URL:
from django.http import HttpResponse
def mi_funcion(request):
html = "Hola! Mi primera UrL!!"
return HttpResponse(html)
- Nuestra función mi_funcion() crear una mensaje de respuesta HTTP que sólo contiene una cadena
- La nueva URL la creamos desde urls.py
from django.conf.urls import url
from django.contrib import admin
from mi_tienda.views import mi_funcion
urlpatterns = [
url(r'^hola/', mi_funcion),
url(r'^test/', admin.site.urls),
]
Sólo hemos añadido 2 líneas. En la primera indicamos dónde está la función mi_función(), que realiza la implementación de la URL
from mi_tienda.views import mi_funcion
La segunda es una entrada en la lista urlpatterns donde definimos el nobre de la uRL y la función que se debe ejecutar
url(r'^hola/', mi_funcion),
- Lanzamos el servidor y comprobamos que tenemos acceso a la nueva URL:
Una forma de leer parámetros es definiendo una URL con números. Fichero urls.py:
from django.conf.urls import url
from django.contrib import admin
from mi_tienda.views import mi_funcion
from mi_tienda.views import mi_producto
urlpatterns = [
url(r'^hola/', mi_funcion),
url(r'^producto/(\d{1,2})/$',mi_producto),
url(r'^test/', admin.site.urls),
]
- Se ha definido una UrL que empieza por producto/ y luego debe contener un número decimal de 1 ó 2 dígitos. Las siguienets URLs serían correctas: producto/01, producto/3, producto/99... Cuando se detecta una URL de ese tipo de invoca a la función mi_producto, a la que se le pasa como segundo parámetro este número. Este es el fichero views.py
from django.http import HttpResponse
def mi_funcion(request):
html = "Hola! Mi primera UrL!!"
return HttpResponse(html)
def mi_producto(request, param):
numero = int(param)
html = "Acceso a producto: %i" % numero;
return HttpResponse(html)
El parámetro (param) recibido es de tipo cadena. Lo convertimos primero a número. Y lo usaríamos para lo que necesitásemos. En este ejemplo simplemente lo enviamos en el mensaje de respuests
La presentación de la información al usuario se hace usando HTML sobre el que se modifican datos. Se parte de una plantilla genérica a la que django introduce información concreta
Para comprender el funcionamiento definimos una plantilla (dentro de views.py) en la que saludamos a un usuario genérico. El fichero views.py es:
from django.http import HttpResponse
from django.template import Template, Context
def mi_funcion(request):
html = "Hola! Mi primera UrL!!"
return HttpResponse(html)
def mi_producto(request, param):
numero = int(param)
html = "Acceso a producto: %i" % numero;
return HttpResponse(html)
PLANTILLA = """
<!DOCTYPE html>
<html lang="es" dir="ltr">
<head>
<meta charset="utf-8">
<title>Saludo</title>
</head>
<body>
<p>Bienvenido a mi tienda, {{user}}</p>
</body>
</html>
"""
def saludo(request):
# --Procesar la plantilla
t = Template(PLANTILLA)
# -- Crear el contexto: Nombre de usuario real
c = Context({'user':'Epic Saxo guy'})
# -- Obtener la pagina html final
html = t.render(c)
return HttpResponse(html)
La plantilla es HTML, que contiene un campo genérico {{user}} donde se colocará el nombre real del usuario. Esta asociación entre nombre real y variable {{user}} se realiza en el contexto. Luego se crea la página HTML final a partir de este contexto y se envía al cliente para su visualización
-
Puedes aprender mucho sobre django usando Estas transparencias de los profesores Jorge Bastida y Jaime Irurzun de la Universidad de Deusto. Son muy claras y sencillas
-
También puedes usar el tutorial oficial de django (inglés): Tutorial, pero ten en cuenta que es para la versión 2.1 (y hay algunas diferencias con la 1.11)
- Jose María Cañas
- Juan González-Gómez (Obijuan)