Skip to content

Instantly share code, notes, and snippets.

@aduartem
Last active March 8, 2016 02:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aduartem/daff56267e79dca8d42a to your computer and use it in GitHub Desktop.
Save aduartem/daff56267e79dca8d42a to your computer and use it in GitHub Desktop.
Django - Tutorial 01

Django - Tutorial 01

Basado en la documentación oficial.

Escribiendo tu primera Django app, parte 1

django-admin

Si en la terminal ingresas el comando django-admin se mostrará lo siguiente:

Available subcommands:

[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations
    migrate
    runserver
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp
    startproject
    test
    testserver
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.).

Estos son todos los subcomandos que se pueden utilizar cuando ingresas django-admin.

Creando un proyecto

Desde la línea de comandos usar el comando cd para cambiar al directorio donde quieras guardar el código.

$ django-admin startproject mysite

Esto creará el directorio mysite en el directorio actual.

startproject crea:

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

Estos archivos son:

  • El directorio mysite/ de más afuera es sólo un contenedor para tu proyecto. El nombre no afecta a Django; lo podés renombrar libremente como quieras.
  • manage.py: Una utilidad de línea de comandos que te permite interactuar con este proyecto Django de varias maneras.
  • El directorio mysite/ interno es el paquete Python para tu proyecto. Su nombre es el nombre de paquete Python que necesitarás usar para importar cualquier cosa adentro del mismo (e.g. mysite.urls).
  • mysite/init.py: Un archivo vacío que le dice a Python que este directorio debe considerarse un paquete Python.
  • mysite/settings.py: Settings/configuración de este proyecto Django.
  • mysite/urls.py: Declaración de las URL de este proyecto Django; una “tabla de contenidos” de tu sitio Django.
  • mysite/wsgi.py: Punto de entrada para servir tu proyecto mediante servidores web compatibles con WSGI.

manage.py

Si ejecutamos el comando manage.py, se listarán todos los subcomandos de manage.py que podemos utilizar. Antes de ejecutar manage.py debemos cambiarnos al directorio del proyecto creado.

$ cd mysite
$ python manage.py

salida:

Type 'manage.py help <subcommand>' for help on a specific subcommand.

Available subcommands:

[auth]
    changepassword
    createsuperuser

[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations
    migrate
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp
    startproject
    test
    testserver

[sessions]
    clearsessions

[staticfiles]
    collectstatic
    findstatic
    runserver

Configurar la base de datos

Si queremos configurar la base de datos debemos editar el archivo mysite/settings.py

Por defecto la configuración usa SQLite.

INSTALLED_APPS

Contiene las siguientes apps provistas por Django:

  • django.contrib.admin – El sitio de administración.
  • django.contrib.auth – Sistema de autenticación.
  • django.contrib.contenttypes – Un framework para tipos de contenido.
  • django.contrib.sessions – Un framework para manejo de sesiones.
  • django.contrib.messages – Un framework de mensajes.
  • django.contrib.staticfiles – Un framework para manejar los archivos estáticos.

Estas aplicaciones utilizan al menos una tabla de la base de datos. Utilizaremos migration para crear las respectivas tablas.

$ python manage.py migrate

En la terminar debemos ubicarnos en el directorio que corresponde al proyecto creado y ejecutamos manage.py migrate para realizar la migración.

salida:

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

El servidor de desarrollo

Django cuenta con un servidor web de desarrollo. Para iniciar el servidor ejecutar el siguiente comando:

$ python manage.py runserver

salida:

Performing system checks...

System check identified no issues (0 silenced).
March 02, 2016 - 03:30:55
Django version 1.8.4, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Nota: NO usar este servidor en un entorno de producción. Está pensado solamente para desarrollo.

Cambiando el puerto

$ python manage.py runserver 8080

Si queremos cambiar la dirección ip para mostrar nuestro trabajo a otras computadoras podemos usar:

$ python manage.py runserver 0.0.0.0:8000

Creando una aplicación

$ python manage.py startapp polls

Esto creará el directorio polls con la siguiente estructura:

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

Creando modelos

El primer paso para escribir una app web en Django es definir los modelos.

Vamos a crear dos modelos: Question and Choice. Una Question tiene una pregunta y una fecha de publicación. Una Choice tiene dos campos: el texto de la opción y un contador de votos. Cada Choice está asociada a una Question.

Editamos el archivo polls/models.py e ingresamos el siguiente código:

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

Las apps Django son “pluggable”: podés usar una app en múltiples proyectos, y distribuirlas, porque no necesitan estar ligadas a una instancia de Django particular.

Editamos de nuevo el archivo mysite/settings.py, y cambiamos el setting INSTALLED_APPS para incluir 'polls'. Se verá algó así:

mysite/settings.py

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

Ahora Django sabe sobre nuestra app polls. Corramos otro comando:

$ python manage.py makemigrations polls

salida:

Migrations for 'polls':
  0001_initial.py:
    - Create model Choice
    - Create model Question
    - Add field question to choice

Con makemigrations registramos los cambios realizados en polls/models.py en una migración.

sqlmigrate toma los nombres de migraciones y devuelve el SQL respectivo.

$ python manage.py sqlmigrate polls 0001

salida:

Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, polls, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying polls.0001_initial... OK

migrate ejecutar las migraciones y administra el esquema de base de datos automáticamente.

$ python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, polls, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying polls.0001_initial... OK

En resumen los tres pasos que hay que realizar son:

  • Cambiar nuestros modelos (en models.py).
  • Correr python manage.py makemigrations para crear las migraciones correspondientes a esos cambios
  • Correr python manage.py migrate para aplicar esos cambios a la base de datos.

El shell de Python

Para invocar el shell ejecutar:

$ python manage.py shell
>>> import django
>>> from polls.models import Question, Choice
>>> Question.objects.all()
[]
>>> from django.utils import timezone
>>> q = Question(question_text = "What's new?", pub_date=timezone.now())
>>> q.save()
>>> q.id
1
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2016, 3, 8, 1, 57, 41, 858201, tzinfo=<UTC>)
>>> q.question_text = "What's up?"
>>> q.save()
>>> Question.objects.all()
[<Question: Question object>]

...

Fuente: http://djangotutorial.readthedocs.org/es/1.8/intro/tutorial01.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment