# documentación de Django - 1.10.7

# Escribiendo su primera aplicación en Django, parte 1

Aprendamos mediante el ejemplo.

A través de este tutorial le mostraremos cómo crear una aplicación de encuestas básica.

Consistirá de dos partes:

- Un sitio público que le permite a las personas ver sondeos y votar en ellos.

- Un sitio admin que le permite añadir, modificar y borrar sondeos.

Asumiremos que ya ha :doc:` instalado Django </intro/install>`.Puede ver cuál Django está instalado, así como su versión ejecutando el siguiente comando:

    $ python -m django --version

Si Django está instalado, debería ver la versión de su instalación. Si no es así, obtendrá un error indicando que “No existe el módulo llamado Django”.

Este tutorial está escrito para Django 1.10 y Python 3.4 o versiones posteriores. Si la versión de Django no coincide, puede consultar el tutorial para su versión de Django usando el conmutador de versión que se encuentra en la esquina inferior derecha de esta página, o actualizar Django a la versión más reciente. Si todavía está utilizando Python 2.7, tendrá que ajustar las muestras de código un poco, como se describe en los comentarios.

Consulte :doc: Cómo instalar Django </topics/install> para obtener información sobre cómo desinstalar versiones anteriores de Django e instalar una versión más reciente.

Dónde obtener ayuda:

Si tiene problemas leyendo este tutorial, por favor envíe un mensaje a django-users| o visite #django on irc.freenode.net para chatear con otros usuarios de Django que puedan ayudar.

## Creando un proyecto

Si esta es la primera vez que utiliza Django, tendrá que hacerse cargo de ciertas configuraciones iniciales. Concretamente, tendrá que autogenerar un código que establezca un :term: proyecto Django; un conjunto de ajustes para una instancia de Django, incluida la configuración de la base de datos, opciones específicas de Django y configuraciones específicas de la aplicación.

Desde la línea de comandos, cambie a un directorio donde le gustaría almacenar su código, luego, ejecute el siguiente comando:

    $ django-admin startproject mysite

Esto creará un directorio `mysite` en su directorio actual. Si no funcionó, consulte :ref: resolución de problemas del sitio administrativo Django.

Nota

Tendrá que evitar darle nombres a sus proyectos que sean iguales a los de otros componentes integrados de Python o Django. En particular, esto quiere decir que debe evitar usar nombres como `django` (que entrará en conflicto con Django mismo) o “prueba” (que entrará en conflicto con un paquete interno de Python).

¿Dónde debería estar este código?

Si su experiencia previa es con el PHP de siempre (sin haber usado frameworks modernos) probablemente esté acostumbrado a ubicar el código en la raíz del documento del servidor Web (en un lugar como `/var/www`). Con Django esto no es así. No es buena idea poner ningún código Python en la raíz del documento del servidor Web porque existe la posibilidad de que otras personas puedan ver su código en la Web. Eso no es bueno en términos de seguridad.

Introduzca su código en algún directorio fuera del elemento raíz del documento, como por ejemplo: archivo: /home/mycode.

Veamos lo que creó: djadmin:` startproject `:

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

Estos archivos son:

- : file: El directorio raíz externo `mysite/`solo es un contenedor de su proyecto. Su nombre no es relevante para Django; usted puede cambiarle el nombre a lo que quiera.

- `manage.py`: A command-line utility that lets you interact with this Django project in various ways. You can read all the details about `manage.py` in django-admin and manage.py.
- The inner `mysite/` directory is the actual Python package for your project. Its name is the Python package name you’ll need to use to import anything inside it (e.g. `mysite.urls`).
- `mysite/__init__.py`: An empty file that tells Python that this directory should be considered a Python package. If you’re a Python beginner, read more about packages in the official Python docs.
- `mysite/settings.py`: Settings/configuration for this Django project. Django settings will tell you all about how settings work.

- : file: mysite / urls.py: Las declaraciones URL para este proyecto Django; una “tabla de contenidos” de su sitio basado en Django. Puede leer más sobre las URLs en: doc: /topics/http/urls.

- : file: mysite / wsgi.py: Un punto de entrada para que los servidores web compatibles con WSGI puedan servir su proyecto. Consulte :doc:`/howto/deployment/wsgi/index`para más detalles.

## El servidor de desarrollo

Comprobemos que su proyecto Django funciona. Cambie al directorio externo : file: mysite, si todavía no lo ha hecho, y ejecute los siguientes comandos:

    $ python manage.py runserver

