Herramientas de usuario

Herramientas del sitio


notas:django

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

notas/django.txt · Última modificación: por 127.0.0.1