{"title":"Escrevendo seu primeiro patch para Django","version":"1.9","locale":"pt-br","docname":"intro/contributing","url":"/pt-br/1.9/intro/contributing/","canonical":"https://djangodocs.dev/pt-br/1.9/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.9/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.9/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>Gerando um arquivo de patch para as suas alterações.</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.9/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 é copiar o código fonte. Na linha de comando use o comando “cd” para navegar até o diretório que você deseja manter a sua cópia local do 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>https://github.com/django/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>Agora estamos prontos para executar a suite de testes. Se você estiver usando o GNU/Linux, Mac OS X ou alguma outra distro 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>Testes pulados são tipicamente devido à falta de bibliotecas externas necessárias para executar o teste; veja :ref:’running-unit-tests-dependencies’ para uma lista de dependencias e certifique-se de instalar qualquer um para testes relacionados com as mudanças que está fazendo. (Não necessitamos nenhum para este tutorial).</p>\n<p>Once the tests complete, you should be greeted with a message informing you\nwhether the test suite passed or failed. Since you haven’t yet made any changes\nto Django’s code, the entire test suite <strong>should</strong> pass. If you get failures or\nerrors make sure you’ve followed all of the previous steps properly. See\n<a class=\"reference internal\" href=\"/pt-br/1.9/internals/contributing/writing-code/unit-tests/#running-unit-tests\"><span class=\"std std-ref\">Rodando os testes unitários</span></a> for more information. If you’re using Python 3.5+,\nthere will be a couple failures related to deprecation warnings that you can\nignore. These failures have since been fixed in 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.9/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=\"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.9/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>After reading those, if you want something a little meatier to sink\nyour teeth into, there’s always the Python <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> documentation.</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.9/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=\"generating-a-patch-for-your-changes\">\n<h2>Criando um patch para as suas alterações<a class=\"heading-anchor\" href=\"#generating-a-patch-for-your-changes\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Agora é hora de gerar um arquivo de “patch” que pode ser feito o upload no Trac ou aplicado em outra cópia do Django. Para dar uma olhada no conteúdo do seu “patch”, execute 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>diff\n</code></pre></div>\n<p>Isso mostrará as diferenças entre sua cópia corrente do Django (com suas modificações) e a revisão que inicialmente você realizou check out , anteriormente no tutorial.</p>\n<p>Uma vez que tenha terminado de olhar o conteúdo do seu “patch”, pressione a tecla <code class=\"docutils literal notranslate\"><span class=\"pre\">q</span></code> para retornar a linha de comando. Se o conteúdo do “patch” estiver ok, pode rodar o seguinte comando para alvar o arquivo de “patch” no seu diretório de trabalho corrente.</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<span class=\"w\"> </span>&gt;<span class=\"w\"> </span><span class=\"m\">24788</span>.diff\n</code></pre></div>\n<p>Agora você deve ter um arquivo chamado <code class=\"docutils literal notranslate\"><span class=\"pre\">24788.diff</span></code> no diretório raiz do Django. Este arquivo de patch contém todas as suas modificações e deve se assemelhar a isto:</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</section>\n<section id=\"so-what-do-i-do-next\">\n<h2>Então,  o que faço a seguir?<a class=\"heading-anchor\" href=\"#so-what-do-i-do-next\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Parabéns, você gerou seu primeiro patch do Django! Agora que você adquiriu esta experiência você pode colocar essas habilidades em  prática ajudando a melhorar a base de código do Django. Gerar patches e anexá-los a tíquetes do Trac é útil, no entanto, como estamos utilizando git - adotar um <a class=\"reference internal\" href=\"/pt-br/1.9/internals/contributing/writing-code/working-with-git/\"><span class=\"doc\">fluxo de trabalho orientado a git</span></a> é mais recomendável.</p>\n<p>Visto que nós nunca fizemos commit das nossas modificações locais, execute o seguinte para ter seu branch do git de volta a um bom ponto de partida:</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>reset<span class=\"w\"> </span>--hard<span class=\"w\"> </span>HEAD\n<span class=\"gp\">$ </span>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>master\n</code></pre></div>\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.9/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.9/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.9/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.9/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\">\n<h3>E agora?<a class=\"heading-anchor\" href=\"#what-s-next\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Depois de um ticket ter um “patch”, é necessário que este seja revisado por um segundo olho. Depois de fazer o upload de um patch ou submeter um “pull request”, tenha certeza de atualizar o metadado do ticket para “has patch”,  “doesn’t need tests”, etc, então outros podem econtrá-lo para revisar. Contribuir nem sempre quer dizer escrever um “patch” do início. Revisar “patches” existentes é também uma contribuição  que ajuda muito. Veja <a class=\"reference internal\" href=\"/pt-br/1.9/internals/contributing/triaging-tickets/\"><span class=\"doc\">Triangulando tickets</span></a> para detalhes.</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":"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":"Criando um patch para as suas alterações","anchor":"generating-a-patch-for-your-changes","children":[]},{"title":"Então,  o que faço a seguir?","anchor":"so-what-do-i-do-next","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":"E agora?","anchor":"what-s-next","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Introdução","url":"/pt-br/1.9/intro/"}],"prev":{"docname":"intro/whatsnext","title":"O que ler a seguir","url":"/pt-br/1.9/intro/whatsnext/"},"next":{"docname":"topics/index","title":"Using Django","url":"/pt-br/1.9/topics/"},"formats":{"html":"/pt-br/1.9/intro/contributing/","markdown":"/pt-br/1.9/intro/contributing.md","json":"/pt-br/1.9/intro/contributing.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/intro/contributing.txt","official":"https://docs.djangoproject.com/pt-br/1.9/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"]}