Vamos a crear una aplicación completa de Django y a la vez profundizando más en varios conceptos. La aplicación que crearemos tendrá cinco vistas:
- Inicio
- Servicios
- Tienda
- Blog
- Contacto
$ django-admin startproject PracticaDjango
Esto nos creará un directorio con la siguiente estructura:
PracticaDjango > Directorio Padre
manage.py > Archivo de gestión de Django.
PracticaDjango --> Es un directorio
Es siguiente caso es crear la aplicación que gestionará la aplicación web. Así que entramos en el directorio padre y creamos la aplicación:
PracticaDjango$ python manage.py startapp Proyecto_web_app
Salida:
PracticaDjango > Directorio Padre
manage.py > Archivo de gestión de Django.
PracticaDjango --> Es un directorio
Proyecto_web_app > El directorio de la app recien creada.
Recuerda que una cosa es el proyecto y otra la aplicación. En Django dentro de un proyecto puedes tener muchas aplicaciones.
Ahora es un buen momento para verificar que nuestro proyecto funciona, así que vamos a la consola y ejecutamos el servidor:
PracticaDjango$ python manage.py runserver
Abrimos el navegador y entramos en localhost:8000 y si todo ha ido bien verás la siguiente pantalla:
Seguidamente creamos de forma sencilla las vistas de cada una de las cinco url de la aplicación. Para ello vamos al archivo views.py y para hacer algunas pruebas importamos la clase HttpResponse.
PracticaDjango/Proyecto_web_app/views.py:
from django.shortcuts import render, HttpResponse
# Create your views here.
def home(request):
return HttpResponse('Home')
def servicios(request):
return HttpResponse('Servicios')
def tienda(request):
return HttpResponse('Tienda')
def blog(request):
return HttpResponse('Blog')
def contacto(request):
return HttpResponse('Contacto')
Ahora nos vamos a registrar las URLS. Importamos las vistas y luego registramos las direcciones.
PracticaDjango/PracticaDjango/urls.py:
from django.contrib import admin
from django.urls import path
from Proyecto_web_app import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.home, name='home'),
path('servicios/', views.servicios, name='servicios'),
path('tienda/', views.tienda, name='tienda'),
path('blog/', views.blog, name='blog'),
path('contacto/', views.contacto, name='contacto'),
]
Volvemos a ejecutar el servidor, si lo hemos cerrado y probamos cada una de las url, para ver que todas las vistas funcionan.
Ej para la vista blog.
Reorganización de las url para un mejor funcionamiento.
PracticaDjango/Proyecto_web_app/urls.py:
from django.urls import path
3.- A continuación importamos las vistas de la aplicación.
PracticaDjango/Proyecto_web_app/urls.py:
from django.urls import path
from . import views
4.- Tenemos que trabajar con la lista urlpatterns y para no tener que escribir tanto, vamos al url del proyecto, copiamos el urlpatterns y lo pegamos aquí. Lógicamente quitamos la vista admin que no corresponde a la aplicación, sino al proyecto.
PracticaDjango/Proyecto_web_app/urls.py:
from django.urls import path
from Proyecto_web_app import views
app_name = "Proyecto_web_app"
urlpatterns = [
path('', views.home, name='home'),
path('servicios/', views.servicios, name='servicios'),
path('tienda/', views.tienda, name='tienda'),
path('blog/', views.blog, name='blog'),
path('contacto/', views.contacto, name='contacto'),
]
'app_name' en Django se utiliza para definir un nombre único para la aplicación, evitando conflictos de nombres con otras aplicaciones que pudiéramos crear luego.
'name' se asigna a cada URL dentro de la aplicación y proporciona una etiqueta única para esta URL en nuestro proyecto.
Estos atributos nos ayudarán a a organizar y referenciar fácilmente las URLs en nuestro código y en las plantillas de Django. Por ejemplo cuando más adelante tengamos que construir una URL en una plantilla en vez de usar una referencia absoluta para referirnos a la vista 'home' haremos referencia a ella como 'Proyecto_web_app:home'.
Y como hemos movido todas las vistas de la aplicación, en el archivo urls.py del PROYECTO quitamos todo lo que hemos movido y dejamos solo el admin. Quitamos también la importación de las vistas. En definitiva lo dejamos como estaba al principio. Solo nos falta enlazar el url del proyecto con el url de la aplicación, lo haremos a través del path como nos pone Django en la documentación de este mismo archivo, usando el comando 'include' que previamente habremos de importar.
PracticaDjango/PracticaDjango/ulrs.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('proyecto_web_app/', include('Proyecto_web_app.urls')),
]
Llegado este punto, tenemos que comprobar que funcionan bien las urls teniendo en cuenta el path que acabamos de escribir. Para acceder a las vistas tendríamos que hacer lo siguiente. Vamos a ver como acceder a una con un ejemplo.
PracticaDjango/PracticaDjango/urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('Proyecto_web_app.urls')), ]
Plantillas de las vistas.
PracticaDjango/Proyecto_web_app/templates/Proyecto_web_app/home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home</title>
</head>
<body>
Home
</body>
</html>
PracticaDjango/PracticaDjango/settings.py
...
# Application definition
INSTALLED_APPS = [
# Nuestras aplicaciones.
'Proyecto_web_app.apps.ProyectoWebAppConfig',
# Aplicaciones por defecto.
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
...
PracticaDjango/Proyecto_web_app/views.py
from django.shortcuts import render, HttpResponse
# Create your views here.
def home(request):
return render(request, 'Proyecto_web_app/home.html')
def servicios(request):
return render(request, 'Proyecto_web_app/servicios.html')
def tienda(request):
return render(request, 'Proyecto_web_app/tienda.html')
def blog(request):
return render(request, 'Proyecto_web_app/blog.html')
def contacto(request):
return render(request, 'Proyecto_web_app/contacto.html')