- Introducción
- Requerimientos previos
- Pipenv
- Creación de un proyecto con Django
- Hello World!
- App con templates
- Admin y DB
- Lista de proyectos
Esta es una pequeña guia para la creación de proyectos con la ultima version de Django 2.0.X y las herramientas recomendadas para su gestion. Esta guia toma como referencia la excelente documentación creada por el profesor Will Vincent en su pagina https://djangoforbeginners.com/
Para poder ejecutar Django en nuestro equipo es necesario tener instalado lo siguiente:
- Python 3: La ultima version del lenguaje de programación sobre el cual trabaja Django 2.0.X.
- Pip: Gestor de paquetes de Python.
Anteriormente al desarrollar con Python era necesario usar las dos principales herramientas de este lenguaje: Pip como gestor de paquetes y virtualenv como gestor de entornos virtuales, estas eran las herramientas recomendadas por Python. Actualemente la utileria recomendada para la gestion de entornos virtuales es Pipenv el cual combina las funcionalidades de ambas.
Por un lado Pipenv crea un entorno virtual donde instala, desinstala y actualiza paquetes de manera aislada del sistema u otros entornos virtuales, ademas de crear un par de archivos los cuales gestionan las dependencias de nuestra aplicación permitiendonos transladar estos archivos a otro entorno y reinstalar las dependencias adecuadas para el funcionamiento de la aplicación.
La forma mas sencilla de instalar Pipenv es mediane Pip
Comprobar que Pip esta instalado:
$ pip3 --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)
En caso de no estar instalado es necesario instalarlo
$ sudo apt install python3-pip
Nota: Esta instalacion se realiza en un sistema Linux con base Deb
Instalacion de Pipenv
$ sudo -H pip3 install -U pipenv
Comprobar que Pipenv se instalo correctamente
$ pipenv --version
pipenv, version 9.0.3
Instalación de una biblioteca y creación de su entorno virtual usando Python 3
# Creación de la carpeta donde se alojara el entorno y los documentos de dependencias
$ mkdir Entorno
# Creacion del entorno virtual e instalación del paquete
$ pipenv --three install django
Esto crea un archivo Pipfile y Pipfile.lock los cuales gestionan las dependencias del entorno virtual. Los entornos virtuales se alojan en /home/usuario/.local/share/virtualenvs el cual tambien genera un enlace sinbolico en /home/usuario/.virtualenv.
Instalación de una version específica de un paquete
# Instala especificamente la versión 1.10.1 de Django
$ pipenv --three install 'django==1.10.1'
ó
# Instala una version de Django mayor a la 1.10 pero menor a la 1.11
$ pipenv --three install 'django>1.10,<1.11'
Activación del entorno virtual
$ pipenv shell
(django-JmZ1NTQw) $
Actualizar paquetes del entorno virtual
(django-JmZ1NTQw) $ pipenv --update
Ver las dependencias del entorno virtual
(django-JmZ1NTQw) $ pipenv graph
Salir del entorno virtual
(django-JmZ1NTQw) $ exit
$
Desinstalar un entorno virtual
$ pipenv --rm
Instalar las dependencias de un entorno virtual a partir de los archivos Pipfile y Pipfile.lock
$ pipenv install
# Creación de la carpeta donde se va a alojar el proyecto
$ mkdir Carpeta
# Cambiar al directorio del proyecto
$ cd Carpeta
# Creacion del entorno e instalación de Django con Python3
$ pipenv --three install django
# Activacion del entorno
$ pipenv shell
(django-JmZ1NTQw) $
Crear el proyecto con Django
(django-JmZ1NTQw) $ django-admin.py startproject nuevo .
Ejecutar el servidor de Django para comprobar que todo se instalo y funciona correctamente
# Moverse dentro de la carpeta del proyecto
(django-JmZ1NTQw) $ cd nuevo
# Ejecutar el servidor
(django-JmZ1NTQw) $ ./manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
You have 14 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, 2018 - 01:38:44
Django version 2.0.2, using settings 'nuevo.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Al ingresar la dirección http://127.0.0.1:8000/ se deberia visualizar algo como lo siguiente:
Para finalizar el servidor se precionan las teclas Ctrl + C y para salir del entorno
(django-JmZ1NTQw) $ exit
$
# Creación de la carpeta raiz
$ mkdir helloworld
# Cambiar a la carpeta raiz
$ cd helloworld
# Crear entorno virtual e instalación de Django
$ pipenv --three install django
# Activación del entorno virtual
$ pipenv shell
# Entorno activado
(helloworld-415ivvZC) $
# Iniciar el proyecto
(helloworld-415ivvZC) $ django-admin startproject helloworld_project .
# Ejecutar el servidor para comprobar que Django se ejecuta correctamente
(helloworld-415ivvZC) $ ./manage.py runserver
# Crear una aplicación
(helloworld-415ivvZC) $ ./manage.py startapp pages
Se añade la aplicación al archivo settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'pages.apps.PagesConfig', <- Aplicación añadida pages/apps.py/PagesConfig()
]
Se crea la vista en el archivo pages/views.py
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
def homePageView(request):
return HttpResponse('Hola Mundo!')
Se crear el archivo pages/urls.py y se agrega la vista
from django.urls import path
from . import views
urlpatterns = [
path('', views.homePageView, name='home')
]
Se edita el archivo urls principal helloworld_project/urls.py
from django.contrib import admin
from django.urls import path, include # Se añade el include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('pages.urls')), # Se añade la ruta a pages/urls.py
]
Se ejecuta nuevamente el servidor para probar la aplicación
(helloworld-415ivvZC) $ ./manage.py runserver
Al ingresar la dirección http://127.0.0.1:8000/ se deberia visualizar algo como lo siguiente:
$ mkdir simple
$ cd simple
$ pipenv --three install django
$ pipenv shell
(simple-BrSeYfS6) $
(simple-BrSeYfS6) $ django-admin startproject simple_project .
(simple-BrSeYfS6) $ ./manage.py startapp pages
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'pages.apps.PagesConfig',
]
Comprobamos que todo funciona
(simple-BrSeYfS6) $ ./manage.py runserver
(simple-BrSeYfS6) $ mkdir templates
(simple-BrSeYfS6) $ touch templates/home.html
Esto deja una estrucutura del proyecto como la siguiente:
.
├── db.sqlite3
├── manage.py
├── pages
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── Pipfile
├── Pipfile.lock
├── simple_project
│ ├── __init__.py
│ ├── __pycache__
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── templates <-- Directorio templates
└── home.html
Añadir el template en settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], <- Añadiendo la carpeta templates al proyecto
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
Se añade algo de texto al template creado templates/home.html
<h1>Homepage.</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur ducimus dolorum, recusandae enim, quidem facere?</p>
En versiones anteriores de Django se usaban las vistas creadas mediante funciones , para cumplir la filosofia DRY (Don't Repeat Yourself) se introdujo las Class-Based Views, vistas creadas con clases
Se crea la vista en pages/views.py
from django.views.generic import TemplateView
class HomePageView(TemplateView):
template_name = 'home.html'
Se crea la url para la vista creando el archivo pages/urls.py
(simple-BrSeYfS6) $ touch pages/urls.py
pages/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.HomePageView.as_view(), name='home'),
]
Se añade la url del archvio pages/urls.py en simple_project/urls.py
from django.contrib import admin
from django.urls import path, include # Se añade el include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('pages.urls')), # URL de pages/url.py
]
Se prueba que la vista este funcionando correctamente
(simple-BrSeYfS6) $ ./manage.py runserver
Al ingresar la dirección http://127.0.0.1:8000/ se deberia visualizar algo como lo siguiente:
Se añade una pagina About siguiendo los pasos anteriores
(simple-BrSeYfS6) $ touch templates/about.html
Se añade texto al about.html
<h1>About page.</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur ducimus dolorum, recusandae enim, quidem facere?</p>
Se añade la vista en pages/views.py
from django.views.generic import TemplateView
# Vista de Home
class HomePageView(TemplateView):
template_name = 'home.html'
# Vista de About
class AboutPageView(TemplateView):
template_name = 'about.html'
Se añade la URL del about en pages/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.HomePageView.as_view(), name='home'),
path('about/', views.AboutPageView.as_view(), name='about'), # Se añade la URL del about
]
Se crea un archivo base.html
(simple-BrSeYfS6) $ touch templates/base.html
Se le añade contenido a templates/base.html
<!-- pages/base.html -->
<header>
<a href="{% url 'home' %}">Home</a> | <a href="{% url 'about' %}">About</a>
</header>
{% block content %}
{% endblock content%}
Se extiende el contenido de base.html en home.html y en about.html templates/home.html
<!-- templates/home.html -->
{% extends 'base.html' %}
{% block content %}
<h1>Homepage.</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur ducimus dolorum, recusandae enim, quidem facere?</p>
{% endblock content %}
templates/about.html
<!-- templates/about.html -->
{% extends 'base.html' %}
{% block content %}
<h1>About page.</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur ducimus dolorum, recusandae enim, quidem facere?</p>
{% endblock content %}
Generando un resultado parecido a esto:
En esta seccion se creara un proyecto de Django que usa Bases de Datos y la interfaz administrativa de Django. La Base de Datos que se usara es la BD por defecto de Django SQLite
$ mkdir mb
$ cd mb
$ pipenv --three install django
$ pipenv shell
(mb-oo2dIS7L) $
(mb-oo2dIS7L) $ django-admin startproject mb_project .
(mb-oo2dIS7L) $ ./manage.py startapp posts
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'post.apps.PostConfig',
]
Para establecer el idioma y la zona horaria se realizan las modificaciones necesarias en el settings.py
LANGUAGE_CODE = 'es-mx'
TIME_ZONE = 'America/Mexico_City'
Se realiza la migracion de la BD
(mb-oo2dIS7L) $ ./manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
Esta operacion genera el contenido en la BD en el archivo db.sqlite3 que se genera en el proyecto.
post/models.py
from django.db import models
# Create your models here.
class Post(models.Model):
text = models.TextField() # Nombre del campo y tipo de dato
En este caso se indica que se cree en la BD un campo de nombre text de tipo TextField.
Ya que se creo un nuevo modelo con un nuevo campo es necesario crear la migracion de datos a la BD
(mb-oo2dIS7L) $ ./manage.py makemigrations post
Migrations for 'post':
post/migrations/0001_initial.py
- Create model Post
(mb-oo2dIS7L) $ ./manage.py migrate
Operations to perform:
Apply all migrations: post
Running migrations:
Applying post.0001_initial... OK
Se crea un Super Usuario para usar el admin de Django
(mb-oo2dIS7L) $ ./manage.py createsuperuser
Username (leave blank to use 'usuario'):
Email:
Password:
Password (again):
Superuser created successfully.
Se ejecuta el servidor
(mb-oo2dIS7L) $ ./manage.py runserver
Al ingresar a la direccion http://127.0.0.1:8000/admin/ nos aparece la pantalla de login del administrador
Despues de ingresar el usuario y contraseña del super usuario que se creo, se muestra una pantalla como la siguiente
Para mostrar el campo del modelo se edita post/admin.py
from django.contrib import admin
from .models import Post
# Register your models here.
admin.site.register(Post)
y se añade una funcion a post/models.py para mostrar el contenido de los campos
from django.db import models
# Create your models here.
class Post(models.Model):
text = models.TextField() # Nombre del campo y tipo de dato
def __str__(self): # Función añadida para que muestre correctamente los campos del modelo
return self.text
post/views.py
posts/views.py
Se crean los templates
(mb-oo2dIS7L) $ mkdir templates
(mb-oo2dIS7L) $ touch templates/home.html
settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
templates/home.html
<h1>Message board homepage</h1>
<ul>
{% for post in object_list %}
<li>{{ post }}</li>
{% endfor %}
</ul>
mb_project/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('posts.urls')),
]
Se crea el archvi post/urls.py
(mb-oo2dIS7L) $ touch templates/urls.html
post/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.HomePageView.as_view(), name='home'),
]
Se ejecuta el servidor
(mb-oo2dIS7L) $ ./manage.py runserver
Al ingresar la dirección http://127.0.0.1:8000/ se deberia visualizar algo como lo siguiente:
Desde el admin se puede seguir añadiendo contenido
En esta seccion se pondran los enlaces de git de cada uno de los proyectos realizados: