{"title":"Escribiendo su primer parche para Django","version":"4.2","locale":"es","docname":"intro/contributing","url":"/es/4.2/intro/contributing/","canonical":"https://djangodocs.dev/es/4.2/intro/contributing/","summary":"Introducción Link to this heading # ¿Interesado en retribuir un poco a la comunidad? Quizás ha encontrado un fallo en Django que le gustaría ver solucionado, o…","html":"<h1>Escribiendo su primer parche para Django<a class=\"heading-anchor\" href=\"#writing-your-first-patch-for-django\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"introduction\">\n<h2>Introducción<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>¿Interesado en retribuir un poco a la comunidad? Quizás ha encontrado un fallo en Django que le gustaría ver solucionado, o quizás hay una pequeña característica que quiera agregar.</p>\n<p>Contribuyendo al propio proyecto de Django es la mejor forma de ver sus propios problemas abordados. Puede parecer desalentador al inicio, pero es un camino ya conocido: con documentación, herramientas, y una comunidad que le ayudará. Le guiaremos por todo el proceso, así pueda aprender con el ejemplo.</p>\n<section id=\"who-s-this-tutorial-for\">\n<h3>¿Para quién es este tutorial?<a class=\"heading-anchor\" href=\"#who-s-this-tutorial-for\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Ver también</p>\n<p>Si usted está buscando una referencia sobre cómo hacer contribuciones, consulte la documentación <a class=\"reference internal\" href=\"/es/4.2/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">Submitting patches</span></a>.</p>\n</aside>\n<p>Para este tutorial, esperamos que comprenda al menos el funcionamiento básico de Django. Esto significa que usted no tendría problemas estudiando los tutoriales existentes para <a class=\"reference internal\" href=\"/es/4.2/intro/tutorial01/\"><span class=\"doc\">crear su primera aplicación Django</span></a>. Adicionalmente, debería tener una buena comprensión de Python. Si no es así, <a class=\"reference external\" href=\"https://diveinto.org/python3/table-of-contents.html\">Dive into Python</a> es un libro fantástico (y gratuito) disponible en línea para los programadores que comienzan en Python.</p>\n<p>Aquellos de ustedes que no están familiarizados con los sistemas de control de versiones y Trac encontrarán que este tutorial y sus vínculos incluyen información suficiente para empezar. Sin embargo, es probable que quiera leer un poco más acerca de estas diferentes herramientas si usted planea contribuir a Django con regularidad.</p>\n<p>Sin embargo, en su mayor parte, este tutorial trata de explicar tanto como sea posible, de modo que pueda ser de utilidad para la audiencia más amplia.</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">Dónde obtener ayuda:</p>\n<p>Si tiene problemas para seguir este tutorial, por favor envíe un mensaje al <a class=\"reference external\" href=\"https://forum.djangoproject.com/\">Django Forum</a>, <a class=\"reference internal\" href=\"/es/4.2/internals/mailing-lists/#django-developers-mailing-list\"><span class=\"std std-ref\">django-developers</span></a>, o visite  <a class=\"reference external\" href=\"https://web.libera.chat/#django-dev\">#django-dev en irc.libera.chat</a> para charlar con otros usuarios de Django que puedan ayudarle.</p>\n</aside>\n</section>\n<section id=\"what-does-this-tutorial-cover\">\n<h3>¿Qué cubre esta guía?<a class=\"heading-anchor\" href=\"#what-does-this-tutorial-cover\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le mostraremos cómo contribuir con parches para Django por primera vez. Al final de este tutorial, contará con un entendimiento básico sobre las herramientas y procesos implicados. Específicamente, cubriremos lo siguiente:</p>\n<ul class=\"simple\">\n<li><p>Instalando Git.</p></li>\n<li><p>Descargue una copia de la versión de desarrollo de Django</p></li>\n<li><p>Conjunto de pruebas de funcionamiento de Django.</p></li>\n<li><p>Escribiendo una prueba para su parche.</p></li>\n<li><p>Escribiendo el código para su parche.</p></li>\n<li><p>Probando su parche.</p></li>\n<li><p>Enviar una solicitud de pull.</p></li>\n<li><p>Dónde buscar más información.</p></li>\n</ul>\n<p>Una vez que haya terminado el tutorial, puede revisar el resto de <a class=\"reference internal\" href=\"/es/4.2/internals/contributing/\"><span class=\"doc\">la documentación para contribuir con Django</span></a>. Contiene una gran cantidad de información de lectura obligatoria para todo el que desee convertirse en colaborador habitual de Django. Si tiene preguntas, es probable que obtenga las respuestas.</p>\n<aside class=\"admonition-python-3-required admonition\">\n<p class=\"admonition-title\">¡Python 3 es requerido!</p>\n<p>La versión actual de Django no soporta Python 2.7. Obtenga Python 3 en la <a class=\"reference external\" href=\"https://www.python.org/downloads/\">página de descargas de Python</a> o con el gestor de paquetes de su sistema operativo.</p>\n</aside>\n<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Para los usuarios de Windows</p>\n<p>Puede consultar <a class=\"reference internal\" href=\"/es/4.2/howto/windows/#install-python-windows\"><span class=\"std std-ref\">Instale Python</span></a> en la documentación de Windows para obtener orientación adicional.</p>\n</aside>\n</section>\n</section>\n<section id=\"code-of-conduct\">\n<h2>Código de Conducta<a class=\"heading-anchor\" href=\"#code-of-conduct\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Como un colaborador, usted puede ayudarnos a mantener abierta e inclusiva la comunidad Django. Por favor lea y siga nuestro <a class=\"reference external\" href=\"https://www.djangoproject.com/conduct/\">Código de conducta</a>.</p>\n</section>\n<section id=\"installing-git\">\n<h2>Instalando Git<a class=\"heading-anchor\" href=\"#installing-git\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Para este tutorial, necesitará instalar Git para descargar la versión actual de desarrollo de Django y generar archivos de revisión de los cambios que realice.</p>\n<p>Para revisar si tiene o no instalado Git , ejecute <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span></code> en la línea de comandos. Si recibe un mensaje diciendo que el comando no pudo ser encontrado, tendrá que descargarlo e instalarlo. Consulte <a class=\"reference external\" href=\"https://git-scm.com/download\">la página de descarga de Git</a>.</p>\n<p>Si no está familiarizado con Git, siempre se puede encontrar más información sobre sus comandos (una vez instalado) escribiendo <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">help</span></code> en la línea de comandos.</p>\n</section>\n<section id=\"getting-a-copy-of-django-s-development-version\">\n<h2>Obtenga una copia de la versión de desarrollo de Django<a class=\"heading-anchor\" href=\"#getting-a-copy-of-django-s-development-version\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>El primer paso para contribuir con Django es obtener una copia del código fuente. Primero, <a class=\"reference external\" href=\"https://github.com/django/django/fork\">haga un fork de Django en GitHub</a>. Después, desde la línea de comandos, use el comando <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span></code> para navegar hasta el directorio donde quiera que se aloje su copia local de Django.</p>\n<p>Descargue el repositorio de código fuente de Django con el siguiente comando:</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>git<span class=\"w\"> </span>clone<span class=\"w\"> </span>https://github.com/YourGitHubName/django.git\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> git clone https://github.com/YourGitHubName/django.git\n</code></pre></div></div></div>\n<aside class=\"admonition-low-bandwidth-connection admonition\">\n<p class=\"admonition-title\">¿Conexión de bajo ancho de banda?</p>\n<p>Puede añadir el argumento  <code class=\"docutils literal notranslate\"><span class=\"pre\">--depth</span> <span class=\"pre\">1</span></code> al comando <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">clone</span></code> para evitar descargar todo el historial de commits de Django, el cual reduce la transferencia de datos de ~250MB a ~70MB</p>\n</aside>\n<p>Ahora que tiene una copia local de Django, puede instalarla como si fuera a instalar cualquier paquete utilizando <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></code>. La forma más conveniente de hacerlo es mediante un <em>entorno virtual</em>, que es una función incorporada en Python que le permite mantener un directorio separado de paquetes instalados para cada uno de sus proyectos para que no interfieran entre sí.</p>\n<p>Es una buena idea mantener todos sus entornos virtuales en un solo lugar, por ejemplo, en `` virtualenvs /`` en su directorio de inicio.</p>\n<p>Cree un nuevo entorno virtual ejecutando:</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>python3<span class=\"w\"> </span>-m<span class=\"w\"> </span>venv<span class=\"w\"> </span>~/.virtualenvs/djangodev\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> py -m venv <span class=\"nv\">%HOMEPATH%</span>\\.virtualenvs\\djangodev\n</code></pre></div></div></div>\n<p>La ruta es donde se guardará el nuevo entorno en su computadora.</p>\n<p>El último paso para configurar su entorno virtual es activarlo:</p>\n<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><span class=\"nb\">source</span><span class=\"w\"> </span>~/.virtualenvs/djangodev/bin/activate\n</code></pre></div>\n<p>Si el comando <code class=\"docutils literal notranslate\"><span class=\"pre\">source</span></code> no está disponible, puede intentar usar un punto en su lugar:</p>\n<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>.<span class=\"w\"> </span>~/.virtualenvs/djangodev/bin/activate\n</code></pre></div>\n<p>Debe activar el entorno virtual cada vez que abra una nueva ventana de la terminal.</p>\n<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Para los usuarios de Windows</p>\n<p>Para activar su entorno virtual en Windows ejecute:</p>\n<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 code\"><code><span class=\"gp\">...\\&gt;</span> <span class=\"nv\">%HOMEPATH%</span>\\.virtualenvs\\djangodev\\Scripts\\activate.bat\n</code></pre></div>\n</aside>\n<p>El nombre del entorno virtual actualmente activado se muestra en la línea de comandos para ayudarlo a realizar un seguimiento de cuál está utilizando. Todo lo que instale a través de <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></code> mientras se muestre este nombre se instalará en ese entorno virtual, aislado de otros entornos y paquetes del sistema.</p>\n<p id=\"intro-contributing-install-local-copy\">Continúe e instale la copia previamente clonada de Django:</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<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-e<span class=\"w\"> </span>/path/to/your/local/clone/django/\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 -m pip install -e \\path\\to\\your\\local\\clone\\django\\\n</code></pre></div></div></div>\n<p>La versión instalada de Django ahora está apuntando a tu copia local al instalarla en modo editable. Verás inmediatamente cualquier cambio que hagas en ella, lo cual es de gran ayuda al escribir tu primer parche.</p>\n<section id=\"creating-projects-with-a-local-copy-of-django\">\n<h3>Creando proyectos con una copia local de Django.<a class=\"heading-anchor\" href=\"#creating-projects-with-a-local-copy-of-django\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>It may be helpful to test your local changes with a Django project. First you\nhave to create a new virtual environment, <a class=\"reference internal\" href=\"#intro-contributing-install-local-copy\"><span class=\"std std-ref\">install the previously cloned\nlocal copy of Django in editable mode</span></a>,\nand create a new Django project outside of your local copy of Django. You will\nimmediately see any changes you make to Django in your new project, which is\nof great help when writing your first patch, especially if testing any changes\nto the UI.</p>\n<p>You can follow the <a class=\"reference internal\" href=\"/es/4.2/intro/tutorial01/\"><span class=\"doc\">tutorial</span></a> for help in creating a\nDjango project.</p>\n</section>\n</section>\n<section id=\"running-django-s-test-suite-for-the-first-time\">\n<h2>Ejecutando el conjunto de pruebas de Django por primera vez<a class=\"heading-anchor\" href=\"#running-django-s-test-suite-for-the-first-time\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Al contribuir a Django es muy importante que los cambios de tu código no introduzcan errores en otras áreas de Django. Una forma de comprobar que Django sigue funcionando después de hacer tus cambios es ejecutar el conjunto de pruebas de Django. Si todas las pruebas aún pasan, entonces puedes estar razonablemente seguro de que tus cambios funcionan y no han roto otras partes de Django. Si nunca has ejecutado el conjunto de pruebas de Django antes, es una buena idea ejecutarlo una vez antes para familiarizarte con su salida.</p>\n<p>Para ejecutar tu código, cambia al directorio Django <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> con <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span> <span class=\"pre\">tests</span></code>, e instala las eventuales dependencias necesarias ejecutando:</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<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-r<span class=\"w\"> </span>requirements/py3.txt\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 -m pip install -r requirements\\py3.txt\n</code></pre></div></div></div>\n<p>Si encuentra un error durante la instalación, es posible que a su sistema le falte una dependencia para uno o más de los paquetes de Python. Consulte la documentación del paquete que falla o busque en la web el mensaje de error que encuentre.</p>\n<p>Ahora estamos listos para ejecutar el conjunto de pruebas. Si estás utilizando GNU/Linux, macOS o alguna otra distribución de Unix, ejecute:</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>./runtests.py\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> runtests.py \n</code></pre></div></div></div>\n<p>Ahora siéntate y relájate. Django tiene una enorme batería de pruebas que verificarán tu código. Esto llevará algunos minutos, dependiendo de la velocidad de tu ordenador.</p>\n<p>Mientras se ejecuta la suite de pruebas de Django, verá una secuencia de caracteres que representan el estado de cada prueba a medida que se completa. `` E`` indica que un error se planteó durante una prueba, y `` F`` indica las afirmaciones de una prueba fallida. Ambos de estos son considerados como fallas de prueba. Mientras tanto, `` x`` y `` s`` indican fallas esperadas y pruebas omitidas, respectivamente. Los puntos indican pruebas superadas.</p>\n<p>Las pruebas omitidas se deben usualmente a la ausencia de bibliotecas externas requeridas para la ejecución de las pruebas; ver <a class=\"reference internal\" href=\"/es/4.2/internals/contributing/writing-code/unit-tests/#running-unit-tests-dependencies\"><span class=\"std std-ref\">Running all the tests</span></a> para la lista de dependencias y estar seguro de instalar aquellas relacionadas con los cambios que está haciendo (no necesitamos ninguna para esta tutorial). Algunas pruebas son especificas de un backend de base de datos particular y serán omitidas si no se está probando ese backend. SQLite es el backend por defecto para las pruebas. Para ejecutar las pruebas con un backend diferente ver <a class=\"reference internal\" href=\"/es/4.2/internals/contributing/writing-code/unit-tests/#running-unit-tests-settings\"><span class=\"std std-ref\">Using another settings module</span></a>.</p>\n<p>Una vez que las pruebas finalicen, usted debe ser recibido con un mensaje que le informa si el conjunto de pruebas pasó o falló. Dado que aún no ha realizado ningún cambio en el código de Django, todo el conjunto de pruebas debe pasar. Si obtiene fallos o errores asegúrese de que ha seguido correctamente todos los pasos anteriores . Consulte: ref: Ejecutar pruebas unitarias para más información.</p>\n<p>Ten en cuenta que la última rama «main» de Django no siempre es estable. Cuando desarrolles contra «main», puedes comprobar <a class=\"reference external\" href=\"https://djangoci.com\">Django’s continuous integration builds</a> para determinar si los fallos son específicos de tu máquina o si también están presentes en las builds oficiales de Django. Si haces clic para ver una compilación en particular, verás la «Matriz de configuración» que muestra los fallos desglosados por versión de Python y backend de base de datos específicos.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>For this tutorial and the ticket we’re working on, testing against SQLite\nis sufficient, however, it’s possible (and sometimes necessary) to\n<a class=\"reference internal\" href=\"/es/4.2/internals/contributing/writing-code/unit-tests/#running-unit-tests-settings\"><span class=\"std std-ref\">run the tests using a different database</span></a>. When making UI changes, you will need to\n<a class=\"reference internal\" href=\"/es/4.2/internals/contributing/writing-code/unit-tests/#running-selenium-tests\"><span class=\"std std-ref\">run the Selenium tests</span></a>.</p>\n</aside>\n</section>\n<section id=\"working-on-a-feature\">\n<h2>Trabajando en una característica<a class=\"heading-anchor\" href=\"#working-on-a-feature\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Para este tutorial, trabajaremos sobre un «falso ticket» como un caso de estudio. Estos son los detalles imaginarios:</p>\n<aside class=\"admonition-ticket-99999-allow-making-toast admonition\">\n<p class=\"admonition-title\">Ticket #99999 – Permitir hacer unas tostadas</p>\n<p>Django debe proporcionar una función <code class=\"docutils literal notranslate\"><span class=\"pre\">django.shortcuts.make_toast()</span></code> que devuelva <code class=\"docutils literal notranslate\"><span class=\"pre\">'toast'</span></code>.</p>\n</aside>\n<p>Bueno, ahora implemente la característica y sus pruebas asociadas.</p>\n</section>\n<section id=\"creating-a-branch-for-your-patch\">\n<h2>Creando una rama para su parche<a class=\"heading-anchor\" href=\"#creating-a-branch-for-your-patch\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Antes de hacer algún cambio, cree una nueva rama para el ticket:</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>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>-b<span class=\"w\"> </span>ticket_99999\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> git checkout -b ticket_99999\n</code></pre></div></div></div>\n<p>Puede elegir cualquier nombre que desee para la rama, por ejemplo «ticket_99999». Todos los cambios realizados en esta rama será específico para el ticket y no afecta la copia principal del código previamente clonado</p>\n</section>\n<section id=\"writing-some-tests-for-your-ticket\">\n<h2>Escribiendo algunas pruebas para su reporte<a class=\"heading-anchor\" href=\"#writing-some-tests-for-your-ticket\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>En la mayoría de los casos, para que un parche sea aceptado en Django tiene que incluir pruebas. Para los parches de corrección de bugs, esto significa escribir una prueba de regresión para asegurar que el bug no sea reintroducido en Django más adelante. Una prueba de regresión debe ser escrita de forma tal que falle mientras que todavía exista el bug y pase una vez que el bug se haya corregido. Para los parches que contienen nuevas características, tendrás que incluir pruebas que garanticen que dichas características estén funcionando correctamente. Los parches también deben fallar cuando la nueva característica no esté presente y por lo tanto, pasar una vez que haya sido aplicada.</p>\n<p>Una buena forma de hacer esto, es escribir primero sus nuevas pruebas antes de realizar cualquier cambio en el código. Este estilo de desarrollo se llama <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Test-driven_development\">desarrollo guiado por pruebas</a> y se puede aplicar tanto a proyectos completos como a parches individuales. Después de escribir sus pruebas, ejecútelas para asegurarse de que en efecto fallan (ya que aún no ha corregido ese bug o añadido esa característica). Si sus nuevas pruebas no fallan, tendrá que arreglarlas de manera que lo hagan. Después de todo, una prueba de regresión que pasa sin importar si un error está presente, no es muy útil en prevenir que ese error se repita en el futuro.</p>\n<p>Ahora a nuestro ejemplo práctico.</p>\n<section id=\"writing-a-test-for-ticket-99999\">\n<h3>Escribiendo una prueba para el ticket #99999<a class=\"heading-anchor\" href=\"#writing-a-test-for-ticket-99999\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Para resolver este problema, vamos a añadir una función <code class=\"docutils literal notranslate\"><span class=\"pre\">make_toast()</span></code> al módulo <code class=\"docutils literal notranslate\"><span class=\"pre\">django.shortcuts</span></code>. Primero vamos a escribir un test que intente usar la función y comprobar que su salida parezca correcta.</p>\n<p>Navegue a la carpeta <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/shortcuts/</span></code> y cree un nuevo fichero llamado <code class=\"docutils literal notranslate\"><span class=\"pre\">test_make_toast.py</span></code>. Añada el siguiente código:</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><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">make_toast</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MakeToastTests</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_make_toast</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">make_toast</span><span class=\"p\">(),</span> <span class=\"s2\">&quot;toast&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Esta prueba comprueba que la función <code class=\"docutils literal notranslate\"><span class=\"pre\">make_toast()</span></code> devuelve <code class=\"docutils literal notranslate\"><span class=\"pre\">'toast'</span></code></p>\n<aside class=\"admonition-but-this-testing-thing-looks-kinda-hard admonition\">\n<p class=\"admonition-title\">Pero este asunto de las pruebas parece un poco difícil…</p>\n<p>Si usted nunca había tenido que lidiar con las pruebas anteriormente, pueden parecer un poco difíciles de escribir a primera vista. Afortunadamente, las pruebas son un tema muy importante en la programación, así que hay mucha información disponible:</p>\n<ul class=\"simple\">\n<li><p>Un buen primer vistazo a las pruebas de escritura para Django se puede encontrar en la documentación en: doc:/topics/testing/overview.</p></li>\n<li><p>Inmersión en Python (un libro en línea gratis para los desarrolladores principiantes de Python) incluye una gran <a class=\"reference external\" href=\"https://diveinto.org/python3/unit-testing.html\">introducción a las pruebas unitarias</a>.</p></li>\n<li><p>Después de leer esos, si quieres algo un poco mas sustancioso para hincar el diente, siempre está la documentación de <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#module-unittest\" title=\"(en Python versión 3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">unittest</span></code></a> de Python.</p></li>\n</ul>\n</aside>\n</section>\n<section id=\"running-your-new-test\">\n<h3>Ejecutando su nueva prueba<a class=\"heading-anchor\" href=\"#running-your-new-test\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Como todavía no hemos hecho ninguna modificación en <code class=\"docutils literal notranslate\"><span class=\"pre\">django.shortcuts</span></code>, nuestro test debería fallar. Vamos a ejecutar todas las pruebas en la carpeta <code class=\"docutils literal notranslate\"><span class=\"pre\">shortcuts</span></code> para asegurarnos de que es lo que realmente ocurre. Usa <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span></code> para cambiarte al directorio <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> de Django y ejecuta:</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>./runtests.py<span class=\"w\"> </span>shortcuts\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> runtests.py shortcuts\n</code></pre></div></div></div>\n<p>Sí los tests han corrido correctamente, deberías obtener un error vinculado al método que hemos agradado, con éste error:</p>\n<div class=\"code-block\" data-language=\"pytb\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Pytb</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=\"Pytb code\"><code><span class=\"x\">ImportError: cannot import name &#39;make_toast&#39; from &#39;django.shortcuts&#39;</span>\n</code></pre></div>\n<p>Si todas las pruebas pasaron, entonces deberías verificar que la nueva prueba mostrada arriba esté en la carpeta adecuada y tenga nombre de archivo apropiado.</p>\n</section>\n</section>\n<section id=\"writing-the-code-for-your-ticket\">\n<h2>Escribiendo el código para su ticket<a class=\"heading-anchor\" href=\"#writing-the-code-for-your-ticket\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ahora agregaremos la función <code class=\"docutils literal notranslate\"><span class=\"pre\">make_toast()</span></code>.</p>\n<p>Navegue al directorio <code class=\"docutils literal notranslate\"><span class=\"pre\">django/</span></code> y edite <code class=\"docutils literal notranslate\"><span class=\"pre\">shortcuts.py</span></code>. Al final del archivo añada:</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><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_toast</span><span class=\"p\">():</span>\n    <span class=\"k\">return</span> <span class=\"s2\">&quot;toast&quot;</span>\n</code></pre></div>\n<p>Es necesario ahora asegurarnos que el test que hemos escrito funciona correctamente. De nuevo, navega al directorio <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> de Django y ejecuta:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-7-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>./runtests.py<span class=\"w\"> </span>shortcuts\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-7-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> runtests.py shortcuts\n</code></pre></div></div></div>\n<p>Todo debería funcionar bien. En caso contrario, asegúrate que la función está en el archivo correcto.</p>\n</section>\n<section id=\"running-django-s-test-suite-for-the-second-time\">\n<h2>Ejecutando el conjunto de pruebas de Django por segunda vez<a class=\"heading-anchor\" href=\"#running-django-s-test-suite-for-the-second-time\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Una vez que hayas verificado que el parche y el test están funcionando correctamente, es una buena idea ejecutar toda la batería de tests de Django para verificar que tus modificaciones no ha introducido errores en otras áreas de Django. Aunque todos los tests Django pasen exitosamente no garantiza que tu código esté libre de errores, ayuda a identificar muchos errores y regresiones que de otro modo podrían pasar desapercibidos.</p>\n<p>Para ejecutar todo el conjunto de pruebas de Django, cambie al directorio <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> de Django y ejecute:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-8-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>./runtests.py\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-8-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> runtests.py \n</code></pre></div></div></div>\n</section>\n<section id=\"writing-documentation\">\n<h2>Escribiendo la documentación<a class=\"heading-anchor\" href=\"#writing-documentation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Esta es una nueva funcionalidad, por tlo anto debe ser documentada. Edite <code class=\"docutils literal notranslate\"><span class=\"pre\">docs/topics/http/shortcuts.txt</span></code> y agregue lo siguiente al final del archivo:</p>\n<div class=\"code-block\" data-language=\"rst\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code><span class=\"gh\">``make_toast()``</span>\n<span class=\"gh\">================</span>\n\n<span class=\"p\">..</span> <span class=\"ow\">function</span><span class=\"p\">::</span> make_toast()\n\n<span class=\"p\">..</span> <span class=\"ow\">versionadded</span><span class=\"p\">::</span> 2.2\n\nReturns <span class=\"s\">``&#39;toast&#39;``</span>.\n</code></pre></div>\n<p>Dado que esta nueva característica estará en una próxima versión, también se añade a las notas de la próxima versión de Django. Abre las notas de la última versión en <code class=\"docutils literal notranslate\"><span class=\"pre\">docs/releases/</span></code>, que en el momento de escribir esto debería ser __django.version__. Añade una nota bajo el encabezado «Minor Features»:</p>\n<div class=\"code-block\" data-language=\"rst\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code><span class=\"gh\">:mod:`django.shortcuts`</span>\n<span class=\"gh\">~~~~~~~~~~~~~~~~~~~~~~~</span>\n\n<span class=\"m\">*</span> The new <span class=\"na\">:func:</span><span class=\"nv\">`django.shortcuts.make_toast`</span> function returns <span class=\"s\">``&#39;toast&#39;``</span>.\n</code></pre></div>\n<p>Para obtener más información sobre escribir la documentación, incluyendo una explicación de lo que se trata el fragmento <code class=\"docutils literal notranslate\"><span class=\"pre\">versionadded</span></code>, consulte <a class=\"reference internal\" href=\"/es/4.2/internals/contributing/writing-documentation/\"><span class=\"doc\">Writing documentation</span></a>. Esa página incluye también una explicación de cómo generar una copia de la documentación localmente, por lo que puede obtener una vista previa del código HTML que se generará.</p>\n</section>\n<section id=\"previewing-your-changes\">\n<h2>Previsualización de sus cambios<a class=\"heading-anchor\" href=\"#previewing-your-changes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Es el momento de revisar todos los cambios realizados en nuestro parche. Para poner en escena todos los cambios listos para su confirmación, ejecuta:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-9-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>git<span class=\"w\"> </span>add<span class=\"w\"> </span>--all\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-9-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> git add --all\n</code></pre></div></div></div>\n<p>A continuación, muestra las diferencias entre tu copia Django actual y la revisión del checkout inicial del tutorial ejecutando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-10-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>git<span class=\"w\"> </span>diff<span class=\"w\"> </span>--cached\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-10-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> git diff --cached\n</code></pre></div></div></div>\n<p>Use las flechas del teclado para moverse arriba y abajo.</p>\n<div class=\"code-block\" data-language=\"diff\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Diff</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=\"Diff code\"><code><span class=\"gh\">diff --git a/django/shortcuts.py b/django/shortcuts.py</span>\n<span class=\"gh\">index 7ab1df0e9d..8dde9e28d9 100644</span>\n<span class=\"gd\">--- a/django/shortcuts.py</span>\n<span class=\"gi\">+++ b/django/shortcuts.py</span>\n<span class=\"gu\">@@ -156,3 +156,7 @@ def resolve_url(to, *args, **kwargs):</span>\n\n<span class=\"w\"> </span>    # Finally, fall back and assume it&#39;s a URL\n<span class=\"w\"> </span>    return to\n<span class=\"gi\">+</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+def make_toast():</span>\n<span class=\"gi\">+    return &#39;toast&#39;</span>\n<span class=\"gh\">diff --git a/docs/releases/2.2.txt b/docs/releases/2.2.txt</span>\n<span class=\"gh\">index 7d85d30c4a..81518187b3 100644</span>\n<span class=\"gd\">--- a/docs/releases/2.2.txt</span>\n<span class=\"gi\">+++ b/docs/releases/2.2.txt</span>\n<span class=\"gu\">@@ -40,6 +40,11 @@ database constraints. Constraints are added to models using the</span>\n<span class=\"w\"> </span>Minor features\n<span class=\"w\"> </span>--------------\n\n<span class=\"gi\">+:mod:`django.shortcuts`</span>\n<span class=\"gi\">+~~~~~~~~~~~~~~~~~~~~~~~</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+* The new :func:`django.shortcuts.make_toast` function returns ``&#39;toast&#39;``.</span>\n<span class=\"gi\">+</span>\n<span class=\"w\"> </span>:mod:`django.contrib.admin`\n<span class=\"w\"> </span>~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n<span class=\"gh\">diff --git a/docs/topics/http/shortcuts.txt b/docs/topics/http/shortcuts.txt</span>\n<span class=\"gh\">index 7b3a3a2c00..711bf6bb6d 100644</span>\n<span class=\"gd\">--- a/docs/topics/http/shortcuts.txt</span>\n<span class=\"gi\">+++ b/docs/topics/http/shortcuts.txt</span>\n<span class=\"gu\">@@ -271,3 +271,12 @@ This example is equivalent to::</span>\n<span class=\"w\"> </span>        my_objects = list(MyModel.objects.filter(published=True))\n<span class=\"w\"> </span>        if not my_objects:\n<span class=\"w\"> </span>            raise Http404(&quot;No MyModel matches the given query.&quot;)\n<span class=\"gi\">+</span>\n<span class=\"gi\">+``make_toast()``</span>\n<span class=\"gi\">+================</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+.. function:: make_toast()</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+.. versionadded:: 2.2</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+Returns ``&#39;toast&#39;``.</span>\n<span class=\"gh\">diff --git a/tests/shortcuts/test_make_toast.py b/tests/shortcuts/test_make_toast.py</span>\nnew file mode 100644\n<span class=\"gh\">index 0000000000..6f4c627b6e</span>\n<span class=\"gd\">--- /dev/null</span>\n<span class=\"gi\">+++ b/tests/shortcuts/test_make_toast.py</span>\n<span class=\"gu\">@@ -0,0 +1,7 @@</span>\n<span class=\"gi\">+from django.shortcuts import make_toast</span>\n<span class=\"gi\">+from django.test import SimpleTestCase</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+class MakeToastTests(SimpleTestCase):</span>\n<span class=\"gi\">+    def test_make_toast(self):</span>\n<span class=\"gi\">+        self.assertEqual(make_toast(), &#39;toast&#39;)</span>\n</code></pre></div>\n<p>Cuando hayas terminado de revisar el parche presiona <code class=\"docutils literal notranslate\"><span class=\"pre\">q</span></code> para volver a la línea de comandos. Si el contenido del parche se ve bien es tiempo de consumar los cambios.</p>\n</section>\n<section id=\"committing-the-changes-in-the-patch\">\n<h2>Confirmando los cambios en el parche<a class=\"heading-anchor\" href=\"#committing-the-changes-in-the-patch\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Para confirmar los cambios:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-11-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>git<span class=\"w\"> </span>commit\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-11-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> git commit\n</code></pre></div></div></div>\n<p>Esto abre un editor de texto para escribir el mensaje de confirmación. Siga las <a class=\"reference internal\" href=\"/es/4.2/internals/contributing/committing-code/#committing-guidelines\"><span class=\"std std-ref\">guías para mensajes de confirmación</span></a> y escriba un mensaje como:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>Fixed #99999 -- Added a shortcut function to make toast.\n</code></pre></div>\n</section>\n<section id=\"pushing-the-commit-and-making-a-pull-request\">\n<h2>Enviando la confirmación y haciendo una solicitud de fusión<a class=\"heading-anchor\" href=\"#pushing-the-commit-and-making-a-pull-request\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>After committing the patch, send it to your fork on GitHub (substitute\n«ticket_99999» with the name of your branch if it’s different):</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-12-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>git<span class=\"w\"> </span>push<span class=\"w\"> </span>origin<span class=\"w\"> </span>ticket_99999\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-12-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> git push origin ticket_99999\n</code></pre></div></div></div>\n<p>Puede crear una solicitud de fusión visitando <a class=\"reference external\" href=\"https://github.com/django/django/\">La página GitHub de Django</a>. Verá su rama en «Your recently pushed branches». Haga clic en «Compare &amp; pull request».</p>\n<p>Por favor, no lo haga para este tutorial, pero en la siguiente página que se muestra una vista previa del parche, debería hacer clic en «Create pull request».</p>\n</section>\n<section id=\"next-steps\">\n<h2>Próximos pasos<a class=\"heading-anchor\" href=\"#next-steps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>¡Enhorabuena, ha aprendido cómo hacer una solicitud de fusión a Django! Encontrará detalles de técnicas más avanzadas que puede necesitar en <a class=\"reference internal\" href=\"/es/4.2/internals/contributing/writing-code/working-with-git/\"><span class=\"doc\">Working with Git and GitHub</span></a>.</p>\n<p>Ahora puedes dar un buen uso a esas habilidades ayudando a mejorar la base de código de Django.</p>\n<section id=\"more-information-for-new-contributors\">\n<h3>Más información para los nuevos colaboradores<a class=\"heading-anchor\" href=\"#more-information-for-new-contributors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Antes de que se involucre mucho en la escritura de parches para Django, hay algo más de información sobre cómo contribuir a la que probablemente debería echarle un vistazo:</p>\n<ul class=\"simple\">\n<li><p>Debe asegurarse de leer la documentación de Django sobre <a class=\"reference internal\" href=\"/es/4.2/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">reclamar tickets y enviar parches</span></a>. Esta incluye la etiqueta de Trac, cómo reclamar tickets para uno mismo, el estilo esperado de codificación para parches y muchos otros detalles importantes.</p></li>\n<li><p>Las personas que colaboran por primera vez también deben leer <a class=\"reference internal\" href=\"/es/4.2/internals/contributing/new-contributors/\"><span class=\"doc\">la documentación para los colaboradores principiantes</span></a> de Django. Tiene muchos buenos consejos para aquellos de nosotros que somos nuevos en esto de colaborar con Django.</p></li>\n<li><p>Después de ellos, si todavía quiere más información sobre cómo contribuir, siempre se puede navegar por el resto de <a class=\"reference internal\" href=\"/es/4.2/internals/contributing/\"><span class=\"doc\">la documentación de Django sobre cómo contribuir</span></a>. Este contiene un montón de información útil y debe ser su primera fuente para responder a cualquier pregunta que pueda tener.</p></li>\n</ul>\n</section>\n<section id=\"finding-your-first-real-ticket\">\n<h3>Encontrando su primer ticket real<a class=\"heading-anchor\" href=\"#finding-your-first-real-ticket\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Una vez que haya revisado parte de esa información, estará listo para salir y encontrar un ticket al cual escribirle un parche. Preste especial atención a los tickets con el criterio de «easy pickings». Estos tickets son a menudo de carácter mucho más simples y son geniales para los que colaboran por primera vez. Una vez que esté familiarizado con como contribuir con Django, puede pasar a escribir parches para los tickets más difíciles y complicados.</p>\n<p>If you just want to get started already (and nobody would blame you!), try\ntaking a look at the list of <a class=\"reference external\" href=\"https://code.djangoproject.com/query?status=new&amp;status=reopened&amp;has_patch=0&amp;easy=1&amp;col=id&amp;col=summary&amp;col=status&amp;col=owner&amp;col=type&amp;col=milestone&amp;order=priority\">easy tickets that need patches</a> and the\n<a class=\"reference external\" href=\"https://code.djangoproject.com/query?status=new&amp;status=reopened&amp;needs_better_patch=1&amp;easy=1&amp;col=id&amp;col=summary&amp;col=status&amp;col=owner&amp;col=type&amp;col=milestone&amp;order=priority\">easy tickets that have patches which need improvement</a>. If you’re familiar\nwith writing tests, you can also look at the list of\n<a class=\"reference external\" href=\"https://code.djangoproject.com/query?status=new&amp;status=reopened&amp;needs_tests=1&amp;easy=1&amp;col=id&amp;col=summary&amp;col=status&amp;col=owner&amp;col=type&amp;col=milestone&amp;order=priority\">easy tickets that need tests</a>. Remember to follow the guidelines about\nclaiming tickets that were mentioned in the link to Django’s documentation on\n<a class=\"reference internal\" href=\"/es/4.2/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">claiming tickets and submitting patches</span></a>.</p>\n</section>\n<section id=\"what-s-next-after-creating-a-pull-request\">\n<h3>¿Qué hay después de crear una solicitud de fusión?<a class=\"heading-anchor\" href=\"#what-s-next-after-creating-a-pull-request\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Después de que un ticket tiene un parche, necesita ser revisado por un segundo par de ojos. Después de enviar una solicitud de fusión asegúrese de actualizar los metadatos del ticket mediante el establecimiento de banderas en el ticket para decir «tiene parche», «no necesita pruebas», etc, para que otros puedan encontrarlo para su revisión. Contribuir no necesariamente siempre significa escribir un parche desde cero. Revisar parches existentes es también una contribución muy útil. Consulte: doc:/internals/contributing/triaging-tickets para más detalles.</p>\n</section>\n</section>","rootId":"writing-your-first-patch-for-django","toc":[{"title":"Introducción","anchor":"introduction","children":[{"title":"¿Para quién es este tutorial?","anchor":"who-s-this-tutorial-for","children":[]},{"title":"¿Qué cubre esta guía?","anchor":"what-does-this-tutorial-cover","children":[]}]},{"title":"Código de Conducta","anchor":"code-of-conduct","children":[]},{"title":"Instalando Git","anchor":"installing-git","children":[]},{"title":"Obtenga una copia de la versión de desarrollo de Django","anchor":"getting-a-copy-of-django-s-development-version","children":[{"title":"Creando proyectos con una copia local de Django.","anchor":"creating-projects-with-a-local-copy-of-django","children":[]}]},{"title":"Ejecutando el conjunto de pruebas de Django por primera vez","anchor":"running-django-s-test-suite-for-the-first-time","children":[]},{"title":"Trabajando en una característica","anchor":"working-on-a-feature","children":[]},{"title":"Creando una rama para su parche","anchor":"creating-a-branch-for-your-patch","children":[]},{"title":"Escribiendo algunas pruebas para su reporte","anchor":"writing-some-tests-for-your-ticket","children":[{"title":"Escribiendo una prueba para el ticket #99999","anchor":"writing-a-test-for-ticket-99999","children":[]},{"title":"Ejecutando su nueva prueba","anchor":"running-your-new-test","children":[]}]},{"title":"Escribiendo el código para su ticket","anchor":"writing-the-code-for-your-ticket","children":[]},{"title":"Ejecutando el conjunto de pruebas de Django por segunda vez","anchor":"running-django-s-test-suite-for-the-second-time","children":[]},{"title":"Escribiendo la documentación","anchor":"writing-documentation","children":[]},{"title":"Previsualización de sus cambios","anchor":"previewing-your-changes","children":[]},{"title":"Confirmando los cambios en el parche","anchor":"committing-the-changes-in-the-patch","children":[]},{"title":"Enviando la confirmación y haciendo una solicitud de fusión","anchor":"pushing-the-commit-and-making-a-pull-request","children":[]},{"title":"Próximos pasos","anchor":"next-steps","children":[{"title":"Más información para los nuevos colaboradores","anchor":"more-information-for-new-contributors","children":[]},{"title":"Encontrando su primer ticket real","anchor":"finding-your-first-real-ticket","children":[]},{"title":"¿Qué hay después de crear una solicitud de fusión?","anchor":"what-s-next-after-creating-a-pull-request","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Empezando","url":"/es/4.2/intro/"}],"prev":{"docname":"intro/whatsnext","title":"Qué leer después","url":"/es/4.2/intro/whatsnext/"},"next":{"docname":"topics/index","title":"Using Django","url":"/es/4.2/topics/"},"formats":{"html":"/es/4.2/intro/contributing/","markdown":"/es/4.2/intro/contributing.md","json":"/es/4.2/intro/contributing.json"},"source":"https://github.com/django/django/blob/stable/4.2.x/docs/intro/contributing.txt","official":"https://docs.djangoproject.com/es/4.2/intro/contributing/","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","it","pt-br","ko","es","el","pl"]}