Verá la siguiente salida en la línea de comandos:

    Performing system checks...

    System check identified no issues (0 silenced).

    You have unapplied migrations; your app may not work properly until they are applied.
    Run 'python manage.py migrate' to apply them.

    abril 04, 2017 - 15:50:53
    Django version 1.10, using settings 'mysite.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.

Nota

Ignore por ahora la advertencia sobre las migraciones de bases de datos sin aplicar, nos ocuparemos de la base de datos dentro de poco.

Usted ha iniciado el servidor en desarrollo de Django, un servidor web ligero escrito puramente en Python. Lo hemos incluido con Django para que pueda desarrollar cosas rápidamente sin tener que lidiar con la configuración de un servidor en producción, como Apache, hasta que esté listo para la producción.

Ahora es un buen momento para tener en cuenta que: ** no ** debe utilizar este servidor en algo parecido a un entorno de producción. Está pensado sólo para usarse durante el desarrollo (nuestro trabajo es crear frameworks Web , no servidores web.)

Ahora que el servidor está funcionando, visite http://127.0.0.1:8000/ con su navegador Web. Verá la página “Bienvenido a Django”, en un agradable color azul pastel, ¡Funcionó!

Cambiando el puerto

De forma predeterminada, el: djadmin: comando ` runserver` inicia el servidor de desarrollo en la IP interna en el puerto 8000.

Si desea cambiar el puerto del servidor, pásalo como un argumento de la línea de comandos. Por ejemplo, este comando inicia el servidor en el puerto 8080:

    $ python manage.py runserver 8080

Si desea cambiar la IP del servidor, pasala junto con el puerto. Así que para escuchar en todas las IPs públicas (útil si quiere mostrar su trabajo en otros equipos de la red), utilice:

    $ python manage.py runserver 0.0.0.0:8000

Se pueden encontrar documentos completos para el servidor de desarrollo en la referencia del : djadmin: ` runserver`.

Recarga automática del: djadmin: runserver

El servidor de desarrollo recarga de forma automática el código Python para cada petición cuando sea necesario. No es necesario reiniciar el servidor para que los cambios de código surtan efecto. Sin embargo, algunas acciones como la adición de archivos no provoca un reinicio, por lo que tendrá que reiniciar el servidor en estos casos.

## Creando la aplicación encuestas

Ahora que su entorno, un “proyecto”, se ha configurado, ya está listo para empezar a trabajar.

Cada aplicación que usted escribe en Django consiste en un paquete de Python que sigue una determinada convención. Django tiene una utilidad que genera automáticamente la estructura básica de directorios de una aplicación, por lo que usted puede centrarse en la escritura de código en lugar de crear directorios.

Proyectos vs. aplicaciones

¿Cuál es la diferencia entre un proyecto y una aplicación? Una app es una aplicación web que hace algo, por ejemplo, un sistema de blog, una base de datos de registros públicos o una aplicación de encuesta simple. Un proyecto es un conjunto de configuraciones y aplicaciones para un sitio web determinado. Un proyecto puede contener aplicaciones múltiples. Una aplicación puede estar en varios proyectos.

Your apps can live anywhere on your Python path. In this tutorial, we’ll create our poll app right next to your `manage.py` file so that it can be imported as its own top-level module, rather than a submodule of `mysite`.

Para crear su aplicación, asegúrese de que está en el mismo directorio que :file: manage.py y escriba este comando:

    $ python manage.py startapp polls

Eso va a crear un directorio: file: polls que se presenta de la siguiente forma

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

Esta estructura de directorios almacenará la aplicación encuesta.

## Escriba su primera vista

Vamos a escribir la primera vista. Abra el archivo `polls/views.py` y ponga el siguiente código Python en ella:

polls/views.py

    from django.http import HttpResponse

    def index(request):
        return HttpResponse("Hello, world. You're at the polls index.")

Esta es la vista más simple posible en Django. Para llamar la vista, tenemos que asignarla a una URL y para ello necesitamos una URLconf.

Para crear una URLconf en el directorio encuestas, cree un archivo llamado `` urls.py``. El directorio de su aplicación debe verse así

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

In the `polls/urls.py` file include the following code:

polls/urls.py

    from django.conf.urls import url

    from . import views

    urlpatterns = [
        url(r'^$', views.index, name='index'),
    ]

El siguiente paso es señalar la URLconf raíz en el módulo `` polls.urls``. En `` mysite / urls.py``, añada un import para `` django.conf.urls.include`` e inserte una: func: ~ django.conf.urls.include en la lista `urlpatterns` , así que tiene:

