Contenido

Django: Creación de un sitio básico con Admin

Con todo el rollo de la mudanza me he dado cuenta de que no he escrito ningún artículo sobre Django. Estaba convencido de haberlo hecho. Así que voy a tener que arreglar el problema XD

Django

Qué es

Django es un framework para la creación de aplicaciones web. Se centra en el backend, ofreciendo plantillas para el frontend, aunque para este último seguramente utilicemos otro framework adicional tipo JQuery , Dojo , Mootools , Prototype , etc.

Instalación

Podemos instalarlo utilizando easyinstall , aunque es paquete Debian . Se puede aislar la instalación de un site Django, con el fin de replicarla fácilmente.

Creación

Vamos a crear un CMS pequeñito. Va a tener blogs y nada más. Para ello, lo primero será decirle a Django que nos cree el sitio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ django-admin startproject myblog
$ cd myblog
$ python manage.py startapp blog
$ tree
.
|-- blog
|   |-- __init__.py
|   |-- models.py
|   |-- tests.py
|   `-- views.py
|-- __init__.py
|-- manage.py
|-- settings.py
`-- urls.py

1 directory, 10 files
$

Antes de seguir, configuraremos la BBDD, modificando el archivo settings.py, en el que indicaremos la BBDD a utilizar. Aprovechamos también para indicar en las aplicaciones instaladas que queremos utilizar “admin” y nuestro nuevo modulo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'database.db',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}

TEMPLATE_DIRS = (
    '/AQUI_VA_UNA_RUTA_ABSOLUTA/'
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'blog',
)

Dejad el resto de entradas como estén.

Con esto ya podemos ejecutar el servidor, aunque servirá poco:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ python manage.py syncdb
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'miguel'): admin
E-mail address: admin@example.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
No fixtures found.
$ python manage.py runserver
Validating models...

0 errors found
Django version 1.3, using settings 'myblog.settings'
Development server is running at https://127.0.0.1:8000/
Quit the server with CONTROL-C.

Y ya podemos abrir el site, que se encuentra en https://127.0.0.1:8000/

El modelo

Editaremos el modelo (blog/models.py), donde estableceremos un modelo muy básico:

1
2
3
4
5
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()

Como se ve, tendremos un título y un cuerpo. De momento no nos hace falta nada más.

URLs

Ahora vamos a modificar el archivo urls.py. Este archivo se utiliza para que django sepa qué debe hacer para cada URL que se le solicita. Por eso trabaja con expresiones regulares, de manera que pueda identificar qué servicio o HTML debe procesar en cada caso. Nosotros necesitamos descomentar las líneas correspondientes a django-admin (archivo urls.py):

1
2
3
4
5
6
7
8
from django.conf.urls.defaults import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^blog/', 'myblog.blog.views.list'),
)

Administración

Vamos a configurar la herramienta de administración, para poder editar nuestras entradas. Para ello utilizaremos el archivo blog/admin.py

1
2
3
4
from myblog.blog.models import Post
from django.contrib import admin

admin.site.register(Post)

La vista

En el archivo de URLs indicamos que, ante la URL blog/, veríamos *blog.views.list. Aún no hemos definido esto, y lo haremos en el archivo admin/views.py:

1
2
3
4
5
6
from django.shortcuts import render_to_response
from blog.models import Post

def list(request):
    return render_to_response('blog/list.html',
                              {'post_list': Post.objects.all()})

Con esto acabamos de crear una dependencia: blog/list.html. En este caso, necesitaremos crear una plantilla. Las plantillas no van con nuestro proyecto, sino que las deberíamos poner a parte. Cuando se construye un sitio Django, los módulos van por un lado, cada uno de ellos lo más aislado posible del resto. Si es posible, no deberían tener dependencias entre ellos (si es posible, insisto). Serán las plantillas las que le den homogeneidad y unión a todo el site. En la el archivo ‘settings.py’ establecimos una ruta para TEMPLATE_DIRS. Ahí es donde crearemos nuestro archivo blog/list.html:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<html>
<head>
  <title>Lista de Posts</title>
</head>
<body>
<h1>Lista de Posts</h1>{% if post_list %}
   <ul>
     {% for post in post_list %}
     <li>{{ post.title }}</li>
     {% endfor %}
   </ul>{% else %}
   <p>No blogs found.</p>{% endif %}
</body>
</html>

Al llamar a nuestra plantilla creamos la variable post_list que estamos recorriendo en la plantilla y pintando de la forma adecuada.

Cómo usarlo

¡¡Ya lo tenemos todo montado!! Ehmmm… y ahora… ¿qué?

Bueno, pues vamos a usarlo. Primero vamos a asegurarnos de que la base de datos está actualizada y vamos a ejecutar el servicio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ python manage.py syncdb
Creating tables ...
Installing custom SQL ...
Installing indexes ...
No fixtures found.
$ python manage.py runserver
Validating models...

0 errors found
Django version 1.3, using settings 'myblog.settings'
Development server is running at https://127.0.0.1:8000/
Quit the server with CONTROL-C.

Vale, ya está funcionando. Ahora nos vamos a la URL que nos dice: https://127.0.0.1:8000 , lo que nos dará un bonito error de página no encontrada. Como tenemos habilitado el depurado, vemos lo que ha ocurrido: la URL solicitada no se ajusta a ninguno de los patrones definidos.

Vamos primero con la interfaz de administración: https://127.0.0.1:8000/admin . Nos pedirá contraseña (la que pusimos al hacer el primer syncdb) y entramos en la parte de administrador. Deberíamos ver 3 bloques:

  • Auth
  • Blog
  • Sites

Si es así, es que lo hemos hecho todo bien. Creamos un par de posts en el módulo “Blog”. No tiene pérdida.

Toda esta interfaz de administración se ha creado automáticamente gracias a que hemos incorporado django-admin.

¿Ya tenemos los 2-3 posts? Bien. Vamos ahora a la URL de visualización: https://127.0.0.1:8000/blog . Poco que decir aquí, salvo que deberíamos estar viendo nuestro blog :D

Más información

Evidentemente, el estupendo tutorial de django :D.

Despedida

Si veo que tiene tirón, quizá un día de estos continúe este pequeño manual. Hay muchas cosas que se pueden hacer aún:

  • Paginar las entradas cuando haya muchas.
  • Crear una interfaz CRUD para no tener que editar los Posts desde la interfaz de administración, sino desde el propio site.
  • Darle color al sitio.
  • Añadir Tags a los Posts.
  • Ordenar por fecha de publicación.
  • Gestionar usuarios.
  • Añadir pruebas.
  • [Dele rienda suelta a su imaginación y ponga aquí su deseo.]