martes, 22 de marzo de 2016

Creando los modelos




Ahora que hemos configurado las variables de entorno para nuestro ‘‘proyecto’’, estamos listos para comenzar a trabajar.

Cada aplicación que escribes en Django consiste de un paquete Python,. Django genera automáticamente la estructura de directorios básica de una aplicación, de forma que nos podamos enfocar en escribir código, en vez de estar creando directorios.

■ ¿Cuál es la diferencia entre un proyecto y una aplicación?
Una aplicación es una aplicación web que hace algo -­- por ejemplo, una bitácora, un registro de datos públicos o un sistema de encuestas. Un proyecto es un conjunto de aplicaciones configuradas para un sitio web particular. Un proyecto puede contener múltiples aplicaciones. Una aplicación puede pertenecer a múltiples proyectos.

En este tutorial crearemos una aplicación llamada encuestas, en el mismo directorio donde se encuentra el comando manage.py, así el archivo pueda ser importado como un módulo python en un nivel superior o como un sub-módulo de misitio.

Para crear nuestra aplicación, debemos asegurarnos de estar en el mismo directorio donde está el archivo manage.py y con el comando siguiente, crearemos una aplicación llamada encuestas:

$ python manage.py startapp encuestas

Esto creará un directorio encuestas, con una estructura de archivos como este:

encuestas/
__init__.py
admin.py
migrations/
__init__.py
models.py
tests.py
views.py

Esta estructura de directorios contiene la aplicación encuestas. El primer paso para escribir una base de datos en Django es definir sus modelos -­- esencialmente, un modelo es el diseño de la base de datos, con los meta datos adicionales.


Filosofía
Un modelo es la fuente única y definitiva de información de los datos. Contiene los campos y comportamiento esenciales de los datos que se están almacenando. Django sigue el Principio DRY (Don’t Repeat Yourself -­- No te repitas). El objetivo es definir el modelo de datos en un solo lugar y derivar cosas automáticamente a partir de él.

En nuestro sistema de encuestas que es la aplicación que acabamos de crear, crearemos dos modelos: Pregunta y Opción. Pregunta contiene el texto de una pregunta y una fecha de publicación. Opcion contiene dos campos: el texto de la opción y un contador de votos. Cada opción está asociada a una pregunta.

Estos conceptos son representados por simples clases python. Editamos el fichero encuestas/models.py para que se parezca a este:

encuestas/models.py

from django.db import models
class Pregunta(models.Model):
texto_pregunta = models.CharField(max_length=200)
fecha = models.DateTimeField(‘Fecha de publicación’)
class Opcion(models.Model):
pregunta = models.ForeignKey(Pregunta)
texto_opcion = models.CharField(max_length=200)
votos = models.IntegerField(default=0)

El código es sencillo de entender. Cada modelo es representado por una clase, que a su vez es una subclase de django.db.models.Model. Cada modelo tiene un número de variables, que representan un campo en la base de datos del modelo.

Cada campo está representado por una instancia de una clase llamada Field – por ejemplo la clase CharField se utiliza para guardar caracteres y la clase DateTimeField para datos del tipo fecha. Esta es la forma en que le decimos a Django qué tipo de datos contiene cada campo.

El nombre de cada instancia de models.Field (por ejemplo pregunta o fecha) es el nombre del campo, en un formato amigable para la base de datos. Este valor será usado en el código Python y la base de datos lo usará como el nombre de la columna correspondiente.

Algunas clases Field requieren de argumentos obligatorios. Por ejemplo, CharField requiere que se le pase un atributo max_length. Esto se usa no sólo en relación al esquema de la base de datos, sino también a la hora de hacer validaciones, como veremos más adelante.

La clase Field, posee algunos argumentos opcionales; en este caso hemos fijado el atributo default a un valor de votos es igual a 0.

Finalmente, observa que se hemos definido una relación foránea usando una clase ForeignKey. Esto le informa a Django que cada Opción está relacionada con una sola Pregunta y una Pregunta puede tener múltiples opciones. Django soporta todas las relaciones de base de datos típicas como: muchos a uno, muchos a muchos y uno a uno.

domingo, 28 de febrero de 2016

Instalación de Django en Ubuntu 15.10 solución a un pequeño problema.

Hola amigos escribo este post como complemento al ultimo. Si leyeron el post anterior aclare que lo instale en linux Elementary OS basada en Ubuntu pero con  kernel 3.16 .