mysite/urls.py

    from django.conf.urls import include, url
    from django.contrib import admin

    urlpatterns = [
        url(r'^polls/', include('polls.urls')),
        url(r'^admin/', admin.site.urls),
    ]

The `include()` function allows referencing other URLconfs. Note that the regular expressions for the `include()` function doesn’t have a `$` (end-of-string match character) but rather a trailing slash. Whenever Django encounters `include()`, it chops off whatever part of the URL matched up to that point and sends the remaining string to the included URLconf for further processing.

La idea detrás de `include()` es facilitar la conexión y ejecución inmediata de las URLs. Dado que las encuestas están en su propia URLconf (`polls/urls.py`), se pueden ubicar en”/polls/”, en “/ fun_polls /”, “/content/polls/” o en cualquier otra ruta raíz , y la aplicación todavía seguirá funcionando.

Cuándo utilizar: func: ~ django.conf.urls.include ()

Siempre debe usar `include()` cuando incluye otros patrones de URL. `` admin.site.urls`` es la única excepción a esto.

¿No coincide con lo que ve?

Si usted ve `include(admin.site.urls)` en lugar de solo `admin.site.urls`, está usando probablemente una versión de Django que no coincide con la versión de este tutorial. Usted querrá ya sea cambiar a la versión anterior o a la versión más reciente de Django.

Usted ha enviado una vista “índex” al URLconf. Comprobemos si funciona, ejecute el siguiente comando:

    $ python manage.py runserver

Vaya a http://localhost:8000/polls/ en su navegador, y usted debería ver el texto “* Hola, mundo. Usted está en el índice de encuestas*.” el cual definió en la vista `índex`.

La `url()` pasa cuatro argumentos, dos obligatorios: “regex” y “view”, y dos opcionales: `kwargs` y “name”. En este punto, vale la pena revisar para que sirven estos argumentos.

### Argumento `url()`: expresión regular

El término “regex” es una abreviatura comúnmente usada que significa “expresión regular” y la cual es una sintaxis de búsqueda de patrones en cadenas, o en este caso, patrones de URL. Django comienza en la primera expresión regular y se abre camino en la lista, comparando la URL solicitada con cada expresión regular hasta que encuentra una que coincida.

Tenga en cuenta que estas expresiones regulares no buscan parámetros GET y POST o el nombre de dominio. Por ejemplo, en una petición a``https://www.example.com/myapp/`, el URLconf buscará ``myapp/`. En una petición a `https://www.example.com/myapp/?page=3`, el URLconf también buscará `myapp/`.

Si necesita ayuda con las expresiones regulares, consulte la entrada de Wikipedia y la documentación del módulo :mod: re. Además, el libro O’Reilly “Mastering Regular Expressions” por Jeffrey Friedl es fantástico. Sin embargo, en la práctica, no necesita ser un experto en expresiones regulares ya que tan solo necesita saber cómo capturar patrones simples. De hecho, las expresiones regulares complejas pueden tener un bajo rendimiento de búsqueda por lo que no debe depender por completo del poder de las expresiones regulares.

Por último, una nota de rendimiento: estas expresiones regulares se compilan la primera vez que se carga el módulo URLconf. Son súper rápidas (siempre y cuando las búsquedas no sean demasiado complejas como se señaló anteriormente).

### Argumento `url()`: vista

Cuando Django encuentra una coincidencia de expresiones regulares, llama a la función de la vista especificada, con un objeto `HttpRequest` como el primer argumento y cualquiera de los valores “capturados” de la expresión regular como otros argumentos. Si la expresión regular utiliza capturas sencillas, los valores se pasan como argumentos posicionales; si utiliza capturas nombradas, los valores se pasan como argumentos de palabra clave. Le daremos un ejemplo de esto en un momento.

### Argumento `url()`: kwargs

Los argumentos arbitrarios de palabra clave se pueden pasar en un diccionario a la vista destino. No vamos a utilizar esta funcionalidad de Django en el tutorial.

### Argumento `url()`: nombre

Naming your URL lets you refer to it unambiguously from elsewhere in Django, especially from within templates. This powerful feature allows you to make global changes to the URL patterns of your project while only touching a single file.

Cuando se familiarice con el flujo básico de solicitud y respuesta, lea :doc: la parte 2 del presente tutorial </intro/tutorial02> para empezar a trabajar con la base de datos.