{"title":"Escrevendo seu primeiro patch para Django","version":"1.10","locale":"pt-br","docname":"intro/contributing","url":"/pt-br/1.10/intro/contributing/","canonical":"https://djangodocs.dev/pt-br/1.10/intro/contributing/","summary":"Introdução Link para este cabeçalho # Interessado em retribuir um pouco para a comunidade? Talvez você tenha encontrado uma falha no Django que você gostaria de ver…","html":"<h1>Escrevendo seu primeiro patch para Django<a class=\"heading-anchor\" href=\"#writing-your-first-patch-for-django\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"introduction\">\n<h2>Introdução<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Interessado em retribuir um pouco para a comunidade? Talvez você tenha encontrado uma falha no Django que você gostaria de ver corrigida, ou talvez exista uma pequena funcionalidade que poderia ser adicionada.</p>\n<p>A melhor maneira de ver os seus próprios problemas serem resolvidos é contribuindo com o Django. Isto pode parecer assustador no começo, mas na verdade é bem simples. Nós lhe guiaremos por todo o processo para que você possa aprender através de exemplos.</p>\n<section id=\"who-s-this-tutorial-for\">\n<h3>Para quem se destina este tutorial?<a class=\"heading-anchor\" href=\"#who-s-this-tutorial-for\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Ver também</p>\n<p>Se você está procurando por uma referência sobre como enviar pacotes, veja a  <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">Enviando patches</span></a> documentação.</p>\n</aside>\n<p>Para este tutorial, esperamos que você tenha ao menos um conhecimento básico de como o Django funciona. Isso significa que você precisa estar confortável com o tutoriai “Escrevendo sua primeira aplicação Django&lt;/intro/tutorial01&gt;”. Além disso, você deve ter um bom conhecimento em Python. Mas se não tiver, “Dive Into Python” é um livro online fantástico (e gratuito) para iniciantes em Python.</p>\n<p>Aqueles que não estão familiarizados com sistemas de controle de versão e Trac irão encontrar neste tutorial, e seus links inclusos, informações suficientes para iniciar. Entretanto, se você esta planejando contribuir com o Django regularmente, provavelmente você vai querer ler mais a respeito das destas diferentes ferramentas.</p>\n<p>Para a maior parte, porém, este tutorial tenta explicar o máximo possível, tal que possa ser usado por um público mais amplo.</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">Onde obter ajuda:</p>\n<p>Se você estiver enfrentando problemas durante este tutorial, por favor envie um mensagem par <a class=\"reference internal\" href=\"/pt-br/1.10/internals/mailing-lists/#django-developers-mailing-list\"><span class=\"std std-ref\">django-developers</span></a> ou acesse <a href=\"#id14\"><span class=\"problematic\" id=\"id15\">`#django-dev on irc.freenode.net`__</span></a> para conversar com outros usuários de Django que podem ser capazes de ajudá-lo.</p>\n</aside>\n</section>\n<section id=\"what-does-this-tutorial-cover\">\n<h3>O que este tutorial cobre?<a class=\"heading-anchor\" href=\"#what-does-this-tutorial-cover\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Nós iremos guir você para que contribua com um “patch” para o Django pela primeira vez. Ao final deste tutorial, você deve possuir o conhecimento básico tanto para as ferramentas quanto para os processos envolvidos. Nós iremos cobrir especialmente os seguintes tópicos:</p>\n<ul class=\"simple\">\n<li><p>Instalando Git.</p></li>\n<li><p>Como baixar uma cópia de desenvolvimento do Django.</p></li>\n<li><p>Executando suite de testes do Django.</p></li>\n<li><p>Escrevendo um teste para o seu patch.</p></li>\n<li><p>Escrevendo o código para o seu patch.</p></li>\n<li><p>Testando o seu patch.</p></li>\n<li><p>Submitting a pull request.</p></li>\n<li><p>Onde encontrar mais informações.</p></li>\n</ul>\n<p>Uma vez que você terminar este tutorial, você pode olhar o restante da <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/\"><span class=\"doc\">Documentação do Django sobre contribuição</span></a> Ela contém muitas informações úteis e deve ser lida por quem deseja se tornar um contribuidor do Django. Caso tenha perguntas, a documentação provavelmente contem as respostas.</p>\n<aside class=\"admonition-python-3-required admonition\">\n<p class=\"admonition-title\">Python 3 é requerido!</p>\n<p>Este tutorial acredita que você já está usando o Python 3. Obtenha a última versão do Python na sua página de download &lt;<a class=\"reference external\" href=\"https://www.python.org/download/\">https://www.python.org/download/</a>&gt;` ou com seu sistema de controle de pacotes.</p>\n</aside>\n<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Para usuários do Windows</p>\n<p>Quando instalar o Python no Windows, tenha certeza que você marcou a opção “Add python.exe to Path”, então ele sempre vai estar disponível na linha de comando.</p>\n</aside>\n</section>\n</section>\n<section id=\"code-of-conduct\">\n<h2>Código de Conduta<a class=\"heading-anchor\" href=\"#code-of-conduct\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Como um contribuidor, você pode nos ajudar a manter a comunidade Django aberta e solidária. Por favor, leia e siga nosso ‘Código de conduta’ &lt;<a class=\"reference external\" href=\"https://www.djangoproject.com/conduct/\">https://www.djangoproject.com/conduct/</a>&gt;`_.</p>\n</section>\n<section id=\"installing-git\">\n<h2>Instalando Git<a class=\"heading-anchor\" href=\"#installing-git\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Para este tutorial será necessário ter o Git instalado para fazer o download da versão corrente de desenvolvimento do Django e para gerar arquivos de “patch” para as mudanças que você faça.</p>\n<p>Para verificar se o Git está instalado ou não no seu sistema, digite <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span></code> na linha de comando. Se o resultado for uma mensagem dizendo que o comando não pode ser encontrado, você terá que fazer o download e instalar o Git. Dê uma olhada em <a href=\"#id14\"><span class=\"problematic\" id=\"id16\">`Git's download page`__</span></a>.</p>\n<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Para usuários do Windows</p>\n<p>Ao instalar o Git no Windows, é recomendável que você escolha a opção “Git Bash” para que o Git seja executado em seu próprio shell. Este tutorial assume que foi assim que você instalou.</p>\n</aside>\n<p>Caso não esteja familiar com o Git, você sempre pode achar mais sobre seus comandos (uma vez que estiver instalado) digitando “git help” na linha de comando.</p>\n</section>\n<section id=\"getting-a-copy-of-django-s-development-version\">\n<h2>Obtendo uma cópia da versão de desenvolvimento do Django<a class=\"heading-anchor\" href=\"#getting-a-copy-of-django-s-development-version\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>O primeiro passo para contribuir com o Django é ter uma cópia dos arquivos do código fonte. Primeiro, <a class=\"reference external\" href=\"https://github.com/django/django/fork\">faça um fork do projeto Django no GitHub</a>. Então, a aprtir da linha de comando, use o comando <code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span></code> para ir até o diretório onde você quer que fique sua cópia do projeto Django.</p>\n<p>Baixe o código fonte do repositório do Django usando o seguinte comando:</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>git<span class=\"w\"> </span>clone<span class=\"w\"> </span>git@github.com:YourGitHubName/django.git\n</code></pre></div>\n<p>Agora que você tem uma cópia local do Django, você pode instalá-lo da mesma forma que você instalaria qualquer pacote usando <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></code>. A maneira mais conveniente de fazer isso é usando um <em>ambiente virtual</em> (ou virtualenv) que é um recurso embutido no Python que permite que você mantenha um diretório separado para os pacotes instalados de cada um dos seus projetos para que uns não interfiram com os outros.</p>\n<p>É uma boa idéia mater todos os seus virtualenvs em um lugar, por exemplo em <code class=\"docutils literal notranslate\"><span class=\"pre\">.virtualenvs/</span></code> no seu diretório pessoal. Crie-o se ele ainda não existe:</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>mkdir<span class=\"w\"> </span>~/.virtualenvs\n</code></pre></div>\n<p>Agora crie uma nova virtualenv executando:</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>python3<span class=\"w\"> </span>-m<span class=\"w\"> </span>venv<span class=\"w\"> </span>~/.virtualenvs/djangodev\n</code></pre></div>\n<p>O caminho é o local onde o novo ambiente será salvo em seu computador.</p>\n<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Para usuários do Windows</p>\n<p>Usando o módulo embutido <code class=\"docutils literal notranslate\"><span class=\"pre\">venv</span></code> não irá funcionar se você também estiver usando o Git Bash shell no Windows, já que os scripts de ativação só são criados para o shell do sistema (<code class=\"docutils literal notranslate\"><span class=\"pre\">.bat</span></code>)e para o  PowerShell (<code class=\"docutils literal notranslate\"><span class=\"pre\">.ps1</span></code>). Em vez disso use o pacote <code class=\"docutils literal notranslate\"><span class=\"pre\">virtualenv</span></code>:</p>\n<div class=\"code-block\" data-language=\"none\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">None</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=\"None code\"><code>$ pip install virtualenv\n$ virtualenv ~/.virtualenvs/djangodev\n</code></pre></div>\n</aside>\n<aside class=\"admonition-for-ubuntu-users admonition\">\n<p class=\"admonition-title\">Para usuários Ubuntu.</p>\n<p>Em algumas versões do Ubuntu pode ser que o comando acima falhe. Ao invés disso use o pacote <code class=\"docutils literal notranslate\"><span class=\"pre\">virtualenv</span></code>, antes certifique-se que você tem o <code class=\"docutils literal notranslate\"><span class=\"pre\">pip3</span></code>:</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>sudo<span class=\"w\"> </span>apt-get<span class=\"w\"> </span>install<span class=\"w\"> </span>python3-pip\n<span class=\"gp\">$ </span><span class=\"c1\"># Prefix the next command with sudo if it gives a permission denied error</span>\n<span class=\"gp\">$ </span>pip3<span class=\"w\"> </span>install<span class=\"w\"> </span>virtualenv\n<span class=\"gp\">$ </span>virtualenv<span class=\"w\"> </span>--python<span class=\"o\">=</span><span class=\"sb\">`</span>which<span class=\"w\"> </span>python3<span class=\"sb\">`</span><span class=\"w\"> </span>~/.virtualenvs/djangodev\n</code></pre></div>\n</aside>\n<p>O passo final na criação da sua virtualenv é ativá-la:</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>Se o comando <code class=\"docutils literal notranslate\"><span class=\"pre\">source</span></code> não estiver disponível, você pode tentar usar um ponto em vez disso:</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<aside class=\"admonition-for-windows-users admonition\">\n<p class=\"admonition-title\">Para usuários do Windows</p>\n<p>Para ativar seu virtualenv no Windows, rode:</p>\n<div class=\"code-block\" data-language=\"none\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">None</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=\"None code\"><code>$ source ~/virtualenvs/djangodev/Scripts/activate\n</code></pre></div>\n</aside>\n<p>Você tem que ativar o virtualenv sempre que abrir uma nova janela de terminal. <a href=\"#id14\"><span class=\"problematic\" id=\"id17\">virtualenvwrapper__</span></a> é uma ferramenta útil para deixar isso mais conveniente.</p>\n<p>Tudo o que você instalar através do <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></code> a partir de agora será instalado no seu novo virtualenv, isolado de outros ambientes e pacotes de todo o sistema. Além disso, o nome do virtualenv atualmente ativado é exibido na linha de comando para lhe ajudar a saber qual deles você está usando. Vá em frente e instale a cópia previamente clonada do Django:</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>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<p>A versão instalada do Django agora está apontando para a sua cópia local. Você verá as mudanças que fizer de forma imediata, o que é uma grande ajuda quando se está escrevendo o primeiro patch</p>\n</section>\n<section id=\"rolling-back-to-a-previous-revision-of-django\">\n<h2>Revertendo para uma revisão anterior do Django<a class=\"heading-anchor\" href=\"#rolling-back-to-a-previous-revision-of-django\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Para este tutorial usaremos o ticket <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/24788\">#24788</a> como caso de estudo, então iremos voltar no histórico de versão do Django no git para antes que o “patch” deste ticket tenha sido aplicado. Isso nos possibilitará ir através de todos os passos envolvidos em escrever um patch do início, incluindo rodar a suíte de testes do Django.</p>\n<p><strong>Tenha em mente que enquanto estamos usando uma revisão antiga da árvore do Django, para o propósito do tutorial abaixo, você deve sempre usar a versão corrente da árvore de desenvolvimento quando for trabalhar no seu próprio patch para um ticket!</strong></p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>O patch para este ticket foi escrito por Paweł Marczewskie foi aplicado ao Django como <a href=\"#id14\"><span class=\"problematic\" id=\"id18\">`commit 4df7e8483b2679fc1cba3410f08960bac6f51115`__</span></a>. Consequentemente, usaremos a revisão anterior a esta, <a href=\"#id14\"><span class=\"problematic\" id=\"id19\">`commit 4ccfc4439a7add24f8db4ef3960d02ef8ae09887`__</span></a>.</p>\n</aside>\n<p>Navegue até o diretório raiz do Django (o diretório que contém ‘django’, ‘docs, ‘testes’, ‘autores’ e etc). Pode-se verificar então a  revisão mais antiga do Django que utilizaremos no tutorial abaixo:</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>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>4ccfc4439a7add24f8db4ef3960d02ef8ae09887\n</code></pre></div>\n</section>\n<section id=\"running-django-s-test-suite-for-the-first-time\">\n<h2>Executando a suíte de testes do Django pela primeira vez<a class=\"heading-anchor\" href=\"#running-django-s-test-suite-for-the-first-time\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Quando contribuir para o Django é muito imoprtante que suas mudanças no código não introduzam bugs em outras área do Django. Uma maneira de verificar se o Django ainda funciona  depois de adicionar suas alterações é executando a suite de testes do Django. Se ainda passa em todos os testes, então você pode ter uma certeza razoável de que suas alterações não quebraram completamente o Django. Se você nunca rodou os testes antes, é uma boa idéia executá-los uma vez só para estar familiarizado com o que a sua saída deveria parecer.</p>\n<p>Antes de rodar a suíte de testes, instale suas dependências primeiramente entrando no diretório <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> do Django  e então executando-a.</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>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>-r<span class=\"w\"> </span>requirements/py3.txt\n</code></pre></div>\n<p>Se encontrar algum erro durante a instalação, talvez esteja faltando no seu sistema alguma dependência de um ou mais pacotes Python. Consulte a documentação de pacotes faltantes ou procure na Web a mensagem de erro que encontrou.</p>\n<p>Agora estamos prontos para executar a suíte de testes. Se você estiver usando o GNU/Linux, Mac OS X ou alguma outra distribuiçao do UNIX, execute:</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>./runtests.py\n</code></pre></div>\n<p>Agora sente e relaxe. A suíte de testes do Django tem mais de 9.600 testes diferentes, por isso pode levar de 5 a 15 minutos para ser executado, dependendo da velocidade do seu computador.</p>\n<p>Enquanto a suíte de testes do Django estiver sendo executada, você verá um fluxo de caracteres representando o status de cada teste conforme vão sendo executados. “E” indica que foi lançado um erro durante o teste, “F” indica que as asserções do teste falharam. Ambos são considerados como se o teste tivesse falhado. Enquanto que “x” e “s” indicam falhas esperadas e testes ignorados, respectivamente. Pontos indicam que o teste passou.</p>\n<p>Normalmente testes são pulados quando faltam bibliotecas externas necessárias para executar o teste; veja <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/writing-code/unit-tests/#running-unit-tests-dependencies\"><span class=\"std std-ref\">Rodando todos os testes</span></a> para uma lista de dependências e para se certificar de instalar qualquer dependência relacionada com suas mudanças (nós não necessitamos de nenhuma para este tutorial). Alguns testes são específicos para um backend de uma data base de dados e serão ignorados se não testado com aquele backend. SQLite é a base de dados backend padrão nas configurações. Para executar os testes usando diferentes backends, veja <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/writing-code/unit-tests/#running-unit-tests-settings\"><span class=\"std std-ref\">Usando outro módulo settings</span></a>.</p>\n<p>Uma vez que os testes estejam completos, você deve ser informado através de uma mensagem se o seu teste passou ou falhou. Uma vez que você não fez nenhuma alteração no código do Django, todo a suíte de teste <em>deve</em> passar. Se você recebeu falhas ou erros verifique se você seguiu todos os passos anteriores corretamente. Para mais informações veja o <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/writing-code/unit-tests/#running-unit-tests\"><span class=\"std std-ref\">Rodando os testes unitários</span></a>. Se estiver usando Python 3.5+, haverá algum alerta sobre falhas relacionadas a alertas de pontos obsoletos que você pode ignorar. Estas falhas já foram corrigidas no Django.</p>\n<p>Perceba que o trunk mais recente do Django pode nem sempre estar estável. Quando estiver desenvolvendo utilizando o trunk você pode checar <a href=\"#id14\"><span class=\"problematic\" id=\"id20\">`builds de integração contínua do Django`__</span></a> para determinar se as falhas são específicas à sua máquina ou se elas estão presentes também nas builds oficiais do Django. Se você clicar para visualizar uma build em particular, você pode visualizar a “Matriz de Configuração”, que mostra falhas discriminadas por versão de Python e backend de banco de dados.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Para este tutorial e para o ticket em que iremos trabalhar, testar usando o SQLite é suficiente. Entretanto, é possível (e às vezes necessário) <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/writing-code/unit-tests/#running-unit-tests-settings\"><span class=\"std std-ref\">usar um banco de dados diferente para testes</span></a>.</p>\n</aside>\n</section>\n<section id=\"creating-a-branch-for-your-patch\">\n<h2>Creating a branch for your patch<a class=\"heading-anchor\" href=\"#creating-a-branch-for-your-patch\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Antes de fazer qualquer alteração, crie uma nova branch para o ticket:</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>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>-b<span class=\"w\"> </span>ticket_24788\n</code></pre></div>\n<p>You can choose any name that you want for the branch, “ticket_24788” is an\nexample. All changes made in this branch will be specific to the ticket and\nwon’t affect the main copy of the code that we cloned earlier.</p>\n</section>\n<section id=\"writing-some-tests-for-your-ticket\">\n<h2>Escrevendo alguns testes para o seu ticket<a class=\"heading-anchor\" href=\"#writing-some-tests-for-your-ticket\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Na maioria dos casos, para um patch ser aceito no Django, ele tem que incluir testes. Para patches de correção de erros, significa escrever um teste de regressão para garantir que o erro nunca mais seja reintroduzido no Django mais tarde. Um teste de regressão deve ser escrito de tal forma que irá falhar enquanto o erro ainda existir e passar uma vez que o erro foi corrigido. Para patches contendo novos recursos, você precisa incluir testes que garantem que os novos recursos estão funcionando corretamente. Eles também devem falhar quando o novo recurso não estiver presente, e em seguida passar, uma vez que foi implementado.</p>\n<p>Uma boa maneira de fazer isso é escrever seus novos testes primeiro, antes de realizar quaisquer modificações no código. Este estilo de desenvolvimento é chamado <a href=\"#id14\"><span class=\"problematic\" id=\"id21\">`desenvolvimento orientado a testes`__</span></a> e pode ser aplicado tanto a projetos inteiros quanto a patches isolados. Após escrever seus testes você os roda para garantir que eles realmente falham (uma vez que você ainda não consertou o bug ou adicionou a nova funcionalidade). Se seus novos testes não falharem, você terá de corrigí-los para que falhem. Afinal, um teste de regressão que passa independentemente de um bug estar presente não é muito útil na prevenção de que um bug ocorra novamente no futuro.</p>\n<p>Agora para nosso exemplo mão-na-massa.</p>\n<section id=\"writing-some-tests-for-ticket-24788\">\n<h3>Escrevendo alguns testes para o ticket #24788<a class=\"heading-anchor\" href=\"#writing-some-tests-for-ticket-24788\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ticket <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/24788\">#24788</a> propõe uma pequena adição: a habilidade de especificar o atributo de classe <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix</span></code> nas classes de Form, então que:</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>[…] forms which ship with apps could effectively namespace themselves such\nthat N overlapping form fields could be POSTed at once and resolved to the\ncorrect form.\n</code></pre></div>\n<p>Para resolver este ticket, iremos adicionar um atributo <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix</span></code> a classe <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseForm</span></code>. Quando criar instancias desta classe, passando um prefixo para o método <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> ainda será setado o prefixo na instancia criada. Mas não passando um prefix (ou passando <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>) será usado o prefixo da classe. Antes de fazermos estas mudanças, nós iremos escrever alguns testes para verificar que nossas modificações funcionam corretamente e continuem funcionando corretamente no futuro.</p>\n<p>Navegue para o diretório <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/forms_tests/tests/</span></code> do Django e abra o arquivo <code class=\"docutils literal notranslate\"><span class=\"pre\">test_forms.py</span></code>. Adicione o seguinte código na linha 1674 logo antes da função <code class=\"docutils literal notranslate\"><span class=\"pre\">test_forms_with_null_boolean</span></code> function:</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\">test_class_prefix</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Prefix can be also specified at the class level.</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n        <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">CharField</span><span class=\"p\">()</span>\n        <span class=\"n\">prefix</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;foo&#39;</span>\n\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</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\">p</span><span class=\"o\">.</span><span class=\"n\">prefix</span><span class=\"p\">,</span> <span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"p\">(</span><span class=\"n\">prefix</span><span class=\"o\">=</span><span class=\"s1\">&#39;bar&#39;</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\">p</span><span class=\"o\">.</span><span class=\"n\">prefix</span><span class=\"p\">,</span> <span class=\"s1\">&#39;bar&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Este novo teste verifica que a configuração de um prefixo nível de classe funciona como esperado, e que passando um parâmetro `` prefix`` ao criar uma instância ainda funciona também.</p>\n<aside class=\"admonition-but-this-testing-thing-looks-kinda-hard admonition\">\n<p class=\"admonition-title\">Mas esse lance de testar parece difícil…</p>\n<p>Caso você nunca tenha lidado com testes anteriormente, num primeiro momento eles podem parecer um pouco difíceis de escrever . Felizmente, testes são um assunto <em>muito</em> extenso em programação de computadores, então existe muita informção por aí:</p>\n<ul class=\"simple\">\n<li><p>Uma boa introdução em testes para Django pode ser encontrada na documentação <a class=\"reference internal\" href=\"/pt-br/1.10/topics/testing/overview/\"><span class=\"doc\">Writing and running tests</span></a>.</p></li>\n<li><p>Megulhando no Python (um livro gratuito online para desenvolvedores iniciantes de Python) inclui uma ótima <a href=\"#id14\"><span class=\"problematic\" id=\"id22\">`introdução ao Teste de Unidade`__</span></a>.</p></li>\n<li><p>Após essa leitura, se desejar algo a mais para se aprofundar, sempre há a documentação do Python sobre <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#module-unittest\" title=\"(em Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">unittest</span></code></a>.</p></li>\n</ul>\n</aside>\n</section>\n<section id=\"running-your-new-test\">\n<h3>Executando o seu novo teste<a class=\"heading-anchor\" href=\"#running-your-new-test\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lembre que na verdade ainda não fizemos nenhuma modificação no  <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseForm</span></code>, então os testes irão falhar. Vamos rodar todos os testes no diretório <code class=\"docutils literal notranslate\"><span class=\"pre\">forms_tests</span></code>  para ter ceteza que é isso que acontecerá. Na linha de comando, acesse o diretório <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> do Django e execute:</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>./runtests.py<span class=\"w\"> </span>forms_tests\n</code></pre></div>\n<p>Se os testes foram executados corretamente, você deverá ver uma falha que corresponde ao método de teste que adicionamos. Se todos estes testes passaram, então você deverá ter certeza que você adicionou o novo teste mostrado acima no diretório e classe apropriados.</p>\n</section>\n</section>\n<section id=\"writing-the-code-for-your-ticket\">\n<h2>Escrevendo o código para o seu ticket<a class=\"heading-anchor\" href=\"#writing-the-code-for-your-ticket\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Em seguida nós iremos adicionar a funcionalidade descrita no ticket <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/24788\">#24788</a> ao Django.</p>\n<section id=\"writing-the-code-for-ticket-24788\">\n<h3>Escrevendo o código para o ticket #24788<a class=\"heading-anchor\" href=\"#writing-the-code-for-ticket-24788\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Vá até o diretório <code class=\"docutils literal notranslate\"><span class=\"pre\">django/django/forms/`</span> <span class=\"pre\">e</span> <span class=\"pre\">abra</span> <span class=\"pre\">o</span> <span class=\"pre\">arquivo</span>&#160; <span class=\"pre\">``forms.py</span></code>. Ache a classe <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseForm</span></code> a linha 72 e adicione o atributo de classe <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix</span></code> logo após o <code class=\"docutils literal notranslate\"><span class=\"pre\">field_order</span></code> attribute:</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\">class</span><span class=\"w\"> </span><span class=\"nc\">BaseForm</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n    <span class=\"c1\"># This is the main implementation of all the Form logic. Note that this</span>\n    <span class=\"c1\"># class is different than Form. See the comments by the Form class for</span>\n    <span class=\"c1\"># more information. Any improvements to the form API should be made to</span>\n    <span class=\"c1\"># *this* class, not to the Form class.</span>\n    <span class=\"n\">field_order</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n    <span class=\"n\">prefix</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n</code></pre></div>\n</section>\n<section id=\"verifying-your-test-now-passes\">\n<h3>Verificando se o seu teste passa agora<a class=\"heading-anchor\" href=\"#verifying-your-test-now-passes\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Uma vez que tenha modificado o Django, precisamos ter ceteza que os testes que escreveu anteriormente passem, então você poder ver se o código que escrevemos anteriormente está funcionando corretamente. Para rodar os testes no diretório <code class=\"docutils literal notranslate\"><span class=\"pre\">forms_tests</span></code> ,  acesse (<code class=\"docutils literal notranslate\"><span class=\"pre\">cd</span></code>)  o diretório <code class=\"docutils literal notranslate\"><span class=\"pre\">tests/</span></code> do Django e execute:</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>./runtests.py<span class=\"w\"> </span>forms_tests\n</code></pre></div>\n<p>Opa, ainda bem que escrevemos esses testes! Você ainda deve ver uma falha com a seguinte exceção</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=\"ne\">AssertionError</span><span class=\"p\">:</span> <span class=\"kc\">None</span> <span class=\"o\">!=</span> <span class=\"s1\">&#39;foo&#39;</span>\n</code></pre></div>\n<p>Esquecemos de adicionar comando de condição no  método <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code>. Vá em frente e altere <code class=\"docutils literal notranslate\"><span class=\"pre\">self.prefix</span> <span class=\"pre\">=</span> <span class=\"pre\">prefix</span></code> que está agora na linha 87 do <code class=\"docutils literal notranslate\"><span class=\"pre\">django/forms/forms.py</span></code>, adicionando o comando de condição.</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\">if</span> <span class=\"n\">prefix</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">prefix</span> <span class=\"o\">=</span> <span class=\"n\">prefix</span>\n</code></pre></div>\n<p>Re-execute os testes e tudo deve passar. Caso contrário, tenha certeza que modificou corretamente  a classe <code class=\"docutils literal notranslate\"><span class=\"pre\">BaseForm</span></code> como mostrado acima e copiado o novo teste corretamente.</p>\n</section>\n</section>\n<section id=\"running-django-s-test-suite-for-the-second-time\">\n<h2>Executando a suíte de testes do Django pela segunda vez<a class=\"heading-anchor\" href=\"#running-django-s-test-suite-for-the-second-time\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Depois de verificar que seu patch e seu teste estão funcionando corretamente, é uma boa ídeia executar toda a suite de testes do Django apenas para verificar se sua mudança não introduziu algum erro em outras áreas do Django. Ao passar com sucesso em toda a suite de testes, não garante que seu código esteja livre de erros, ele ajuda identificar muitos erros e regressões que poderiam passar despercebidos.</p>\n<p>Para executar toda a suíte de testes do Django, `` cd`` no diretório `` testes / `` do Django  e execute:</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>./runtests.py\n</code></pre></div>\n<p>Contanto que você não veja qualquer falha, você está pronto para seguir.</p>\n</section>\n<section id=\"writing-documentation\">\n<h2>Escrevendo Documentação<a class=\"heading-anchor\" href=\"#writing-documentation\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Isos é uma funcionalidade nova, então deve ser documentada. Adicione a seguinte seção na linha 1068 (no final do arquivo)  do <code class=\"docutils literal notranslate\"><span class=\"pre\">django/docs/ref/forms/api.txt</span></code>:</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>The prefix can also be specified on the form class::\n\n    &gt;&gt;&gt; class PersonForm(forms.Form):\n    ...     ...\n    ...     prefix = &#39;person&#39;\n\n.. versionadded:: 1.9\n\n    The ability to specify ``prefix`` on the form class was added.\n</code></pre></div>\n<p>Já que essa nova funcionalidade estará em uma próxima revisão esta é também adicionada nas notas de release do Django 1.9, na linha 164 sob a seção “Forms” no arquivo  <code class=\"docutils literal notranslate\"><span class=\"pre\">docs/releases/1.9.txt</span></code>:</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>* A form prefix can be specified inside a form class, not only when\n  instantiating a form. See :ref:`form-prefix` for details.\n</code></pre></div>\n<p>Para mais informações sobre escrita de documentação, incluindo uma explicação sobre o que <code class=\"docutils literal notranslate\"><span class=\"pre\">versionadded</span></code> significa, verifique <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/writing-documentation/\"><span class=\"doc\">Escrevendo a documentação</span></a>. Essa página também inclui uma explicação sobre como construir uma cópia local da documentação, de maneira que você possa pré-visualizar o HTML que será gerado.</p>\n</section>\n<section id=\"previewing-your-changes\">\n<h2>Visualizando suas alterações<a class=\"heading-anchor\" href=\"#previewing-your-changes\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Now it’s time to go through all the changes made in our patch. To display the\ndifferences between your current copy of Django (with your changes) and the\nrevision that you initially checked out earlier in the tutorial:</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>git<span class=\"w\"> </span>diff\n</code></pre></div>\n<p>Use as teclas direcionais para mover para cima e para baixo.</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/forms/forms.py b/django/forms/forms.py</span>\n<span class=\"gh\">index 509709f..d1370de 100644</span>\n<span class=\"gd\">--- a/django/forms/forms.py</span>\n<span class=\"gi\">+++ b/django/forms/forms.py</span>\n<span class=\"gu\">@@ -75,6 +75,7 @@ class BaseForm(object):</span>\n<span class=\"w\"> </span>    # information. Any improvements to the form API should be made to *this*\n<span class=\"w\"> </span>    # class, not to the Form class.\n<span class=\"w\"> </span>    field_order = None\n<span class=\"gi\">+    prefix = None</span>\n\n<span class=\"w\"> </span>    def __init__(self, data=None, files=None, auto_id=&#39;id_%s&#39;, prefix=None,\n<span class=\"w\"> </span>                 initial=None, error_class=ErrorList, label_suffix=None,\n<span class=\"gu\">@@ -83,7 +84,8 @@ class BaseForm(object):</span>\n<span class=\"w\"> </span>        self.data = data or {}\n<span class=\"w\"> </span>        self.files = files or {}\n<span class=\"w\"> </span>        self.auto_id = auto_id\n<span class=\"gd\">-        self.prefix = prefix</span>\n<span class=\"gi\">+        if prefix is not None:</span>\n<span class=\"gi\">+            self.prefix = prefix</span>\n<span class=\"w\"> </span>        self.initial = initial or {}\n<span class=\"w\"> </span>        self.error_class = error_class\n<span class=\"w\"> </span>        # Translators: This is the default suffix added to form field labels\n<span class=\"gh\">diff --git a/docs/ref/forms/api.txt b/docs/ref/forms/api.txt</span>\n<span class=\"gh\">index 3bc39cd..008170d 100644</span>\n<span class=\"gd\">--- a/docs/ref/forms/api.txt</span>\n<span class=\"gi\">+++ b/docs/ref/forms/api.txt</span>\n<span class=\"gu\">@@ -1065,3 +1065,13 @@ You can put several Django forms inside one ``&lt;form&gt;`` tag. To give each</span>\n<span class=\"w\"> </span>    &gt;&gt;&gt; print(father.as_ul())\n<span class=\"w\"> </span>    &lt;li&gt;&lt;label for=&quot;id_father-first_name&quot;&gt;First name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;father-first_name&quot; id=&quot;id_father-first_name&quot; /&gt;&lt;/li&gt;\n<span class=\"w\"> </span>    &lt;li&gt;&lt;label for=&quot;id_father-last_name&quot;&gt;Last name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;father-last_name&quot; id=&quot;id_father-last_name&quot; /&gt;&lt;/li&gt;\n<span class=\"gi\">+</span>\n<span class=\"gi\">+The prefix can also be specified on the form class::</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+    &gt;&gt;&gt; class PersonForm(forms.Form):</span>\n<span class=\"gi\">+    ...     ...</span>\n<span class=\"gi\">+    ...     prefix = &#39;person&#39;</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+.. versionadded:: 1.9</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+    The ability to specify ``prefix`` on the form class was added.</span>\n<span class=\"gh\">diff --git a/docs/releases/1.9.txt b/docs/releases/1.9.txt</span>\n<span class=\"gh\">index 5b58f79..f9bb9de 100644</span>\n<span class=\"gd\">--- a/docs/releases/1.9.txt</span>\n<span class=\"gi\">+++ b/docs/releases/1.9.txt</span>\n<span class=\"gu\">@@ -161,6 +161,9 @@ Forms</span>\n<span class=\"w\"> </span>  :attr:`~django.forms.Form.field_order` attribute, the ``field_order``\n<span class=\"w\"> </span>  constructor argument , or the :meth:`~django.forms.Form.order_fields` method.\n\n<span class=\"gi\">+* A form prefix can be specified inside a form class, not only when</span>\n<span class=\"gi\">+  instantiating a form. See :ref:`form-prefix` for details.</span>\n<span class=\"gi\">+</span>\n<span class=\"w\"> </span>Generic Views\n<span class=\"w\"> </span>^^^^^^^^^^^^^\n\n<span class=\"gh\">diff --git a/tests/forms_tests/tests/test_forms.py b/tests/forms_tests/tests/test_forms.py</span>\n<span class=\"gh\">index 690f205..e07fae2 100644</span>\n<span class=\"gd\">--- a/tests/forms_tests/tests/test_forms.py</span>\n<span class=\"gi\">+++ b/tests/forms_tests/tests/test_forms.py</span>\n<span class=\"gu\">@@ -1671,6 +1671,18 @@ class FormsTestCase(SimpleTestCase):</span>\n<span class=\"w\"> </span>        self.assertEqual(p.cleaned_data[&#39;last_name&#39;], &#39;Lennon&#39;)\n<span class=\"w\"> </span>        self.assertEqual(p.cleaned_data[&#39;birthday&#39;], datetime.date(1940, 10, 9))\n\n<span class=\"gi\">+    def test_class_prefix(self):</span>\n<span class=\"gi\">+        # Prefix can be also specified at the class level.</span>\n<span class=\"gi\">+        class Person(Form):</span>\n<span class=\"gi\">+            first_name = CharField()</span>\n<span class=\"gi\">+            prefix = &#39;foo&#39;</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+        p = Person()</span>\n<span class=\"gi\">+        self.assertEqual(p.prefix, &#39;foo&#39;)</span>\n<span class=\"gi\">+</span>\n<span class=\"gi\">+        p = Person(prefix=&#39;bar&#39;)</span>\n<span class=\"gi\">+        self.assertEqual(p.prefix, &#39;bar&#39;)</span>\n<span class=\"gi\">+</span>\n<span class=\"w\"> </span>    def test_forms_with_null_boolean(self):\n<span class=\"w\"> </span>        # NullBooleanField is a bit of a special case because its presentation (widget)\n<span class=\"w\"> </span>        # is different than its data. This is handled transparently, though.\n</code></pre></div>\n<p>When you’re done previewing the patch, hit the <code class=\"docutils literal notranslate\"><span class=\"pre\">q</span></code> key to return to the\ncommand line. If the patch’s content looked okay, it’s time to commit the\nchanges.</p>\n</section>\n<section id=\"committing-the-changes-in-the-patch\">\n<h2>Cometendo as alterações no patch<a class=\"heading-anchor\" href=\"#committing-the-changes-in-the-patch\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Para cometer as alterações:</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>git<span class=\"w\"> </span>commit<span class=\"w\"> </span>-a\n</code></pre></div>\n<p>This opens up a text editor to type the commit message. Follow the <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/committing-code/#committing-guidelines\"><span class=\"std std-ref\">commit\nmessage guidelines</span></a> and write a message like:</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 #24788 -- Allowed Forms to specify a prefix at the class level.\n</code></pre></div>\n</section>\n<section id=\"pushing-the-commit-and-making-a-pull-request\">\n<h2>Pushing the commit and making a pull request<a class=\"heading-anchor\" href=\"#pushing-the-commit-and-making-a-pull-request\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>After committing the patch, send it to your fork on GitHub (substitute\n“ticket_24788” with the name of your branch if it’s different):</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>git<span class=\"w\"> </span>push<span class=\"w\"> </span>origin<span class=\"w\"> </span>ticket_24788\n</code></pre></div>\n<p>You can create a pull request by visiting the <a class=\"reference external\" href=\"https://github.com/django/django/\">Django GitHub page</a>. You’ll see your branch under “Your\nrecently pushed branches”. Click “Compare &amp; pull request” next to it.</p>\n<p>Please don’t do it for this tutorial, but on the next page that displays a\npreview of the patch, you would click “Create pull request”.</p>\n</section>\n<section id=\"next-steps\">\n<h2>Próximos passos<a class=\"heading-anchor\" href=\"#next-steps\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Congratulations, you’ve learned how to make a pull request to Django! Details\nof more advanced techniques you may need are in\n<a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/writing-code/working-with-git/\"><span class=\"doc\">Trabalhando com Git e GitHub</span></a>.</p>\n<p>Agora você pode contribuir para ajudar a melhorar a base de código do Django.</p>\n<section id=\"more-information-for-new-contributors\">\n<h3>Mais informações para novos contribuidores<a class=\"heading-anchor\" href=\"#more-information-for-new-contributors\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Antes que você mergulhe na escrita de patches para o Django há mais algumas informações sobre contribuição que você provavelmente deveria dar uma olhada:</p>\n<ul class=\"simple\">\n<li><p>Você deve certificar-se de ler a documentação do Django em <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">reinvidicando tickets e enviando patches</span></a>. Ela abrange etiqueta Trac, como reivindicar bilhetes para si mesmo, estilo de codificação prevista para patches, e muitos outros detalhes importantes.</p></li>\n<li><p>Os contribuidores de primeira viagem devem ler o <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/new-contributors/\"><span class=\"doc\">documentação sobre contribuidores de primeira viagem</span></a>. Ele tem muitos bons conselhos para aqueles que são novos para ajudar com Django.</p></li>\n<li><p>Depois disso, se você ainda estiver ansioso para obter mais informações sobre como contribuir, você sempre pode navegar pelo resto da <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/\"><span class=\"doc\">documentação do Django em contribuição</span></a>. Ele contém um monte de informações úteis e deve ser sua primeira fonte para responder quaisquer perguntas que você possa ter.</p></li>\n</ul>\n</section>\n<section id=\"finding-your-first-real-ticket\">\n<h3>Encontrando o seu primeiro ticket<a class=\"heading-anchor\" href=\"#finding-your-first-real-ticket\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Uma vez que tenha dado uma olhada nessa documentação, você estará pronto para ir procurar um ticket para escrever um “patch”. Preste especial atenção aos tickets marcados com o critério “easy pickings”. Estes tickets são em geral de natureza simples e bons para novos contribuidores. Uma vez que estiver familiarizado com contribuir para o Django, você pode ir adiante escrevendo  “patches” para tickets mais difíceis e complicados.</p>\n<p>Se você já quer começar agora (e ninguém iria culpá-lo!), tente dar uma olhada na lista de <a href=\"#id14\"><span class=\"problematic\" id=\"id23\">`tickets fáceis que precisam de patches`__</span></a> e os <a href=\"#id14\"><span class=\"problematic\" id=\"id24\">`tickets fáceis que têm patches que precisam de melhorias`__</span></a>. Se você estiver familiarizado com a escrita de testes, você também pode olhar para a lista de <a href=\"#id14\"><span class=\"problematic\" id=\"id25\">`tickets simples que precisam de testes`__</span></a>. Apenas lembre-se de seguir as orientações sobre a reivindicação de bilhetes que foram mencionados no link para a documentação do Django em <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/writing-code/submitting-patches/\"><span class=\"doc\">reivindicar tickets e submeter patches</span></a>.</p>\n</section>\n<section id=\"what-s-next-after-creating-a-pull-request\">\n<h3>O que vem depois de criar um pull request?<a class=\"heading-anchor\" href=\"#what-s-next-after-creating-a-pull-request\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>After a ticket has a patch, it needs to be reviewed by a second set of eyes.\nAfter submitting a pull request, update the ticket metadata by setting the\nflags on the ticket to say “has patch”, “doesn’t need tests”, etc, so others\ncan find it for review. Contributing doesn’t necessarily always mean writing a\npatch from scratch. Reviewing existing patches is also a very helpful\ncontribution. See <a class=\"reference internal\" href=\"/pt-br/1.10/internals/contributing/triaging-tickets/\"><span class=\"doc\">Triangulando tickets</span></a> for details.</p>\n</section>\n</section>","rootId":"writing-your-first-patch-for-django","toc":[{"title":"Introdução","anchor":"introduction","children":[{"title":"Para quem se destina este tutorial?","anchor":"who-s-this-tutorial-for","children":[]},{"title":"O que este tutorial cobre?","anchor":"what-does-this-tutorial-cover","children":[]}]},{"title":"Código de Conduta","anchor":"code-of-conduct","children":[]},{"title":"Instalando Git","anchor":"installing-git","children":[]},{"title":"Obtendo uma cópia da versão de desenvolvimento do Django","anchor":"getting-a-copy-of-django-s-development-version","children":[]},{"title":"Revertendo para uma revisão anterior do Django","anchor":"rolling-back-to-a-previous-revision-of-django","children":[]},{"title":"Executando a suíte de testes do Django pela primeira vez","anchor":"running-django-s-test-suite-for-the-first-time","children":[]},{"title":"Creating a branch for your patch","anchor":"creating-a-branch-for-your-patch","children":[]},{"title":"Escrevendo alguns testes para o seu ticket","anchor":"writing-some-tests-for-your-ticket","children":[{"title":"Escrevendo alguns testes para o ticket #24788","anchor":"writing-some-tests-for-ticket-24788","children":[]},{"title":"Executando o seu novo teste","anchor":"running-your-new-test","children":[]}]},{"title":"Escrevendo o código para o seu ticket","anchor":"writing-the-code-for-your-ticket","children":[{"title":"Escrevendo o código para o ticket #24788","anchor":"writing-the-code-for-ticket-24788","children":[]},{"title":"Verificando se o seu teste passa agora","anchor":"verifying-your-test-now-passes","children":[]}]},{"title":"Executando a suíte de testes do Django pela segunda vez","anchor":"running-django-s-test-suite-for-the-second-time","children":[]},{"title":"Escrevendo Documentação","anchor":"writing-documentation","children":[]},{"title":"Visualizando suas alterações","anchor":"previewing-your-changes","children":[]},{"title":"Cometendo as alterações no patch","anchor":"committing-the-changes-in-the-patch","children":[]},{"title":"Pushing the commit and making a pull request","anchor":"pushing-the-commit-and-making-a-pull-request","children":[]},{"title":"Próximos passos","anchor":"next-steps","children":[{"title":"Mais informações para novos contribuidores","anchor":"more-information-for-new-contributors","children":[]},{"title":"Encontrando o seu primeiro ticket","anchor":"finding-your-first-real-ticket","children":[]},{"title":"O que vem depois de criar um pull request?","anchor":"what-s-next-after-creating-a-pull-request","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Introdução","url":"/pt-br/1.10/intro/"}],"prev":{"docname":"intro/whatsnext","title":"O que ler a seguir","url":"/pt-br/1.10/intro/whatsnext/"},"next":{"docname":"topics/index","title":"Usando o Django","url":"/pt-br/1.10/topics/"},"formats":{"html":"/pt-br/1.10/intro/contributing/","markdown":"/pt-br/1.10/intro/contributing.md","json":"/pt-br/1.10/intro/contributing.json"},"source":"https://github.com/django/django/blob/stable/1.10.x/docs/intro/contributing.txt","official":"https://docs.djangoproject.com/pt-br/1.10/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","fr","ja","id","pt-br","es","el","pl"]}