Días después quise instalar Django en una versión Ubuntu mas nueva; la Ubuntu Mate 15.10 con  kernel 4.2

La instalación de Postgres no me presento problemas por lo que lo pasos para instalar postgres son los mismos con la diferencia que esta vez me instalo la versión 9.4

El problema empezó cuando quise instalar pip, resulta que en Ubuntu 15.10 no encuentra el paquete para instalar pip, averiguando me encontré con esta solución.


sudo apt-get install python3-pip

which pip3

sudo ln -s /usr/bin/pip3 /usr/bin/pip





Luego seguimos los pasos para instalar Django siguiendo los pasos del post anterior.

Espero les sea de ayuda esta solución.






viernes, 5 de febrero de 2016

instalación Django junto a postgresql como base de datos

Instalación de Django


Asi me fue instalando Django junto a postgresql como base de datos.

Hola amigos les entrego un post de mi experiencia instalando Django recogido de seguir un curso que estoy realizando y de leer tutoriales, blogs, y la documentación oficial de Django que no nos debe faltar y con la cual pude resolver la conexión con postgresql como base de datos, ya que Django viene configurado para trabajar con sqlite3 por defecto, y mi idea era configurarlo con este gestor de base de datos, realmente me di cuenta que hay poca documentación al respecto, por lo que espero este post contribuya para aportar a quienes quieran aprender sobre Django.

Esto lo realice en una maquina que tiene instalado ElementaryOS Friya como sistema operativo que para quienes no lo saben es una distro derivada de Ubuntu por lo que a cualquier de distro derivada de Ubuntu me imagino debería funcionar.

~$ uname -a
Linux linuxelementaaryserver 3.16.0-55-generic #74~14.04.1-Ubuntu SMP Tue Nov 17 10:15:59 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 

Como saben estoy siguiendo el libro La guía definitiva de Django: Desarrolla aplicaciones web de forma rápida y sencilla.

Tratare de explicar la instalación de todo basado en mi experiencia personal donde varias cosas al principio no daban pero al final como siempre esta la recompensa del deber cumplido.

Bueno sin más preámbulo empezamos

Primero instalemos Postgresql en nuestro sistema. Buscando posts y tutoriales por internet, la forma mas fácil de instalarlo es con el siguiente instrucción.

En nuestra consola escribimos lo siguiente

sudo apt-get install postgresql postgresql-client postgresql-contrib libpq-dev pgadmin3

con esto nos queda instalado Postgresql, en mi caso me instalo la versión 9.3

Para Ubuntu y derivados, no configura el password para el usuario postgres que es el administrador por defecto de Postgres, para ello en nuestra consola escribimos;

sudo -i -u postgres

nos pedirá el password del admin de linux

luego escribimos

psql

 con estos estamos en la consola de administración de postgresql

y asignamos el password al usuario postgres que es un usuario que crea cuando instalamos Postgres, lo hacemos con el siguiente comando

alter user postgres with password 'passwd' 

en passwd colocamos nuestra contraseña,

Esto lo hacemos por que para conectar a django necesitamos que se conecte al servidor con el usuario postgres.

Después volveremos para crear una base de datos que también es necesario.

ahora empezaremos a instalar Django

Primero debemos instalar el administrador e instalador de paquetes de Python para ello en la consola ponemos:

python get-pip.py

o

sudo apt-get install pip

luego instalamos virtualenv que es quien manejaremos el ambiente virtual

pip install virtualenv


luego donde te parezca creamos una carpeta para crear un ambiente virtual, para instalar Django, esto es recomendable para no interfiera con otras instalaciones y dependencias.


mkdir [nombre de la carpeta]


cd [nombre de la carpeta]
entramos a la carpeta

ahora creamos el entorno virtual

virtualenv [nombre_del_entorno]

luego debemos activar el entorno virtual

source [nombre_del_entorno]/bin/activate

el promt de nuestra consola cambiara

[nombre_del_entorno]/[nombre de la carpeta]~$

con el siguiente comando veremos lo que esta instalado en nuestro entorno

pip freeze 

instalamos Django en mi caso instale la 1.8

pip install django==1.8

pero para instalar la ultima versión para el momento que se escribió este post va en la 1.9

para ello escriben lo mismo si el ==1.8 y por defecto instalara la ultima versión.

Luegos instalamos psycopg2 

pip install psycopg2

si hacemos pip freeze veremos los paquetes instalados en nuestro entorno virtual.


