---
title: "Escribiendo su primera aplicación en Django, parte 1"
version: 4.1
locale: es
source: https://docs.djangoproject.com/es/4.1/intro/tutorial01/
canonical: https://djangodocs.dev/es/4.1/intro/tutorial01/
---
# 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 administrativo que le permite añadir, modificar y borrar sondeos.

Asumiremos que ya ha [instalado Django](/es/4.1/intro/install/). Puede ver si Django está instalado, así como su versión, ejecutando el siguiente comando (señalado por el prefijo $):

```console
$ python -m django --version
```

*Windows*

```doscon
...\> py -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».

This tutorial is written for Django 4.1, which supports Python 3.8 and
later. If the Django version doesn’t match, you can refer to the tutorial for
your version of Django by using the version switcher at the bottom right corner
of this page, or update Django to the newest version. If you’re using an older
version of Python, check [¿Qué versión de Python puedo usar con Django?](/es/4.1/faq/install/#faq-python-version-support) to find a compatible
version of Django.

Consulte [Cómo instalar Django](/es/4.1/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:**
>
> If you’re having trouble going through this tutorial, please head over to
> the [Getting Help](/es/4.1/faq/help/) section of the FAQ.

## 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 Django [project](/es/4.1/glossary/#term-project) – 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:

```console
$ django-admin startproject mysite
```

*Windows*

```doscon
...\> django-admin startproject mysite
```

Esto creará un directorio `mysite` en su directorio actual. Si no funcionó, consulte [Problemas ejecutando django-admin](/es/4.1/faq/troubleshooting/#troubleshooting-django-admin).

> **Note**
>
> 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 `test` (que entrará en conflicto con un paquete interno de Python).

> **¿Dónde debería estar este código?**
>
> If your background is in plain old PHP (with no use of modern frameworks),
> you’re probably used to putting code under the web server’s document root
> (in a place such as `/var/www`). With Django, you don’t do that. It’s
> not a good idea to put any of this Python code within your web server’s
> document root, because it risks the possibility that people may be able
> to view your code over the web. That’s not good for security.
>
> Introduzca su código en algún directorio **fuera** del elemento raíz del documento, como por ejemplo `/home/mycode`.

Veamos lo que el comando [`startproject`](/es/4.1/ref/django-admin/#django-admin-startproject) creó:

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

Estos archivos son:

- The outer `mysite/` root directory is a container for your project. Its
  name doesn’t matter to Django; you can rename it to anything you like.
- `manage.py`: Una utilidad de la línea de comandos que le permite interactuar con este proyecto Django de diferentes formas. Puede leer todos los detalles sobre  en el :doc: :/ref/django-admin.
- En interior del directorio `mysite/` es el propio paquete de Python para su proyecto. Su nombre es el nombre del paquete de Python que usted tendrá que utilizar para importar todo dentro de este (por ejemplo, `mysite.urls`).
- `mysite/__init__.py`: Un archivo vacío que le indica a Python que este directorio debería ser considerado como un paquete Python. Si usted es un principiante lea [más sobre los paquetes](https://docs.python.org/3/tutorial/modules.html#tut-packages) en la documentación oficial de Python.
- `mysite/settings.py`: Ajustes/configuración para este proyecto Django.  [Django settings](/es/4.1/topics/settings/) le indicará todo sobre cómo funciona la configuración.
- `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 [URL dispatcher](/es/4.1/topics/http/urls/).
- `mysite/asgi.py`: An entry-point for ASGI-compatible web servers to
  serve your project. See [How to deploy with ASGI](/es/4.1/howto/deployment/asgi/) for more details.
- `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 `mysite`, si todavía no lo ha hecho, y ejecute los siguientes comandos:

```console
$ python manage.py runserver
```

*Windows*

```doscon
...\> py 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.

09 de agosto de 2026 - 15:50:53
Django version 4.1, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

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

You’ve started the Django development server, a lightweight web server written
purely in Python. We’ve included this with Django so you can develop things
rapidly, without having to deal with configuring a production server – such as
Apache – until you’re ready for production.

Now’s a good time to note: **don’t** use this server in anything resembling a
production environment. It’s intended only for use while developing. (We’re in
the business of making web frameworks, not web servers.)

Now that the server’s running, visit <http://127.0.0.1:8000/> with your web
browser. You’ll see a «Congratulations!» page, with a rocket taking off.
It worked!

