====== 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.
{{tag>django}}