{"title":"Escribiendo su primera aplicación en Django, parte 1","version":"3.1","locale":"es","docname":"intro/tutorial01","url":"/es/3.1/intro/tutorial01/","canonical":"https://djangodocs.dev/es/3.1/intro/tutorial01/","summary":"Aprendamos mediante el ejemplo. A través de este tutorial le mostraremos cómo crear una aplicación de encuestas básica.","html":"<h1>Escribiendo su primera aplicación en Django, parte 1<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-1\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Aprendamos mediante el ejemplo.</p>\n<p>A través de este tutorial le mostraremos cómo crear una aplicación de encuestas básica.</p>\n<p>Consistirá de dos partes:</p>\n<ul class=\"simple\">\n<li><p>Un sitio público que le permite a las personas ver sondeos y votar en ellos.</p></li>\n<li><p>Un sitio administrativo que le permite añadir, modificar y borrar sondeos.</p></li>\n</ul>\n<p>Asumiremos que ya ha <a class=\"reference internal\" href=\"/es/3.1/intro/install/\"><span class=\"doc\">instalado Django</span></a>. Puede ver si Django está instalado, así como su versión, ejecutando el siguiente comando (señalado por el prefijo $):</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python -m django --version\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -m django --version\n</code></pre></div></div></div>\n<p>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».</p>\n<p>This tutorial is written for Django 3.1, which supports Python 3.6 and\nlater. If the Django version doesn’t match, you can refer to the tutorial for\nyour version of Django by using the version switcher at the bottom right corner\nof this page, or update Django to the newest version. If you’re using an older\nversion of Python, check <a class=\"reference internal\" href=\"/es/3.1/faq/install/#faq-python-version-support\"><span class=\"std std-ref\">¿Qué versión de Python puedo usar con Django?</span></a> to find a compatible\nversion of Django.</p>\n<p>Consulte <a class=\"reference internal\" href=\"/es/3.1/topics/install/\"><span class=\"doc\">Cómo instalar Django</span></a> para obtener información sobre cómo desinstalar versiones anteriores de Django e instalar una versión más reciente.</p>\n<aside class=\"admonition-where-to-get-help admonition\" role=\"note\">\n<p class=\"admonition-title\">Dónde obtener ayuda:</p>\n<p>If you’re having trouble going through this tutorial, please head over to\nthe <a class=\"reference internal\" href=\"/es/3.1/faq/help/\"><span class=\"doc\">Getting Help</span></a> section of the FAQ.</p>\n</aside>\n<section id=\"creating-a-project\">\n<h2>Creando un proyecto<a class=\"heading-anchor\" href=\"#creating-a-project\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>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 <a class=\"reference internal\" href=\"/es/3.1/glossary/#term-project\"><span class=\"xref std std-term\">project</span></a> – 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.</p>\n<p>Desde la línea de comandos, cambie a un directorio donde le gustaría almacenar su código, luego, ejecute el siguiente comando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>django-admin startproject mysite\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> django-admin startproject mysite\n</code></pre></div></div></div>\n<p>Esto creará un directorio <code class=\"docutils literal notranslate\">mysite</code> en su directorio actual. Si no funcionó, consulte <a class=\"reference internal\" href=\"/es/3.1/faq/troubleshooting/#troubleshooting-django-admin\"><span class=\"std std-ref\">Problemas ejecutando django-admin</span></a>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>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 <code class=\"docutils literal notranslate\">django</code> (que entrará en conflicto con Django mismo) o <code class=\"docutils literal notranslate\">test</code> (que entrará en conflicto con un paquete interno de Python).</p>\n</aside>\n<aside class=\"admonition-where-should-this-code-live admonition\" role=\"note\">\n<p class=\"admonition-title\">¿Dónde debería estar este código?</p>\n<p>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 <code class=\"docutils literal notranslate\">/var/www</code>). 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.</p>\n<p>Introduzca su código en algún directorio <strong>fuera</strong> del elemento raíz del documento, como por ejemplo <code class=\"file docutils literal notranslate\">/home/mycode</code>.</p>\n</aside>\n<p>Veamos lo que el comando <a class=\"reference internal\" href=\"/es/3.1/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\">startproject</code></a> creó:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>mysite<span class=\"o\">/</span>\n    manage<span class=\"o\">.</span>py\n    mysite<span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n        settings<span class=\"o\">.</span>py\n        urls<span class=\"o\">.</span>py\n        asgi<span class=\"o\">.</span>py\n        wsgi<span class=\"o\">.</span>py\n</code></pre></div>\n<p>Estos archivos son:</p>\n<ul class=\"simple\">\n<li><p>The outer <code class=\"file docutils literal notranslate\">mysite/</code> root directory is a container for your project. Its\nname doesn’t matter to Django; you can rename it to anything you like.</p></li>\n<li><p><code class=\"file docutils literal notranslate\">manage.py</code>: 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 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">:archivo:`manage.py`</span></a> en el :doc: :/ref/django-admin.</p></li>\n<li><p>En interior del directorio <code class=\"file docutils literal notranslate\">mysite/</code> 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, <code class=\"docutils literal notranslate\">mysite.urls</code>).</p></li>\n<li><p><code class=\"file docutils literal notranslate\">mysite/__init__.py</code>: 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 <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/modules.html#tut-packages\" title=\"(en Python versión 3.14)\"><span class=\"xref std std-ref\">más sobre los paquetes</span></a> en la documentación oficial de Python.</p></li>\n<li><p><code class=\"file docutils literal notranslate\">mysite/settings.py</code>: Ajustes/configuración para este proyecto Django.  <a class=\"reference internal\" href=\"/es/3.1/topics/settings/\"><span class=\"doc\">Django settings</span></a> le indicará todo sobre cómo funciona la configuración.</p></li>\n<li><p><code class=\"file docutils literal notranslate\">mysite/urls.py</code>: 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 <a class=\"reference internal\" href=\"/es/3.1/topics/http/urls/\"><span class=\"doc\">URL dispatcher</span></a>.</p></li>\n<li><p><code class=\"file docutils literal notranslate\">mysite/asgi.py</code>: An entry-point for ASGI-compatible web servers to\nserve your project. See <a class=\"reference internal\" href=\"/es/3.1/howto/deployment/asgi/\"><span class=\"doc\">How to deploy with ASGI</span></a> for more details.</p></li>\n<li><p><code class=\"file docutils literal notranslate\">mysite/wsgi.py</code>: Un punto de entrada para que los servidores web compatibles con WSGI puedan servir su proyecto. Consulte :doc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>/howto/deployment/wsgi/index`para más detalles.</p></li>\n</ul>\n</section>\n<section id=\"the-development-server\">\n<h2>El servidor de desarrollo<a class=\"heading-anchor\" href=\"#the-development-server\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Comprobemos que su proyecto Django funciona. Cambie al directorio externo <code class=\"file docutils literal notranslate\">mysite</code>, si todavía no lo ha hecho, y ejecute los siguientes comandos:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-2-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py runserver\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-2-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver\n</code></pre></div></div></div>\n<p>Verá la siguiente salida en la línea de comandos:</p>\n<pre class=\"literal-block\">Performing system checks...\n\nSystem check identified no issues (0 silenced).\n\nYou have unapplied migrations; your app may not work properly until they are applied.\nRun 'python manage.py migrate' to apply them.\n\n09 de agosto de 2026 - 15:50:53\nDjango version 3.1, using settings 'mysite.settings'\nStarting development server at <a class=\"reference external\" href=\"http://127.0.0.1:8000/\">http://127.0.0.1:8000/</a>\nQuit the server with CONTROL-C.</pre>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Ignore por ahora la advertencia sobre las migraciones de bases de datos sin aplicar, nos ocuparemos de la base de datos dentro de poco.</p>\n</aside>\n<p>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.</p>\n<p>Ahora es un buen momento para tener en cuenta que: <strong>no</strong> 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.)</p>\n<p>Ahora que el servidor está funcionando, visite <a class=\"reference external\" href=\"http://127.0.0.1:8000/\">http://127.0.0.1:8000/</a> con su navegador Web. Verá la página «Felicitaciones!», con un cohete despegando. ¡Funcionó!</p>\n<aside class=\"admonition-changing-the-port admonition\" role=\"note\">\n<p class=\"admonition-title\">Cambiando el puerto</p>\n<p>De forma predeterminada, el comando <a class=\"reference internal\" href=\"/es/3.1/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\">runserver</code></a> inicia el servidor de desarrollo en la IP interna en el puerto 8000.</p>\n<p>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:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-3-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py runserver <span class=\"m\">8080</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-3-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver 8080\n</code></pre></div></div></div>\n<p>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:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-4-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py runserver <span class=\"m\">0</span>:8000\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-4-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver 0:8000\n</code></pre></div></div></div>\n<p><strong>0</strong> es un atajo para <strong>0.0.0.0</strong>. La documentacion completa de el servidor de desarrollo se encuentra en la referencia de <a class=\"reference internal\" href=\"/es/3.1/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\">runserver</code></a>.</p>\n</aside>\n<aside class=\"admonition-automatic-reloading-of-djadmin-runserver admonition\" role=\"note\">\n<p class=\"admonition-title\">Recarga automática del comando <a class=\"reference internal\" href=\"/es/3.1/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\">runserver</code></a></p>\n<p>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.</p>\n</aside>\n</section>\n<section id=\"creating-the-polls-app\">\n<h2>Creando la aplicación encuestas<a class=\"heading-anchor\" href=\"#creating-the-polls-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ahora que su entorno (un «proyecto») se ha configurado, ya está listo para empezar a trabajar.</p>\n<p>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.</p>\n<aside class=\"admonition-projects-vs-apps admonition\" role=\"note\">\n<p class=\"admonition-title\">Proyectos vs. aplicaciones</p>\n<p>What’s the difference between a project and an app? An app is a Web\napplication that does something – e.g., a Weblog system, a database of\npublic records or a small poll app. A project is a collection of\nconfiguration and apps for a particular website. A project can contain\nmultiple apps. An app can be in multiple projects.</p>\n</aside>\n<p>Your apps can live anywhere on your <a class=\"reference external\" href=\"https://docs.python.org/3/tutorial/modules.html#tut-searchpath\" title=\"(en Python versión 3.14)\"><span class=\"xref std std-ref\">Python path</span></a>. In\nthis tutorial, we’ll create our poll app in the same directory as your\n<code class=\"file docutils literal notranslate\">manage.py</code> file so that it can be imported as its own top-level module,\nrather than a submodule of <code class=\"docutils literal notranslate\">mysite</code>.</p>\n<p>Para crear su aplicación, asegúrese de que está en el mismo directorio que el archivo <code class=\"file docutils literal notranslate\">manage.py</code> y escriba este comando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-5-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py startapp polls\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-5-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py startapp polls\n</code></pre></div></div></div>\n<p>Eso va a crear un directorio <code class=\"file docutils literal notranslate\">polls</code> que se presenta de la siguiente forma:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>polls<span class=\"o\">/</span>\n    <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n    admin<span class=\"o\">.</span>py\n    apps<span class=\"o\">.</span>py\n    migrations<span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n    models<span class=\"o\">.</span>py\n    tests<span class=\"o\">.</span>py\n    views<span class=\"o\">.</span>py\n</code></pre></div>\n<p>Esta estructura de directorios almacenará la aplicación encuesta.</p>\n</section>\n<section id=\"write-your-first-view\">\n<h2>Escriba su primera vista<a class=\"heading-anchor\" href=\"#write-your-first-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Vamos a escribir la primera vista. Abra el archivo <code class=\"docutils literal notranslate\">polls/views.py</code> y ponga el siguiente código Python en ella:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/views.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n\n\n<span class=\"k\">def</span> <span class=\"nf\">index</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span><span class=\"s2\">&quot;Hello, world. You&#39;re at the polls index.&quot;</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>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.</p>\n<p>Para crear una URLconf en el directorio encuestas, cree un archivo llamado <code class=\"docutils literal notranslate\">urls.py</code>. El directorio de su aplicación debe verse así:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>polls<span class=\"o\">/</span>\n    <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n    admin<span class=\"o\">.</span>py\n    apps<span class=\"o\">.</span>py\n    migrations<span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n    models<span class=\"o\">.</span>py\n    tests<span class=\"o\">.</span>py\n    urls<span class=\"o\">.</span>py\n    views<span class=\"o\">.</span>py\n</code></pre></div>\n<p>Incluya el siguiente código en el archivo <code class=\"docutils literal notranslate\">polls/urls.py</code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/urls.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n\n<span class=\"kn\">from</span> <span class=\"nn\">.</span> <span class=\"kn\">import</span> views\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> views<span class=\"o\">.</span>index<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;index&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>El siguiente paso es señalar la URLconf raíz en el módulo <code class=\"docutils literal notranslate\">polls.urls</code>. En <code class=\"docutils literal notranslate\">mysite/urls.py</code> añada un import para <code class=\"docutils literal notranslate\">django.urls.include</code> e inserte una <a class=\"reference internal\" href=\"/es/3.1/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\">include()</code></a> en la lista <code class=\"docutils literal notranslate\">urlpatterns</code> , para obtener:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">mysite/urls.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> include<span class=\"p\">,</span> path\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;polls/&#39;</span><span class=\"p\">,</span> include<span class=\"p\">(</span><span class=\"s1\">&#39;polls.urls&#39;</span><span class=\"p\">)),</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;admin/&#39;</span><span class=\"p\">,</span> admin<span class=\"o\">.</span>site<span class=\"o\">.</span>urls<span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>La función <a class=\"reference internal\" href=\"/es/3.1/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\">include()</code></a> permite hacer referencia a otros URLconfs. Cada vez que Django encuentra <a class=\"reference internal\" href=\"/es/3.1/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\">include()</code></a> 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.</p>\n<p>La idea detrás de <a class=\"reference internal\" href=\"/es/3.1/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\">include()</code></a> es facilitar la conexión y ejecución inmediata de las URLs. Dado que las encuestas están en su propia URLconf (<code class=\"docutils literal notranslate\">polls/urls.py</code>) se pueden ubicar en «/polls/», «/fun_polls /», «/content/polls/» o en cualquier otra ruta raíz , y la aplicación todavía seguirá funcionando.</p>\n<aside class=\"admonition-when-to-use-func-django-urls-include admonition\" role=\"note\">\n<p class=\"admonition-title\">Cuándo utilizar <a class=\"reference internal\" href=\"/es/3.1/ref/urls/#django.urls.include\" title=\"django.urls.include\"><code class=\"xref py py-func docutils literal notranslate\">include()</code></a></p>\n<p>Siempre debe usar <code class=\"docutils literal notranslate\">include()</code> cuando incluye otros patrones de URL. <code class=\"docutils literal notranslate\">admin.site.urls</code> es la única excepción a esto.</p>\n</aside>\n<p>You have now wired an <code class=\"docutils literal notranslate\">index</code> view into the URLconf. Verify it’s working with\nthe following command:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-6-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py runserver\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-6-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver\n</code></pre></div></div></div>\n<p>Vaya a <a class=\"reference external\" href=\"http://localhost:8000/polls/\">http://localhost:8000/polls/</a> en su navegador, y usted debería ver el texto «<em>Hello, world. You’re at the polls index.</em>» el cual definió en la vista <code class=\"docutils literal notranslate\">index</code>.</p>\n<aside class=\"admonition-page-not-found admonition\" role=\"note\">\n<p class=\"admonition-title\">¿Página no encotrada?</p>\n<p>Si usted obtiene aquí una página de error, revisee que usted este llendo a la dirección URL <a class=\"reference external\" href=\"http://localhost:8000/polls/\">http://localhost:8000/polls/</a> y no a la dirección URL <a class=\"reference external\" href=\"http://localhost:8000/\">http://localhost:8000/</a>.</p>\n</aside>\n<p>La <a class=\"reference internal\" href=\"/es/3.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\">path()</code></a> función recibe cuatro argumentos, dos requeridos <code class=\"docutils literal notranslate\">route</code> y <code class=\"docutils literal notranslate\">view</code>; y dos opcionales <code class=\"docutils literal notranslate\">kwargs</code> y <code class=\"docutils literal notranslate\">name</code>. Este es el momento de revisar para que sirven estos argumentos.</p>\n<section id=\"path-argument-route\">\n<h3>argumento <a class=\"reference internal\" href=\"/es/3.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\">path()</code></a>: <code class=\"docutils literal notranslate\">route</code><a class=\"heading-anchor\" href=\"#path-argument-route\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\">route</code> es una cadena que contiene un patrón de URL. Cuando Django procesa una petición comienza por el primer patrón en <code class=\"docutils literal notranslate\">urlpatterns</code> y continua hacia abajo por la lista comparando la URL solicitada con cada patrón hasta encontrar aquel que calza.</p>\n<p>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 <code class=\"docutils literal notranslate\">https://www.example.com/myapp/</code>, la URLconf buscará <code class=\"docutils literal notranslate\">myapp/</code>. En una petición a <code class=\"docutils literal notranslate\">https://www.example.com/myapp/?page=3</code> la URLconf también buscará <code class=\"docutils literal notranslate\">myapp/</code>.</p>\n</section>\n<section id=\"path-argument-view\">\n<h3>argumento <a class=\"reference internal\" href=\"/es/3.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\">path()</code></a>: <code class=\"docutils literal notranslate\">view</code><a class=\"heading-anchor\" href=\"#path-argument-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Cuando Django encuentra una coincidencia de expresiones regulares llama a la función de la vista especificada con un objeto <a class=\"reference internal\" href=\"/es/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\">HttpRequest</code></a> 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.</p>\n</section>\n<section id=\"path-argument-kwargs\">\n<h3>argumento <a class=\"reference internal\" href=\"/es/3.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\">path()</code></a>: <code class=\"docutils literal notranslate\">kwargs</code><a class=\"heading-anchor\" href=\"#path-argument-kwargs\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>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.</p>\n</section>\n<section id=\"path-argument-name\">\n<h3>argumento <a class=\"reference internal\" href=\"/es/3.1/ref/urls/#django.urls.path\" title=\"django.urls.path\"><code class=\"xref py py-func docutils literal notranslate\">path()</code></a>: <code class=\"docutils literal notranslate\">name</code><a class=\"heading-anchor\" href=\"#path-argument-name\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>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.</p>\n<p>Cuando se familiarice con el flujo básico de solicitud y respuesta, lea <a class=\"reference internal\" href=\"/es/3.1/intro/tutorial02/\"><span class=\"doc\">la parte 2 del presente tutorial</span></a> para empezar a trabajar con la base de datos.</p>\n</section>\n</section>","rootId":"writing-your-first-django-app-part-1","toc":[{"title":"Creando un proyecto","anchor":"creating-a-project","children":[]},{"title":"El servidor de desarrollo","anchor":"the-development-server","children":[]},{"title":"Creando la aplicación encuestas","anchor":"creating-the-polls-app","children":[]},{"title":"Escriba su primera vista","anchor":"write-your-first-view","children":[{"title":"argumento path(): route","anchor":"path-argument-route","children":[]},{"title":"argumento path(): view","anchor":"path-argument-view","children":[]},{"title":"argumento path(): kwargs","anchor":"path-argument-kwargs","children":[]},{"title":"argumento path(): name","anchor":"path-argument-name","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Empezando","url":"/es/3.1/intro/"}],"prev":{"docname":"intro/install","title":"Guía de instalación rápida","url":"/es/3.1/intro/install/"},"next":{"docname":"intro/tutorial02","title":"Escribiendo su primera aplicación en Django, parte 2","url":"/es/3.1/intro/tutorial02/"},"formats":{"html":"/es/3.1/intro/tutorial01/","markdown":"/es/3.1/intro/tutorial01.md","json":"/es/3.1/intro/tutorial01.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/intro/tutorial01.txt","official":"https://docs.djangoproject.com/es/3.1/intro/tutorial01/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}