#PyDayTF 11/03/2017
Utilizando las herramientas mencionadas, preparar un entorno de trabajo para nuestro proyecto django
$ sudo apt-get install -y python-pip
$ sudo -H pip install virtualenv -U
$ virtualenv myvenv -p python3.6
Aislamiento de todas las dependencias
$ . myvenv/bin/activate
(myvenv)$ pip install django
Chequear la versión de django (1.10.6)
(myvenv)$ python -c "import django; print(django.get_version())"
Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design
Garantiza la modularidad y reusabilidad
Configuración y aplicaciones de un sitio web
Aplicación web que cumple una funcionalidad
django_pyday2017
y configurarlo
(myvenv)$ django-admin startproject django_pyday2017
django_pyday2017
├─── manage.py - python manage.py (no tocar)
└─── django_pyday2017
settings.py - Configuración del proyecto
urls.py - Asociar URLs a vistas
wsgi.py - Servidor wsgi (no tocar)
__init__.py - Paquete (no tocar)
settings.py
contiene la configuración del sitio web
ALLOWED_HOSTS = ['*', ]
...
TIME_ZONE = 'Atlantic/Canary' # Zona Horaria
LANGUAGE_CODE = 'es' # Código de Idioma
...
STATIC_URL = '/static/'
STATIC_ROOT = 'collected_static'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
Gran variedad de opciones de bases de datos: PostgreSQL, MySQL, SQLite, Oracle, ...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mydatabase',
}
}
(myvenv)$ python manage.py migrate
https://docs.djangoproject.com/en/1.10/ref/settings/#databases
Para servir los ficheros estáticos necesitamos añadir una nueva url en el fichero urls.py
from django.conf import settings as st
from django.conf.urls.static import static
urlpatterns = [
# ... resto de tus URLs ...
] + static(st.STATIC_URL, document_root=st.STATIC_ROOT)
https://docs.djangoproject.com/en/1.10/ref/urls/
(myvenv)$ python manage.py collectstatic
(myvenv)$ python manage.py runserver
Verifica que tu sitio web está corriendo
requirements.txt
contiene todos los paquetes que serán necesarios para el proyecto
.
├── db.sqlite3
├── django_pyday2017
│ ...
├── manage.py
└── requirements.txt
django < 1.11
Werkzeug
django-extensions
Pillow
django-localflavor
django-crispy-forms
(myvenv)$ pip install -Ur requirements.txt
Extensión de comandos propios del manage.py
https://django-extensions.readthedocs.io/en/latest/installation_instructions.html
requirements.txt
e instalarloINSTALLED_APPS
en el settings.py
INSTALLED_APPS = [
...,
'django_extensions',
]
(myvenv)$ python manage.py migrate
Arrancamos la aplicación con modo debug integrado
(myvenv)$ python manage.py runserver_plus
Crear una aplicación en django llamada events
que
servirá para gestionar y publicar un listado de próximos eventos, así como para gestionar las
inscripciones a los mismos.
(myvenv)$ django-admin startapp events
Añadir la aplicación en INSTALLED_APPS
en el settings.py
.
├── db.sqlite3
├── django_pyday2017
│ ...
├── events
│ ├── admin.py - Interfaz administrativa
│ ├── apps.py - Configuración de la aplicación
│ ├── __init__.py
│ ├── migrations - Migraciones de la BBDD
│ │ └── __init__.py
│ ├── models.py - Definición de la BBDD
│ ├── tests.py - Tests
│ └── views.py - Gestión de los datos
├── manage.py
└── requirements.txt
models.py
(myvenv) $ python manage.py makemigrations events
(myvenv) $ python manage.py sqlmigrate events 0001
(myvenv) $ python manage.py migrate
Crear un superusuario
(myvenv) $ python manage.py createsuperuser
Username (leave blank to use 'pyday'): admin
Email address: a@a.es
Password: pyday2017
Registramos los modelos editando admin.py
.
from django.contrib import admin
from .models import Evento, Inscripcion
admin.site.register(Evento)
admin.site.register(Inscripcion)
API que permite la abstracción de la BBDD:
Abrimos una shell interactiva del proyecto y empezamos a jugar
(myvenv) $ python manage.py shell_plus
https://django-extensions.readthedocs.io/en/latest/installation_instructions.html
Añadir nuestra aplicación al urls.py
general
from django.conf.urls import url
urlpatterns = [
...
url(r'^evento/', include('events.urls')),
...
]
En el específico, definir una por cada acción que se quiera realizar.
url(r'^(?P<evento_id>\d+)/$', views.detalle, name='detalle'),
Las vistas genéricas abstraen los patrones comunes hasta el punto en que ni siquiera es necesario escribir código Python para escribir una aplicación.
https://docs.djangoproject.com/en/1.10/ref/class-based-views/
Creación del directorio templates
en la raíz del proyecto y un subdirectorio por cada aplicación.
.
├── events
| ...
├── manage.py
├── requirements.txt
├── static
│ ...
└── templates
├── base.html - Genérica con bloques definidos
└── events
├── ..._detail.html - Extienden de base y rellenan
└── ..._form.html los bloques
https://docs.djangoproject.com/en/1.10/ref/templates/language/
#PyDayTF 11/03/2017