lunes, 29 de abril de 2013

Montando un pequeno foro con Django [I]: Preparación e modelos de dados

Hoxe quero amosarvos unha ferramenta que permite crear páxinas web moi comodamente, aforrando os problemas que se repiten todas as veces, creando táboas na base de datos, realizando búsquedas ou modificacións sobre os datos sen nengún esforzo adicional, e todo iso en Python!



0. Instalación

Para instalar Django tiraremos do PIP, e só con escreber
sudo pip install django


1. Creando os arquivos

Para crear os arquivos entramos no directorio no que queiramos deixar o proxecto e executaremos:
django-admin.py startproject <nome do proxecto>

Neste caso
django-admin.py startproject hl_django

Esto creará un cartafol con outro con ese nome e un script `manage.py', este script permitaranos manexar
a instalación, por exemplo se queremos iniciar o proxecto nun servidor web faremos:
python manage.py runserver

En Django cada proxecto está composto dun numero de aplicacións, crearemos unha para o servidor con ese script.
python manage.py startapp meu_foro

Isto creará outro cartafol para `meu_foro', xa está todo no seu sitio, pasemos entón a configuración.


2. Enlazando os componentes

A configuración estará dentro do arquivo `settings.py' no cartafol do proxecto, `hl_django', está bastante comentadiño e pódese entender ben, pero ímos describir as que póde ser interesante considerar o principio...
DEBUG = True
TEMPLATE_DEBUG = DEBUG

Estas dúas directivas indican se queremos activar a depuración do código en xeral a primeira e das plantillas a segunda, convén telas activadas (postas a True) mentres andamos trasteando nos arquivos e desactivalas (postas a False) cando o subamos a un servidor público.

Nota: todos os arquivos de configuración son realmente scripts de `python', con todas as posibilidades que iso trae, se queredes por exemplo podedes dicir que so se active a depuración se hai unha variable de entorno que o diga:

import os
DEBUG = os.getenv("DEBUG") is not None
TEMPLATE_DEBUG = DEBUG
Antes de marcar DEBUG voltaba cun erro, despois non
Seguinte variable:

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)
MANAGERS = ADMINS

No caso de ter que indicar os nomes/correo de quen administre o servidor tomaranse de aquí é mesmo para quenes o xestionan.
O seguinte é a configuración da base de datos, traduzo os comentarios por se queda máis claro
DATABASES = {
    'default': {
            'ENGINE': 'django.db.backends.', # Engade 'postgresql_psycopg2', 'mysql', 'sqlite3' ou 'oracle'.
            'NAME': '',                      # Nome da base de datos (ou arquivo no caso de usar sqlite3).
            # Os seguintes parámentros non se usan con sqlite3:
            'USER': '',
            'PASSWORD': '',
            'HOST': '',                      # Vacío para localhost a través de sockets de dominio ou '127.0.0.1' para localhost por TCP.
            'PORT': '',                      # Unha cadea vacía para o porto por defecto
    }
}

Por exemplo, se queremos unha base de datos sqlite en db.sqlite3 (esta será da que tiraremos o resto do exemplo):
DATABASES = {
    'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': 'db.sqlite3',
    }
}

Ademáis o máis seguro e que querades cambiar as de TIME_ZONE, LANGUAGE_CODE.


3. O panel de control

Django trae de paquete unhas cantas cousas, entre elas está un panel de control para manexar os datos, se queremos activalo só temos que activalo descomentando un par de liñas de código, no `settings.py' en INSTALLED_APPS o 'django.contrib.admin' e no `urls.py' (xa veremos máis tarde que fai) as seguintes liñas:
from django.contrib import admin
admin.autodiscover()

# E na declaración do urlpatterns
url(r'^admin/', include(admin.site.urls)),

Se agora lanzamos o servidor con

python manage.py runserver

E accedemos a `http://127.0.0.1:8000/admin/', queixarase de que non hai base de datos... para creala usaremos este comando:

python manage.py syncdb

Comezará a xerar tablas e preguntará se queremos crear un superusuario, dirémoslle que `yes', e despois de darlle nome de usuario, email e contrasinal acabará co proceso, agora xa podemos acceder o panel de control.
Ben... hai pouca cousa, haberá que poñerse a crear datos...


4. Xeración do modelo

Comezamos entón co foro, o primeiro que faremos é definir os datos que manexaremos, polo que pon no panel de control sabemos que os usuarios xa os manexa Django sen precisar de entrar niso, así que centrándos no que queremos facer creo que podemos estructuralo da seguinte forma:

  • Temos Temas, cada un con un nome e unha descripción (os ID non os hai que definir, creanse automáticamente).
  • Cada tema ten un número de Fíos, estes co nome, o Tema o que pertencen, o usuario que o creou, e unha data de creación.
  • Do mesmo xeito cada fío ten un ou varios Posts, coa información do usuario que o enviou, o fío o que pertencen e o seu texto.

E como introducimos iso no proxecto? pois no directorio `meu_foro' atoparemos un arquivo `models.py', ahí podemos definilos coma subclases do `Model' de `django.db.models' (que xa estará importado o comezo do ficheiro), iso sí, se queremos tirar dos usuarios de Django teremos que importar o módulo así:
from django.contrib.auth.models import User

Nota: Convén poñer isto o comezo mesmo do arquivo para que lea ven os caracteres acentuados e demáis:
#coding: utf-8

Voltando os modelos
# Temos a clase tema, cos campos de nome e descripción
class Tema(models.Model):
nome = models.CharField(max_length=50)
descripcion = models.CharField(max_length=1000)

# Os fíos, co seu nome, tema, usuario que o creou e data de creación
class Fio(models.Model):
    nome = models.CharField(max_length=50)
    tema = models.ForeignKey(Tema) # Ollo o dato, así indicamos que é outro dato, con ForeignKey
    op = models.ForeignKey(User)   # Outro campo
    data_creacion = models.DateTimeField('data de publicación')

# E o último, o post no fío
class Post(models.Model):
    fio = models.ForeignKey(Fio)
    usuario = models.ForeignKey(User)
    data_creacion = models.DateTimeField('data de publicación')
    texto = models.TextField()

Agora para convertir estes modelos en táboas na base de dados teremos que incluír 'meu_foro' na lista das INSTALLED_APPS no `settings.py' e facer isto:
python manage.py sql meu_foro

Amosará o código para crear as táboas, se queremos aplicalo só temos que facer
python manage.py syncdb

Un último paso e xa os teremos a vista no panel de control... no directorio `meu_foro' crearemos un script `admin.py' con este código:
# Partindo dos modelos (Tema, Fio e Post) definidos para meu_foro
from meu_foro.models import Tema, Fio, Post
# E o xestor do panel de control
from django.contrib import admin

# Rexistramos cada modelo no panel de control
for modelo in (Tema, Fio, Post):
    admin.site.register(modelo)

E desta xa está, xa temos o noso panel de control funcionando cos modelos do foro, o seguinte paso será preparar a navegación polo foro.

No hay comentarios:

Publicar un comentario