> **Cambiando el puerto**
>
> De forma predeterminada, el comando [`runserver`](/es/4.1/ref/django-admin/#django-admin-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:
>
> ```console
> $ python manage.py runserver 8080
> ```
>
> *Windows*
>
> ```doscon
> ...\> py manage.py runserver 8080
> ```
>
> Si desea cambiar la IP del servidor, pásela junto con el puerto. Por ejemplo para escuchar en todas las IPs públicas (útil si usted está ejecutando Vagrant o quiere mostrar su trabajo en otros equipos de la red), utilice:
>
> ```console
> $ python manage.py runserver 0.0.0.0:8000
> ```
>
> *Windows*
>
> ```doscon
> ...\> py manage.py runserver 0.0.0.0:8000
> ```
>
> Full docs for the development server can be found in the
> [`runserver`](/es/4.1/ref/django-admin/#django-admin-runserver) reference.

> **Recarga automática del comando 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**
>
> What’s the difference between a project and an app? An app is a web
> application that does something – e.g., a blog system, a database of
> public records or a small poll app. A project is a collection of
> configuration and apps for a particular website. A project can contain
> multiple apps. An app can be in multiple projects.

Your apps can live anywhere on your [Python path](https://docs.python.org/3/tutorial/modules.html#tut-searchpath). In
this tutorial, we’ll create our poll app in the same directory as 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 el archivo `manage.py` y escriba este comando:

```console
$ python manage.py startapp polls
```

*Windows*

```doscon
...\> py manage.py startapp polls
```

Eso va a crear un directorio `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`*

```python
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
```

Incluya el siguiente código en el archivo `polls/urls.py`:

*`polls/urls.py`*

```python
from django.urls import path

from . import views

urlpatterns = [
    path('', 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.urls.include` e inserte una [`include()`](/es/4.1/ref/urls/#django.urls.include) en la lista `urlpatterns` , para obtener:

*`mysite/urls.py`*

```python
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
```

La función [`include()`](/es/4.1/ref/urls/#django.urls.include) permite hacer referencia a otros URLconfs. Cada vez que Django encuentra [`include()`](/es/4.1/ref/urls/#django.urls.include) corta cualquier parte de la URL que coincide hasta ese punto y envía la cadena restante a la URLconf incluida para seguir el proceso.

La idea detrás de [`include()`](/es/4.1/ref/urls/#django.urls.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/», «/fun\_polls /», «/content/polls/» o en cualquier otra ruta raíz , y la aplicación todavía seguirá funcionando.

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

You have now wired an `index` view into the URLconf. Verify it’s working with
the following command:

```console
$ python manage.py runserver
```

*Windows*

```doscon
...\> py manage.py runserver
```

Vaya a <http://localhost:8000/polls/> en su navegador, y usted debería ver el texto «*Hello, world. You’re at the polls index.*» el cual definió en la vista `index`.

> **¿Página no encotrada?**
>
> Si usted obtiene aquí una página de error, revisee que usted este llendo a la dirección URL <http://localhost:8000/polls/> y no a la dirección URL <http://localhost:8000/>.

La [`path()`](/es/4.1/ref/urls/#django.urls.path) función recibe cuatro argumentos, dos requeridos `route` y `view`; y dos opcionales `kwargs` y `name`. Este es el momento de revisar para que sirven estos argumentos.

### argumento [`path()`](/es/4.1/ref/urls/#django.urls.path): `route`

`route` es una cadena que contiene un patrón de URL. Cuando Django procesa una petición comienza por el primer patrón en `urlpatterns` y continua hacia abajo por la lista comparando la URL solicitada con cada patrón hasta encontrar aquel que calza.

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 la dirección URL `https://www.example.com/myapp/`, la URLconf buscará `myapp/`. En una petición a `https://www.example.com/myapp/?page=3` la URLconf también buscará `myapp/`.

### argumento [`path()`](/es/4.1/ref/urls/#django.urls.path): `view`

Cuando Django encuentra una coincidencia de expresiones regulares llama a la función de la vista especificada con un objeto [`HttpRequest`](/es/4.1/ref/request-response/#django.http.HttpRequest) como primer argumento y cualquiera de los valores «capturados» de la ruta como argumentos de palabra clave. Le daremos un ejemplo de esto en un momento.

### argumento [`path()`](/es/4.1/ref/urls/#django.urls.path): `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 [`path()`](/es/4.1/ref/urls/#django.urls.path): `name`

Dar un nombre a su URL le permite referirse a ella de forma inequívoca desde otras partes de Django sobre todo desde las plantillas. Esta potente característica le permite realizar cambios globales en los patrones de URL de su proyecto modificando solo un único archivo.

Cuando se familiarice con el flujo básico de solicitud y respuesta, lea [la parte 2 del presente tutorial](/es/4.1/intro/tutorial02/) para empezar a trabajar con la base de datos.
