{"title":"Escrevendo sua primeira aplicação Django, parte 2","version":"2.2","locale":"pt-br","docname":"intro/tutorial02","url":"/pt-br/2.2/intro/tutorial02/","canonical":"https://djangodocs.dev/pt-br/2.2/intro/tutorial02/","summary":"Este tutorial inicia onde Tutorial 1 termina. Iremos configurar um banco de dados, criar seu primeiro modelo, e ter uma rápida introdução ao admin site do…","html":"<h1>Escrevendo sua primeira aplicação Django, parte 2<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-2\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Este tutorial inicia onde <a class=\"reference internal\" href=\"/pt-br/2.2/intro/tutorial01/\"><span class=\"doc\">Tutorial 1</span></a> termina. Iremos configurar um banco de dados, criar seu primeiro modelo, e ter uma rápida introdução ao admin site do Django automaticamente gerado.</p>\n<section id=\"database-setup\">\n<h2>Configuração do banco de dados<a class=\"heading-anchor\" href=\"#database-setup\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Agora, abra o <code class=\"file docutils literal notranslate\">mysite/settings.py</code>. Ele é um módulo normal do Python com variáveis de módulo representando as configurações do Django.</p>\n<p>Por padrão, a configuração usa o SQLite. Se você é novo com banco de dados, ou se estiver somente interessado em experimentar o Django, esta á maneira mais simples. SQLite está incluso no Python, de modo que você não precisa instalar nada a mais para ter o banco de dados. Contudo, quando iniciar seu primeiro projeto real, talvez queira usar um banco de dados mais escalável como o PostgreSQL, para evitar problemas com a troca do banco de dados no caminho.</p>\n<p>Se você quiser usar outro banco de dados, instale o de acordo <a class=\"reference internal\" href=\"/pt-br/2.2/topics/install/#database-installation\"><span class=\"std std-ref\">database bindings</span></a> e altere os seguinte parâmetros no item <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a> <code class=\"docutils literal notranslate\">'default'</code> de acordo com o seu banco de dados.</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-DATABASE-ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\">ENGINE</code></a> – ou mesmo  <code class=\"docutils literal notranslate\">'django.db.backends.sqlite3'</code>, <code class=\"docutils literal notranslate\">'django.db.backends.postgresql'</code>, <code class=\"docutils literal notranslate\">'django.db.backends.mysql'</code>, ou <code class=\"docutils literal notranslate\">'django.db.backends.oracle'</code>. Outros backends são <a class=\"reference internal\" href=\"/pt-br/2.2/ref/databases/#third-party-notes\"><span class=\"std std-ref\">also available</span></a>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\">NAME</code></a> – O nome do seu banco de dados, se você estiver usando SQLite, o banco de dados será uma arquivo no seu computador; neste caso, <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\">NAME</code></a> deve ser o caminho completo, incluindo o nome, para este arquivo. O valor padrão <code class=\"docutils literal notranslate\">os.path.join(BASE_DIR, 'db.sqlite3')</code>, ira criar este arquivo no diretorio do seu projeto.</p></li>\n</ul>\n<p>Caso não use o SQLite como banco de dados, configurações adicionais como <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\">USER</code></a>, <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\">PASSWORD</code></a>, e <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\">HOST</code></a> deverão ser adicionadas. Para mais detalhes, veja a referência na documentação para <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a>.</p>\n<aside class=\"admonition-for-databases-other-than-sqlite admonition\" role=\"note\">\n<p class=\"admonition-title\">Para fins diferentes da base de dados SQLite</p>\n<p>Caso use um banco de dados além do SQLite, tenha certeza que o banco de dados foi criado até este ponto. Faça isso com “<code class=\"docutils literal notranslate\">CREATE DATABASE database_name;</code>” dentro do prompt interativo do seu banco de dados.</p>\n<p>Também se certifique que o “database user” indicado em <code class=\"file docutils literal notranslate\">mysite/settings.py</code> tenha a permissão  “create database”. Isso permite a criação automática de  <a class=\"reference internal\" href=\"/pt-br/2.2/topics/testing/overview/#the-test-database\"><span class=\"std std-ref\">test database</span></a> o qual será necessário e um tutorial mais adiante.</p>\n<p>Se você está utilizando SQLite você não precisa criar nada de antemão - o arquivo do banco de dados será criado automaticamente quando ele for necessário.</p>\n</aside>\n<p>Enquanto estiver editando <code class=\"file docutils literal notranslate\">mysite/settings.py</code>, mude <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_ZONE</code></a> para o seu fuso horário.</p>\n<p>Também observe a configuração do\n<a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> na parte superior do arquivo. Ela possui os nomes de todas as aplicações Django ativas para essa instância do Django. Aplicações podem ser usadas em múltiplos projetos, e você pode empacotá-las e distribuí-las para uso por outros em seus projetos.</p>\n<p>Por padrão, o <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> contém as seguintes aplicações, que vêm com o Django:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/pt-br/2.2/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admin</code></a> – O admin site. Irá usar isso em breve.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/2.2/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.auth</code></a> – Um sistema de autenticação.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/2.2/ref/contrib/contenttypes/#module-django.contrib.contenttypes\" title=\"django.contrib.contenttypes: Provides generic interface to installed models.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.contenttypes</code></a> – Um framework para tipos de conteúdo.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/2.2/topics/http/sessions/#module-django.contrib.sessions\" title=\"django.contrib.sessions: Provides session management for Django projects.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.sessions</code></a> – Um framework de sessão.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/2.2/ref/contrib/messages/#module-django.contrib.messages\" title=\"django.contrib.messages: Provides cookie- and session-based temporary message storage.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.messages</code></a> – Um framework de envio de mensagem.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/2.2/ref/contrib/staticfiles/#module-django.contrib.staticfiles\" title=\"django.contrib.staticfiles: An app for handling static files.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.staticfiles</code></a> – Um framework para gerenciamento de arquivos estáticos.</p></li>\n</ul>\n<p>Estas aplicações são incluídas por padrão como uma conveniência para o caso comum.</p>\n<p>Algumas dessas aplicações fazem uso de pelo menos uma tabela no banco de dados, assim sendo, nós precisamos criar as tabelas no banco de dados antes que possamos\nutilizá-las. Para isso rode o seguinte comando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py migrate\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py migrate\n</code></pre></div></div></div>\n<p>O comando <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> verifica a configuração em <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> e cria qualquer tabela do banco de dados necessária de acordo com as configurações do banco de dados no seu arquivo <code class=\"file docutils literal notranslate\">mysite/settings.py</code> e as migrações que venham com a app (cobriremos isso mais tarde). É mostrado uma mensagem para cada migração que foi aplicada. Se lhe interessar, execute cliente de linha de comando para seu banco de dados e dgite <code class=\"docutils literal notranslate\">\\dt</code> (PostgreSQL), <code class=\"docutils literal notranslate\">SHOW TABLES;</code> (MySQL), <code class=\"docutils literal notranslate\">.schema</code> (SQLite), ou <code class=\"docutils literal notranslate\">SELECT TABLE_NAME FROM USER_TABLES;</code> (Oracle) para mostrar as tabelas mostradas pelo Django.</p>\n<aside class=\"admonition-for-the-minimalists admonition\" role=\"note\">\n<p class=\"admonition-title\">Para os minimalistas</p>\n<p>Como dissemos acima, as aplicações padrão são incluídas para casos comuns, mas nem todo mundo precisa delas. Se você não precisa de nenhuma delas, sinta-se livre para comentar ou deletar a(s) linha(s) apropriada(s) do   <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> antes de rodar o <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a>. O comando <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> irá executar as migrações apenas para as aplicações que estiverem no <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>.</p>\n</aside>\n</section>\n<section id=\"creating-models\">\n<span id=\"id1\"></span><h2>Criando modelos<a class=\"heading-anchor\" href=\"#creating-models\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Agora vamos definir seus modelos – essencialmente, o layout do banco de dados, com metadados adicionais.</p>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">Filosofia</p>\n<p>Um model é a única e definitiva fonte de verdade sobre seus dados. Ele contém os campos essenciais e os comportamentos para os dados que você estiver   armazenando. O Django segue o <a class=\"reference internal\" href=\"/pt-br/2.2/misc/design-philosophies/#dry\"><span class=\"std std-ref\">princípio DRY</span></a>. O objetivo é definir seu modelo de dados em um único local e automaticamente derivar coisas a partir dele.</p>\n<p>Isso inclui as migrações - ao contrário em Ruby on Rails, por exemplo, as migrações são inteiramente derivada de seu arquivo de modelos, e são essencialmente apenas uma história que o Django pode avançar para atualizar o esquema de banco de dados para coincidir com seus modelos atuais.</p>\n</aside>\n<p>Em nossa simples aplicação de enquete, nós iremos criar dois modelos: <code class=\"docutils literal notranslate\">Question</code> e <code class=\"docutils literal notranslate\">Choice</code>. Uma <code class=\"docutils literal notranslate\">Question</code> tem uma pergunta e uma data de publicação. Uma <code class=\"docutils literal notranslate\">Choice</code>  tem dois campos: o texto da escolha e um totalizador de votos. Cada <code class=\"docutils literal notranslate\">Choice</code> é associada a uma <code class=\"docutils literal notranslate\">Question</code>.</p>\n<p>Esses conceitos são representados por simples classes Python. Edite o arquivo <code class=\"file docutils literal notranslate\">polls/models.py</code> de modo que fique assim:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/models.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Question</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    question_text <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    pub_date <span class=\"o\">=</span> models<span class=\"o\">.</span>DateTimeField<span class=\"p\">(</span><span class=\"s1\">&#39;date published&#39;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Choice</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    question <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>Question<span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    choice_text <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    votes <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>O código é auto-explicativo. Cada model é representado por uma classe derivada da classe <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">django.db.models.Model</code></a>. Cada model possui um número de atributos de classe, as quais por sua vez representam campos de banco de dados no model.</p>\n<p>Cada campo é representado por uma instância de uma classe <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> – e.g., <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a> para campos do tipo caractere e <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a> para\ndata/hora. Isto diz ao Django qual tipo de dado cada campo contém.</p>\n<p>O nome de cada instância <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> (e.g. <code class=\"docutils literal notranslate\">question_text</code> ou <code class=\"docutils literal notranslate\">pub_date</code>) é o nome do campo, em formato amigável para a máquina. Você irá usar este valor no seu código Python, e seu banco de dados irá usá-lo como nome de coluna.</p>\n<p>Você pode usar um argumento opcional na primeira posição de um <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> para designar um nome legível por seres humanos o qual será usado em uma série de partes introspectivas do Django, e também servirá como documentação. Se esse argumento não for fornecido, o Django utilizará o nome legível pela máquina. Neste exemplo nós definimos um nome legível por humanos apenas para <code class=\"docutils literal notranslate\">Question.pub_date</code>. Para todos os outros campos neste model, o nome legível pela máquina será utilizado como nome legível por humanos.</p>\n<p>Algumas classes de <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> possuem elementos obrigatórios.  O <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>, por exemplo, requer que você informe a ele um <code class=\"xref py py-attr docutils literal notranslate\">max_length</code> que é usado não apenas no esquema do banco de dados, mas na validação, como nós veremos em breve.</p>\n<p>Um <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> pode ter varios argumentos opcionais; neste caso, nos definimos <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.Field.default\" title=\"django.db.models.Field.default\"><code class=\"xref py py-attr docutils literal notranslate\">default</code></a> o valor de <code class=\"docutils literal notranslate\">votes</code> para 0.</p>\n<p>Finalmente, note que uma relação foi criada, usando <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>. Isso dia ao Django que cada <code class=\"docutils literal notranslate\">Choice</code> está relacionada a uma única <code class=\"docutils literal notranslate\">Question</code>. O Django suporta todos os relacionamentos comuns de um banco de dados: muitos-para-um, muitos-para-muitos e um-para-um</p>\n</section>\n<section id=\"activating-models\">\n<h2>Ativando modelos<a class=\"heading-anchor\" href=\"#activating-models\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Aquela pequena parte do model fornece ao Django muita informação. Com ela o Django é capaz de:</p>\n<ul class=\"simple\">\n<li><p>Criar um esquema de banco de dados (instruções <code class=\"docutils literal notranslate\">CREATE TABLE</code>) para a aplicação.</p></li>\n<li><p>Criar uma API de acesso a banco de dados para acessar objetos <code class=\"docutils literal notranslate\">Question</code> e <code class=\"docutils literal notranslate\">Choice</code>.</p></li>\n</ul>\n<p>Mas primeiro nós precisamos dizer ao nosso projeto que a aplicação <code class=\"docutils literal notranslate\">polls</code> está instalada.</p>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">Filosofia</p>\n<p>Aplicações Django são “plugáveis”: Você pode usar uma aplicação em múltiplos projetos, e você pode distribuir aplicações, porque elas não precisam ser atreladas a uma determinada instalação do Django.</p>\n</aside>\n<p>Para incluir a aplicação no nosso projeto, precisamos adicionar a referência à classe de configuração da aplicação na definição do <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> . A classe <code class=\"docutils literal notranslate\">PollsConfig``está no arquivo&#160; :file:`polls/apps.py`, então seu caminha pontuado é ``'polls.apps.PollsConfig'</code>. Edite o arquivo <code class=\"file docutils literal notranslate\">mysite/settings.py</code> e adicione aquele caminho com notação de ponto a definição do <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>. Ficará parecido como aqui:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">mysite/settings.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code>INSTALLED_APPS <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s1\">&#39;polls.apps.PollsConfig&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.admin&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.auth&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.contenttypes&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.sessions&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.messages&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.staticfiles&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Agora o Django sabe que deve incluir a aplicação <code class=\"docutils literal notranslate\">polls</code>. Vamos rodar outro comando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py makemigrations polls\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py makemigrations polls\n</code></pre></div></div></div>\n<p>Você deverá ver algo similar ao seguinte:</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>Migrations for &#39;polls&#39;:\n  polls/migrations/0001_initial.py:\n    - Create model Choice\n    - Create model Question\n    - Add field question to choice\n</code></pre></div>\n<p>Ao executar <code class=\"docutils literal notranslate\">makemigrations</code>, você está dizendo Django que você fez algumas mudanças em seus modelos (neste caso, você fez novas modificações) e que você gostaria que as alterações sejam armazenadas como uma <em>migração</em>.</p>\n<p>As migrações são como o Django armazena as alterações nos seus modelos (e, portanto, seu esquema de banco de dados) - eles são apenas arquivos no disco. Você pode ler a migração para o novo modelo, se quiser; é o arquivo <code class=\"docutils literal notranslate\">polls/migrations/0001_initial.py</code>. Não se preocupe, você não precisa lê-los cada vez Django cria um, mas eles são projetados para ser editável no caso de você queira ajustar manualmente como Django muda as coisas.</p>\n<p>Existe um comando que vai rodar as migrações para você e gerenciar o esquema do banco de dados automaticamente -  que é chamado <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a>, e nós vamos chegar a ele em um momento - mas primeiro vamos ver qual SQL está migração vai rodar. O comando <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">sqlmigrate</code></a> recebe o nome da migração e o seu SQL.</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-2-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py sqlmigrate polls <span class=\"m\">0001</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-2-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py sqlmigrate polls 0001\n</code></pre></div></div></div>\n<p>Você deve ver algo semelhante ao seguinte (reformatamos para facilitar a leitura):</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"k\">BEGIN</span><span class=\"p\">;</span>\n<span class=\"c1\">--</span>\n<span class=\"c1\">-- Create model Choice</span>\n<span class=\"c1\">--</span>\n<span class=\"k\">CREATE</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"p\">(</span>\n    <span class=\"ss\">&quot;id&quot;</span> <span class=\"nb\">serial</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span> <span class=\"k\">PRIMARY</span> <span class=\"k\">KEY</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;choice_text&quot;</span> <span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">200</span><span class=\"p\">)</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;votes&quot;</span> <span class=\"nb\">integer</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span>\n<span class=\"p\">);</span>\n<span class=\"c1\">--</span>\n<span class=\"c1\">-- Create model Question</span>\n<span class=\"c1\">--</span>\n<span class=\"k\">CREATE</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_question&quot;</span> <span class=\"p\">(</span>\n    <span class=\"ss\">&quot;id&quot;</span> <span class=\"nb\">serial</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span> <span class=\"k\">PRIMARY</span> <span class=\"k\">KEY</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;question_text&quot;</span> <span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">200</span><span class=\"p\">)</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span><span class=\"p\">,</span>\n    <span class=\"ss\">&quot;pub_date&quot;</span> <span class=\"k\">timestamp</span> <span class=\"k\">with</span> <span class=\"k\">time</span> <span class=\"k\">zone</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span>\n<span class=\"p\">);</span>\n<span class=\"c1\">--</span>\n<span class=\"c1\">-- Add field question to choice</span>\n<span class=\"c1\">--</span>\n<span class=\"k\">ALTER</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"k\">ADD</span> <span class=\"k\">COLUMN</span> <span class=\"ss\">&quot;question_id&quot;</span> <span class=\"nb\">integer</span> <span class=\"k\">NOT</span> <span class=\"k\">NULL</span><span class=\"p\">;</span>\n<span class=\"k\">ALTER</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"k\">ALTER</span> <span class=\"k\">COLUMN</span> <span class=\"ss\">&quot;question_id&quot;</span> <span class=\"k\">DROP</span> <span class=\"k\">DEFAULT</span><span class=\"p\">;</span>\n<span class=\"k\">CREATE</span> <span class=\"k\">INDEX</span> <span class=\"ss\">&quot;polls_choice_7aa0f6ee&quot;</span> <span class=\"k\">ON</span> <span class=\"ss\">&quot;polls_choice&quot;</span> <span class=\"p\">(</span><span class=\"ss\">&quot;question_id&quot;</span><span class=\"p\">);</span>\n<span class=\"k\">ALTER</span> <span class=\"k\">TABLE</span> <span class=\"ss\">&quot;polls_choice&quot;</span>\n  <span class=\"k\">ADD</span> <span class=\"k\">CONSTRAINT</span> <span class=\"ss\">&quot;polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id&quot;</span>\n    <span class=\"k\">FOREIGN</span> <span class=\"k\">KEY</span> <span class=\"p\">(</span><span class=\"ss\">&quot;question_id&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">REFERENCES</span> <span class=\"ss\">&quot;polls_question&quot;</span> <span class=\"p\">(</span><span class=\"ss\">&quot;id&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">DEFERRABLE</span> <span class=\"k\">INITIALLY</span> <span class=\"k\">DEFERRED</span><span class=\"p\">;</span>\n\n<span class=\"k\">COMMIT</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Note o seguinte:</p>\n<ul class=\"simple\">\n<li><p>A saída exata irá variar dependendo do banco de dados que você está utilizando.</p></li>\n<li><p>Os nomes das tabelas são gerados automaticamente combinando o nome da aplicação (<code class=\"docutils literal notranslate\">polls</code>) e o nome em minúsculas do model – <code class=\"docutils literal notranslate\">question</code> e <code class=\"docutils literal notranslate\">choice</code>. (Você pode alterar esse comportamento.)</p></li>\n<li><p>Chaves primárias (IDs) são adicionadas automaticamente. (Você também pode modificar isso.)</p></li>\n<li><p>Por convenção, o Django adiciona <code class=\"docutils literal notranslate\">&quot;_id&quot;</code> ao nome do campo de uma chave estrangeira. (Sim, você pode alterar isso, como quiser.)</p></li>\n<li><p>O relacionamento da chave estrangeira é feito explicitamente por uma instrução <code class=\"docutils literal notranslate\">FOREIGN KEY</code>. Não se preocupe sobre partes <code class=\"docutils literal notranslate\">DEFERRABLE</code>; Está apenas instruindo o PostgreSQL para não forçar a criação da chave estrangeira até o fim da transação.</p></li>\n<li><p>Isto é atrelado ao banco que você está usando, então a utilização de campos específicos do banco de dados como <code class=\"docutils literal notranslate\">auto_increment</code> (MySQL), <code class=\"docutils literal notranslate\">serial</code> (PostgreSQL), ou <code class=\"docutils literal notranslate\">integer primary key</code> (SQLite) é feita para você automaticamente. O mesmo ocorre com as aspas dos nomes de campos – e.g., usando aspas duplas ou aspas simples.</p></li>\n<li><p>O comando <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">sqlmigrate</code></a> na realidade não roda o SQL no seu banco de dados - ele apenas o exibe na tela para que você saiba qual SQL o Django acha que é necessário. É útil para verificar o que Django vai fazer ou se você tem administradores de bancos de dados que necessitam dos scripts SQL para mudanças.</p></li>\n</ul>\n<p>Se você tiver interesse, você pode rodar <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/#django-admin-check\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py check</code></a>; Ele checa por problemas no seu projeto sem criar migrations ou tocar seu banco de dados.</p>\n<p>Agora rode o <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> novamente para criar essas tabelas dos modelos no seu banco de dados:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-3-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py migrate\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Apply all migrations: admin, auth, contenttypes, polls, sessions</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Rendering model states... DONE</span>\n<span class=\"go\">  Applying polls.0001_initial... OK</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-3-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py migrate\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Apply all migrations: admin, auth, contenttypes, polls, sessions</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  Rendering model states... DONE</span>\n<span class=\"go\">  Applying polls.0001_initial... OK</span>\n</code></pre></div></div></div>\n<p>O comando <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> pega todas as migrações que ainda não foram aplicadas (Django rastreia quais foram aplicadas usando uma tabela especial em seu banco de dados chamada <code class=\"docutils literal notranslate\">django_migrations</code>) e aplica elas contra seu banco de dados - essencialmente, sincronizando as alterações feitas aos seus modelos com o esquema no banco de dados.</p>\n<p>Migrações são muito poderosas e permitem que você altere seus modelos ao longo do tempo, à medida que desenvolve o seu projeto, sem a necessidade de remover o seu banco de dados ou tabelas e criar de novo - ele é especializado em atualizar seu banco de dados ao vivo, sem perda de dados. Nós vamos cobri-los com mais profundidade em uma parte posterior do tutorial, mas para agora, lembre-se deste guia de três passos para fazer mudanças nos seus modelos:</p>\n<ul class=\"simple\">\n<li><p>Mude seus modelos (em <code class=\"docutils literal notranslate\">models.py</code>).</p></li>\n<li><p>Rode <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py makemigrations</code></a> para criar migrações para suas modificações</p></li>\n<li><p>Rode <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">python manage.py migrate</code></a> para aplicar suas modificações no banco de dados.</p></li>\n</ul>\n<p>The reason that there are separate commands to make and apply migrations is\nbecause you’ll commit migrations to your version control system and ship them\nwith your app; they not only make your development easier, they’re also\nusable by other developers and in production.</p>\n<p>Leia a <a class=\"reference internal\" href=\"/pt-br/2.2/ref/django-admin/\"><span class=\"doc\">documentação do django-admin</span></a> para informações completas sobre o que o utilitário <code class=\"docutils literal notranslate\">manage.py</code> pode fazer.</p>\n</section>\n<section id=\"playing-with-the-api\">\n<h2>Brincando com a API<a class=\"heading-anchor\" href=\"#playing-with-the-api\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Agora vamos dar uma passada no shell interativo do Python e brincar um pouco com a API livre que o Django dá a você. Para invocar o shell do Python, use esse comando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-4-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py shell\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-4-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py shell\n</code></pre></div></div></div>\n<p>Nós usaremos isso em vez de simplesmente digitar “python”, porque o <code class=\"file docutils literal notranslate\">manage.py</code> configura a variável de ambiente <code class=\"docutils literal notranslate\">DJANGO_SETTINGS_MODULE</code>, O que da ao Django o caminho de importação Python do arquivo <code class=\"file docutils literal notranslate\">mysite/settings.py</code>.</p>\n<p>Assim que você estiver no shell, explore a <a class=\"reference internal\" href=\"/pt-br/2.2/topics/db/queries/\"><span class=\"doc\">API de banco de dados</span></a>:</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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">polls.models</span> <span class=\"kn\">import</span> Choice<span class=\"p\">,</span> Question  <span class=\"c1\"># Import the model classes we just wrote.</span>\n\n<span class=\"go\"># No questions are in the system yet.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n\n<span class=\"go\"># Create a new Question.</span>\n<span class=\"go\"># Support for time zones is enabled in the default settings file, so</span>\n<span class=\"go\"># Django expects a datetime with tzinfo for pub_date. Use timezone.now()</span>\n<span class=\"go\"># instead of datetime.datetime.now() and it will do the right thing.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Question<span class=\"p\">(</span>question_text<span class=\"o\">=</span><span class=\"s2\">&quot;What&#39;s new?&quot;</span><span class=\"p\">,</span> pub_date<span class=\"o\">=</span>timezone<span class=\"o\">.</span>now<span class=\"p\">())</span>\n\n<span class=\"go\"># Save the object into the database. You have to call save() explicitly.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"go\"># Now it has an ID.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>id\n<span class=\"go\">1</span>\n\n<span class=\"go\"># Access model field values via Python attributes.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>question_text\n<span class=\"go\">&quot;What&#39;s new?&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>pub_date\n<span class=\"go\">datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=&lt;UTC&gt;)</span>\n\n<span class=\"go\"># Change values by changing the attributes, then calling save().</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>question_text <span class=\"o\">=</span> <span class=\"s2\">&quot;What&#39;s up?&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"go\"># objects.all() displays all the questions in the database.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: Question object (1)&gt;]&gt;</span>\n</code></pre></div>\n<p>Wait a minute. <code class=\"docutils literal notranslate\">&lt;Question: Question object (1)&gt;</code> isn’t a helpful\nrepresentation of this object. Let’s fix that by editing the <code class=\"docutils literal notranslate\">Question</code> model\n(in the <code class=\"docutils literal notranslate\">polls/models.py</code> file) and adding a\n<a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/instances/#django.db.models.Model.__str__\" title=\"django.db.models.Model.__str__\"><code class=\"xref py py-meth docutils literal notranslate\">__str__()</code></a> method to both <code class=\"docutils literal notranslate\">Question</code> and\n<code class=\"docutils literal notranslate\">Choice</code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/models.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">Question</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>question_text\n\n<span class=\"k\">class</span> <span class=\"nc\">Choice</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>choice_text\n</code></pre></figure>\n<p>É importante adicionar métodos <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/instances/#django.db.models.Model.__str__\" title=\"django.db.models.Model.__str__\"><code class=\"xref py py-meth docutils literal notranslate\">__str__()</code></a> aos seus models, não apenas para sua própria conveniência quando estiver lidando com o prompt interativo, mas também porque representações de objetos são usadas por todo projeto gerado automaticamente pelo Django.</p>\n<p id=\"tutorial02-import-timezone\">Vamos também adicionar um método personalizado a este modelo:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/models.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">import</span> <span class=\"nn\">datetime</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Question</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">def</span> <span class=\"nf\">was_published_recently</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>pub_date <span class=\"o\">&gt;=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span> <span class=\"o\">-</span> datetime<span class=\"o\">.</span>timedelta<span class=\"p\">(</span>days<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Note a adição de <code class=\"docutils literal notranslate\">import datetime</code> e <code class=\"docutils literal notranslate\">from django.utils import timezone</code>,  para referenciar o módulo padrão do Python <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#module-datetime\" title=\"(em Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\">datetime</code></a> e o modulo Django utilitário de fuso horário <a class=\"reference internal\" href=\"/pt-br/2.2/ref/utils/#module-django.utils.timezone\" title=\"django.utils.timezone: Timezone support.\"><code class=\"xref py py-mod docutils literal notranslate\">django.utils.timezone</code></a>, respectivamente. Se você não é familiar com o gerenciamento de fuso horário no  Python, você pode aprender mais no <a class=\"reference internal\" href=\"/pt-br/2.2/topics/i18n/timezones/\"><span class=\"doc\">documentação de suporte a fuso horários</span></a>.</p>\n<p>Salve essas mudanças e vamos iniciar uma nova sessão do shell interativo do Python rodando <code class=\"docutils literal notranslate\">python manage.py shell</code> novamente:</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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">polls.models</span> <span class=\"kn\">import</span> Choice<span class=\"p\">,</span> Question\n\n<span class=\"go\"># Make sure our __str__() addition worked.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n\n<span class=\"go\"># Django provides a rich database lookup API that&#39;s entirely driven by</span>\n<span class=\"go\"># keyword arguments.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>question_text__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;What&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Question: What&#39;s up?&gt;]&gt;</span>\n\n<span class=\"go\"># Get the question that was published this year.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"gp\">&gt;&gt;&gt; </span>current_year <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span><span class=\"o\">.</span>year\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pub_date__year<span class=\"o\">=</span>current_year<span class=\"p\">)</span>\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># Request an ID that doesn&#39;t exist, this will raise an exception.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gt\">Traceback (most recent call last):</span>\n    <span class=\"o\">...</span>\n<span class=\"gr\">DoesNotExist</span>: Question matching query does not exist.\n\n<span class=\"x\"># Lookup by a primary key is the most common case, so Django provides a</span>\n<span class=\"x\"># shortcut for primary-key exact lookups.</span>\n<span class=\"x\"># The following is identical to Question.objects.get(id=1).</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># Make sure our custom method worked.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>was_published_recently<span class=\"p\">()</span>\n<span class=\"go\">True</span>\n\n<span class=\"go\"># Give the Question a couple of Choices. The create call constructs a new</span>\n<span class=\"go\"># Choice object, does the INSERT statement, adds the choice to the set</span>\n<span class=\"go\"># of available choices and returns the new Choice object. Django creates</span>\n<span class=\"go\"># a set to hold the &quot;other side&quot; of a ForeignKey relation</span>\n<span class=\"go\"># (e.g. a question&#39;s choice) which can be accessed via the API.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q <span class=\"o\">=</span> Question<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>pk<span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Display any choices from the related object set -- none so far.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n\n<span class=\"go\"># Create three choices.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s1\">&#39;Not much&#39;</span><span class=\"p\">,</span> votes<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Choice: Not much&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s1\">&#39;The sky&#39;</span><span class=\"p\">,</span> votes<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;Choice: The sky&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c <span class=\"o\">=</span> q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>create<span class=\"p\">(</span>choice_text<span class=\"o\">=</span><span class=\"s1\">&#39;Just hacking again&#39;</span><span class=\"p\">,</span> votes<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n\n<span class=\"go\"># Choice objects have API access to their related Question objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c<span class=\"o\">.</span>question\n<span class=\"go\">&lt;Question: What&#39;s up?&gt;</span>\n\n<span class=\"go\"># And vice versa: Question objects get access to Choice objects.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>all<span class=\"p\">()</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"go\">3</span>\n\n<span class=\"go\"># The API automatically follows relationships as far as you need.</span>\n<span class=\"go\"># Use double underscores to separate relationships.</span>\n<span class=\"go\"># This works as many levels deep as you want; there&#39;s no limit.</span>\n<span class=\"go\"># Find all Choices for any question whose pub_date is in this year</span>\n<span class=\"go\"># (reusing the &#39;current_year&#39; variable we created above).</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Choice<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>question__pub_date__year<span class=\"o\">=</span>current_year<span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Choice: Not much&gt;, &lt;Choice: The sky&gt;, &lt;Choice: Just hacking again&gt;]&gt;</span>\n\n<span class=\"go\"># Let&#39;s delete one of the choices. Use delete() for that.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c <span class=\"o\">=</span> q<span class=\"o\">.</span>choice_set<span class=\"o\">.</span>filter<span class=\"p\">(</span>choice_text__startswith<span class=\"o\">=</span><span class=\"s1\">&#39;Just hacking&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>c<span class=\"o\">.</span>delete<span class=\"p\">()</span>\n</code></pre></div>\n<p>Para mais informações sobre relacionamento de modelos, veja <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/relations/\"><span class=\"doc\">Acessando objetos relacionados</span></a>. Para mais informação em como usar sublinhados duplos para pesquisa usando campos da API, veja <a class=\"reference internal\" href=\"/pt-br/2.2/topics/db/queries/#field-lookups-intro\"><span class=\"std std-ref\">Pesquisa com campos</span></a>. Para um detalhamento completo da API de banco de dados, veja nossa <a class=\"reference internal\" href=\"/pt-br/2.2/topics/db/queries/\"><span class=\"doc\">referência à API de Banco de Dados</span></a>.</p>\n</section>\n<section id=\"introducing-the-django-admin\">\n<h2>Escrevendo sua primeira aplicação Django, parte 7<a class=\"heading-anchor\" href=\"#introducing-the-django-admin\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition-philosophy admonition\" role=\"note\">\n<p class=\"admonition-title\">Filosofia</p>\n<p>Gerar o site de administração para seu time ou clientes para adicionar, alterar, e deletar conteúdo é uma tarefa tediosa que não requer muita criatividade. Por essa razão, o Django automatiza totalmente a criação da interface de admin para os modelos.</p>\n<p>O Django foi desenvolvido em um ambiente de redação, onde havia uma clara separação entre “produtores de conteúdo” e o site “público”. Gerentes de site usam o sistema para adicionar notícias, eventos, resultado de esportes, etc, e o conteúdo é exibido no site público. O Django soluciona o problema de criar uma interface unificada para os administradores editarem o conteúdo.</p>\n<p>A administração não foi desenvolvida necessariamente para ser usada pelos visitantes do site, mas sim pelos gerentes.</p>\n</aside>\n<section id=\"creating-an-admin-user\">\n<h3>Criando um usuário administrador<a class=\"heading-anchor\" href=\"#creating-an-admin-user\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Primeiro temos que criar um usuário que possa acessar o site de administração. Rode o seguinte comando:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-5-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py createsuperuser\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-5-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py createsuperuser\n</code></pre></div></div></div>\n<p>Digite seu nome de usuário desejado e pressione enter.</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>Username: admin\n</code></pre></div>\n<p>Em seguida, será requisitado seu endereço de e-mail desejado:</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>Email address: admin@example.com\n</code></pre></div>\n<p>O último passo é digitar sua senha. Você será solicitado que digite sua senha duas vezes, a segunda vez como uma confirmação da primeira.</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>Password: **********\nPassword (again): *********\nSuperuser created successfully.\n</code></pre></div>\n</section>\n<section id=\"start-the-development-server\">\n<h3>Inicie o servidor de desenvolvimento<a class=\"heading-anchor\" href=\"#start-the-development-server\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>O site de administração vem ativado por padrão. Vamos iniciar o servidor de desenvolvimento e explora-lo.</p>\n<p>Se o servidor não estiver sendo executado, inicie-o da seguinte forma:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-6-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python manage.py runserver\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-6-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver\n</code></pre></div></div></div>\n<p>Agora, abra o navegador de internet e vá para “/admin/” no seu domínio local – ex:, <a class=\"reference external\" href=\"http://127.0.0.1:8000/admin/\">http://127.0.0.1:8000/admin/</a>. Você deverá ver a tela de acesso:</p>\n<img alt=\"Django admin login screen\" src=\"/pt-br/2.2/_images/admin01.png\" />\n<p>Desde que <a class=\"reference internal\" href=\"/pt-br/2.2/topics/i18n/translation/\"><span class=\"doc\">translation</span></a> está habilitado por padrão, a tela de login talvez seja mostrada em sua própria língua, dependendo das configurações do seu browser a se o Django tem tradução para esta língua.</p>\n</section>\n<section id=\"enter-the-admin-site\">\n<h3>Entre no site de administração<a class=\"heading-anchor\" href=\"#enter-the-admin-site\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Agora, tente acessar o sistema com a conta de super usuário que criou no passo anterior.  Você deverá ver a página inicial do site de administração do Django:</p>\n<img alt=\"Django admin index page\" src=\"/pt-br/2.2/_images/admin02.png\" />\n<p>Você deverá ver alguns outros tipos de conteúdos editáveis, incluindo grupos e usuários. Estas  funcionalidades são fornecidas por mod:django.contrib.auth, o framework de autenticação fornecido pelo Django.</p>\n</section>\n<section id=\"make-the-poll-app-modifiable-in-the-admin\">\n<h3>Torne a aplicação de enquetes editável no site de administração<a class=\"heading-anchor\" href=\"#make-the-poll-app-modifiable-in-the-admin\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Mas onde está nossa aplicação de enquete? Ela não está visível na página principal do site de administração.</p>\n<p>Apenas uma coisa a ser feita: Nós temos que dizer para o site de administração que os objetos <code class=\"docutils literal notranslate\">Question</code> possuem uma interface de administração.  Para fazer isto, crie um arquivo chamado <code class=\"file docutils literal notranslate\">polls/admin.py</code>,  e edite para que se pareça com isto:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">polls/admin.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> Question\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Question<span class=\"p\">)</span>\n</code></pre></figure>\n</section>\n<section id=\"explore-the-free-admin-functionality\">\n<h3>Explore a funcionalidade de administração de graça<a class=\"heading-anchor\" href=\"#explore-the-free-admin-functionality\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Agora que nós registramos <code class=\"docutils literal notranslate\">Question</code>, o Django sabe que ela deve ser exibida na página principal do site de administração:</p>\n<img alt=\"Django admin index page, now with polls displayed\" src=\"/pt-br/2.2/_images/admin03t.png\" />\n<p>Clique em “Questions”. Agora cocê está na página “change list” para “questions”. Essa página mostra todas as “questions” em seu banco de dados e lhe deixa escolher uma para alterar. Lá está a pergunta “What’s up?” que criamos anteriormente.</p>\n<img alt=\"Polls change list page\" src=\"/pt-br/2.2/_images/admin04t.png\" />\n<p>Clique na enquete “What’s up?” para editá-la:</p>\n<img alt=\"Editing form for question object\" src=\"/pt-br/2.2/_images/admin05t.png\" />\n<p>Coisas para observar aqui:</p>\n<ul class=\"simple\">\n<li><p>O formulário é gerado automaticamente para o modelo <code class=\"docutils literal notranslate\">Question</code>.</p></li>\n<li><p>Os diferentes tipos de campos (<a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a>, <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>) correspondem aos respectivos widgets HTML de inserção. Cada tipo de campo sabe como se exibir no site de administração do Django.</p></li>\n<li><p>Cada <a class=\"reference internal\" href=\"/pt-br/2.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a> ganha um atalho JavaScript de graça. Datas possuem um atalho “Hoje” e um calendário popup, e horas têm um atalho “Agora” e um conveniente popup com listas de horas utilizadas comumente.</p></li>\n</ul>\n<p>A parte inferior da página fornece uma série de opções:</p>\n<ul class=\"simple\">\n<li><p>Salvar – Salva as alterações e retorna para a pagina lista de modificação para este tipo de objeto.</p></li>\n<li><p>Salvar e continuar editando – Salva as alterações e recarrega a página do site de administração para este objeto.</p></li>\n<li><p>Salvar e adicionar outro – Salva as informações e abre um novo formulário em branco para este tipo de objeto.</p></li>\n<li><p>Deletar – Exibe uma página de confirmação de exclusão.</p></li>\n</ul>\n<p>Se o valor do “Date published” não bate com hora que a questão foi criada em <a class=\"reference internal\" href=\"/pt-br/2.2/intro/tutorial01/\"><span class=\"doc\">Tutorial 1</span></a>, provavelmente quer dizer que foi esquecido de configurar o correto valor da configuração do <a class=\"reference internal\" href=\"/pt-br/2.2/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_ZONE</code></a>. Altere isso, e recarregue a página e verifique se o calor correto aparece.</p>\n<p>Altere a “Data de publicação” clicando nos atalhos “Hoje” e “Agora”. Em seguida, clique em “Salvar e continuar editando.” Então clique em “Histórico” no canto superior direito. Você verá uma página exibindo todas as alterações feitas neste objeto pelo site de administração do Django, com a hora e o nome de usuário da pessoa que fez a alteração:</p>\n<img alt=\"History page for question object\" src=\"/pt-br/2.2/_images/admin06t.png\" />\n<p>Quando estiver confortável com a “API” dos modelos e estiver familiarizado com o “admin site”, leia  <a class=\"reference internal\" href=\"/pt-br/2.2/intro/tutorial03/\"><span class=\"doc\">part 3 of this tutorial</span></a> para aprender sobre como adicionar mais “views”para nossa app “polls”.</p>\n</section>\n</section>","rootId":"writing-your-first-django-app-part-2","toc":[{"title":"Configuração do banco de dados","anchor":"database-setup","children":[]},{"title":"Criando modelos","anchor":"creating-models","children":[]},{"title":"Ativando modelos","anchor":"activating-models","children":[]},{"title":"Brincando com a API","anchor":"playing-with-the-api","children":[]},{"title":"Escrevendo sua primeira aplicação Django, parte 7","anchor":"introducing-the-django-admin","children":[{"title":"Criando um usuário administrador","anchor":"creating-an-admin-user","children":[]},{"title":"Inicie o servidor de desenvolvimento","anchor":"start-the-development-server","children":[]},{"title":"Entre no site de administração","anchor":"enter-the-admin-site","children":[]},{"title":"Torne a aplicação de enquetes editável no site de administração","anchor":"make-the-poll-app-modifiable-in-the-admin","children":[]},{"title":"Explore a funcionalidade de administração de graça","anchor":"explore-the-free-admin-functionality","children":[]}]}],"breadcrumbs":[{"docname":"intro/index","title":"Introdução","url":"/pt-br/2.2/intro/"}],"prev":{"docname":"intro/tutorial01","title":"Escrevendo seu primeiro app Django, parte 1","url":"/pt-br/2.2/intro/tutorial01/"},"next":{"docname":"intro/tutorial03","title":"Escrevendo sua primeira app Django, parte 3","url":"/pt-br/2.2/intro/tutorial03/"},"formats":{"html":"/pt-br/2.2/intro/tutorial02/","markdown":"/pt-br/2.2/intro/tutorial02.md","json":"/pt-br/2.2/intro/tutorial02.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/intro/tutorial02.txt","official":"https://docs.djangoproject.com/pt-br/2.2/intro/tutorial02/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}