Después de instalado Django creamos un proyecto con 

django-admin.py startproject [nombre proyecto]

con esto Django nos crea una carpeta con unos archivos dentro, con el comando ls listara dos carpetas una de ellas tiene el nombre que le diste al proyecto en la instrucción anterior. Entramos a esta carpeta


cd [nombre proyecto]

Con la siguiente instrucción de la consola abro el proyecto en sublimetext

subl .

vemos que en la carpeta que quedamos en la consola dentro de ella esta los siguientes archivos.

__init__ 
settings.py 
urls.py
wsgi.py

volvemos al promt de postgres y creamos una base de datos

con

CREATE DATABSE [nombre base datos]


volvemos a sublimetext

En settings.py buscamos DATABASES  y cambiamos a lo siguiente ya que lo que esta es para trabajar por defecto con sqlite3


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '
[nombre base datos] ',
        'USER': 'postgres',
        'PASSWORD': '[contraseña que cambiamos]',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}


y donde dice LANGUAGE_CODE = 'en-us' 

cambia por 'es-co'

guardamos el archivo con ctrl + s

una vez hecho esto 

realizamos la migración para que django cree las tablas que necesita por defecto con postgresql. En otro post aclararemos mas estos conceptos.


python manage.py migrate

nos debe salir lo siguiente como respuesta

(nombre entorno) usuario@linuxelementaary:~/[nombre_del_entorno]/[nombre de la carpeta]~$ python manage.py migrate

Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying sessions.0001_initial... OK


si viste esto ya esta configurado Django para trabajar con Postgresql


luego corremos el servidor de Django

con


python manage.py runserver

Veras una salida como la siguiente en tu terminal:
 

Performing   system   checks...
 
0   errors   found
January   06,   2014 ­ 15:50:53
 Django   version   1.8,   using   settings   'misitio.settings'
 Starting   development   server   at   http://127.0.0.1:8000/
 
Quit   the   server   with   CONTROL­C.
 

Acabas de iniciar el servidor de desarrollo de Django, un servidor web liviano escrito completamente en Python, que vine incluido en Django para poder desarrollar de manera rápida tus proyectos, sin tener que perder el tiempo con la configuración de un servidor de producción -- - como Apache hasta que el proyecto esté listo para producción. 


En el navegador colocamos en la barra de direcciones http://127.0.0.1:8000/, podemos ver una pagina de Bienvenida de Django



 

Una vez instalado Django aunque en el post anterior verificamos su instalación desde el navegador web cuando corrimos el servidor que nos proporciona Django, lo podemos hacer también desde la consola de nuestro sistema (recuerden la consola o la terminal es nuestra mejor amiga).



Lo podemos hacer de la siguiente 2 maneras:

  • Recordemos que debemos estar dentro del entorno virtual creado. Y entramos al shell de python. Una vez dentro escribimos lo siguiente:

>>> import django
>>> django.VERSION
1.8
>>>

  • O puedes usar directamente el siguiente comando en una terminal:

$ python -c "import django; print(django.get_version())"



Como recordaras ya hemos creado un proyecto con

$ django-admin.py startproject misitio



Donde misitio es el nombre de tu proyecto. Esto creará un directorio misitio en el directorio actual, que contiene la estructura de directorios y archivos que conforman tu proyecto Django.

Veamos lo que el comando startproject creo:

misitio/
manage.py
misitio/
__init__.py
settings.py
urls.py
wsgi.py

Donde ubicaremos nuestro codigo?, pues si tienes experiencia en lenguajes PHP sabrás que el código lo colocamos en el directorio raíz del servidor /var/www. En Django no es así por razones de seguridad se recomienda colocar el código fuera, puede ser en /home/proyecto.

Si leíste y espero que hayas revisado el post anterior sabrás que el objetivo era salir un poco de los parámetros del libro que estamos siguiendo y el cual era configurar django con Postgres.



Bueno si queremos ver las tablas que internamente Django creo, cuando ejecutamos la orden

$ python manage.py migrate

hacemos lo siguiente:

$ python manage.py dbshell



con esto entramos a la consola de administración de Postgres 

y escribimos para Postgres la siguiente orden:

\dt

con esto lista las tablas en la base de datos configurada con Django.

Deberían ver algo como esto.






Django creo una tabla por cada una de las aplicaciones creadas por defecto en settings.py

 



Espero les haya sido de ayuda