Tabla de Contenidos
Django
Voy a documentar aquí mis primeros pasos con Django. Esto arranca el 10 de abril de 2008, luego de haber leído el Django Book (en papel!) y haber estado experimentando con Python y bases Isis durante algunas semanas.
La intención es replicar con Django la funcionalidad del servidor en Catalis.
NOTA: Durante el camino voy incluyendo algunos errores deliberados, para que se pueda ver cómo los mensajes de error que aparecen me van guiando.
Sistema operativo: Ubuntu 7.10
Python 2.5.1 (r251:54863, Oct 5 2007, 13:36:32)
Creación del proyecto
Directorio de trabajo: /home/fernando/pyprojects/django, inicialmente vacío.
$ cd /home/fernando/pyprojects/django
Verificamos que el comando django-admin está disponible:
$ which django-admin /usr/bin/django-admin
Creamos el proyecto catalis, y vemos los archivos creados:
$ django-admin startproject catalis $ ll catalis/ total 12 -rw-r--r-- 1 fernando fernando 0 2008-04-10 15:04 __init__.py -rwxr-xr-x 1 fernando fernando 542 2008-04-10 15:04 manage.py -rw-r--r-- 1 fernando fernando 2806 2008-04-10 15:04 settings.py -rw-r--r-- 1 fernando fernando 227 2008-04-10 15:04 urls.py
NOTA: en Windows, modificamos la variable PATH, añadiendo la carpeta C:\Python25\Lib\site-packages\django\bin, y ejecutamos
$ django-admin.py startproject catalis
Luego iniciamos el servidor web de desarrollo:
$ cd catalis $ python manage.py runserver Validating models... 0 errors found. Django version 0.96, using settings 'catalis.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
Entramos con Firefox a http://127.0.0.1:8000/ y vemos este mensaje:
It worked! Congratulations on your first Django-powered page. Of course, you haven't actually done any work yet. Here's what to do next: * If you plan to use a database, edit the DATABASE_* settings in catalis/settings.py. * Start your first app by running python catalis/manage.py startapp [appname]. You're seeing this message because you have DEBUG = True in your Django settings file and you haven't configured any URLs. Get to work!
Acceso al sitio de administración
Ahora quiero entrar a la interfaz de administración, y poder configurar usuarios. Edito urls.py
y descomento la línea
(r'^admin/', include('django.contrib.admin.urls')),
Intento entrar a http://127.0.0.1:8000/admin/
, y aparece este mensaje:
ImproperlyConfigured at /admin/ You'll need to put 'django.contrib.admin' in your INSTALLED_APPS setting before you can use the admin application. Request Method: GET Request URL: http://127.0.0.1:8000/admin/ Exception Type: ImproperlyConfigured Exception Value: You'll need to put 'django.contrib.admin' in your INSTALLED_APPS setting before you can use the admin application. Exception Location: /var/lib/python-support/python2.5/django/contrib/admin/views/main.py in , line 19
Vamos entonces a editar settings.py
, y agregamos 'django.contrib.admin
' en INSTALLED_APPS:
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.admin', )
ATENCION. Aquí debería ejecutar python manage.py syncdb
, necesario cada vez que se modifica INSTALLED_APPS
.
Reintento con http://127.0.0.1:8000/admin/
, y ahora el mensaje es:
ImproperlyConfigured at /admin/ You haven't set the DATABASE_ENGINE setting yet. Request Method: GET Request URL: http://127.0.0.1:8000/admin/ Exception Type: ImproperlyConfigured Exception Value: You haven't set the DATABASE_ENGINE setting yet. Exception Location: /var/lib/python-support/python2.5/django/db/backends/dummy/base.py in complain, line 13
Por supuesto, no podemos administrar nada —en particular, los usuarios— si no tenemos una base de datos configurada. Volvemos a editar settings.py
, y modificamos estos dos parámetros:
DATABASE_ENGINE = 'sqlite3' DATABASE_NAME = '/home/fernando/pyprojects/db/catalis.db'
El directorio /home/fernando/pyprojects/db/
inicialmente está vacío.
NOTA: en Windows, tener en cuenta el uso correcto de las barras en el path.
Cuando volvemos a visitar http://127.0.0.1:8000/admin/
nos encontramos con el formulario de login (Django administration), y vemos que se ha creado el archivo de la base de datos, catalis.db
.
ATENCION. Falta una parte, cuando en la consola me pide un superuser, contraseña y dirección de correo. Eso sucedió en el primer intento, y no me pasó al reproducir los pasos para este tutorial. Investigar. Tiene que ver con el comando python manage.py syncdb por primera vez. Esto fue hecho con Windows:
G:\temp\django\catalis>python manage.py syncdb Creating table auth_message Creating table auth_group Creating table auth_user Creating table auth_permission Creating table django_content_type Creating table django_session Creating table django_admin_log You just installed Django's auth system, which means you don't have any superuse rs defined. Would you like to create one now? (yes/no): yes Username: fernando E-mail address: fjgomez@gmail.com Password: Password (again): Superuser created successfully. Installing index for auth.Message model Installing index for auth.Permission model Installing index for admin.LogEntry model Loading 'initial_data' fixtures... No fixtures found.
Entro con mis datos (username, password) y me encuentro con la interfaz de administración. Las opciones para administrar son:
Auth Groups Add Change Users Add Change Sites Sites Add Change
Agrego un nuevo usuario, guest, sin privilegios de admin.
Documentación
En la cabecera del sitio admin, hay un link Documentation. Me lleva a http://127.0.0.1:8000/admin/doc/
, donde aparece este mensaje:
Documentation The admin documentation system requires Python's docutils library. Please ask your administrators to install docutils.
Abro Synaptic e instalo el paquete python-docutils. Instalado el paquete, puedo importarlo desde Python, pero sigo viendo el mismo mensaje en http://127.0.0.1:8000/admin/doc/
. Solución: reiniciar el servidor:
$ python manage.py runserver
En Windows, bajo el archivo docutils-snapshot.tgz
, descomprimo e instalo con doble clic en install.py
(o bien ejecutando python install.py
).
Profiles
Para poder almacenar más datos acerca de cada usuario —e.g. institución, nro. de teléfono, bases a las que tiene acceso, …— podemos usar un profile.
En settings.py
agregamos:
AUTH_PROFILE_MODULE = 'catalis.UserProfile'
Y creamos un archivo models.py
con esto:
from django.db import models from django.contrib.auth.models import User class UserProfile(models.Model): user = models.ForeignKey(User, unique=True) institution = models.CharField(maxlength=100) phone_number = models.PhoneNumberField() class Admin: pass
Corremos syncdb
, reiniciamos el servidor, y tenemos un nuevo modelo en la interfaz de Admin, User profiles. El problema es que queda como un objeto separado del objeto User asociado.
Desde el punto de vista del código, está todo bien; esto da el resultado esperado:
from django.contrib.auth.models import User u = User.objects.get(pk=1) # Get the first user in the system user_address = u.get_profile().home_address
La inconveniencia pasa por la interfaz de Admin.
Templates, views
Creo el directorio templates
dentro de catalis
. Edito settings.py
:
TEMPLATE_DIRS = ( # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. '/home/fernando/pyprojects/django/catalis/templates', )
Creo un archivo catalis/views.py
con una vista sencilla:
## COPIAR CONTENIDO def hello(request):
y un template también sencillo, catalis/templates/hello.html
:
## COPIAR CONTENIDO
Finalmente, agrego una línea a urls.py
:
## COPIAR AQUI
Para modificar las plantillas de la interfaz de administración, copiamos archivos de django/contrib/admin/templates/admin a catalis/templates/admin, y los modificamos.
URLs
Ahora podemos empezar a configurar las URLs, de acuerdo con las tareas a realizar.
django