====== 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}}