Basado en la documentación oficial.
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.
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.
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
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
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
$ 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
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.
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