{"title":"Django em um relance","version":"4.0","locale":"pt-br","docname":"intro/overview","url":"/pt-br/4.0/intro/overview/","canonical":"https://djangodocs.dev/pt-br/4.0/intro/overview/","summary":"Because Django was developed in a fast-paced newsroom environment, it was designed to make common web development tasks fast and easy. Here’s an informal overview…","html":"<h1>Django em um relance<a class=\"heading-anchor\" href=\"#django-at-a-glance\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Because Django was developed in a fast-paced newsroom environment, it was\ndesigned to make common web development tasks fast and easy. Here’s an informal\noverview of how to write a database-driven web app with Django.</p>\n<p>O objetivo deste documento é dar a você as especificações técnicas necessárias para entender como o Django funciona, mas este texto não pretende ser um tutorial ou uma referência – mas possuímos os dois! Quando você estiver pronto para iniciar um projeto, você pode <a class=\"reference internal\" href=\"/pt-br/4.0/intro/tutorial01/\"><span class=\"doc\">iniciar com o tutorial</span></a> ou <a class=\"reference internal\" href=\"/pt-br/4.0/topics/\"><span class=\"doc\">mergulhar direto em uma documentação mais detalhada</span></a>.</p>\n<section id=\"design-your-model\">\n<h2>Projete o seu model<a class=\"heading-anchor\" href=\"#design-your-model\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Embora você possa usar o Django sem um banco de dados, ele vem com um <a class=\"reference external\" href=\"https://pt.wikipedia.org/wiki/Mapeamento_objeto-relacional\">mapeador objeto-relacional</a> no qual você descreve o leiaute do seu banco de dados em código Python.</p>\n<p>A <a class=\"reference internal\" href=\"/pt-br/4.0/topics/db/models/\"><span class=\"doc\">sintaxe do modelo de dados</span></a> oferece muitas formas ricas de representar seus modelos – portanto, está resolvendo muitos anos de problemas com esquemas de banco de dados. Aqui está um exemplo rápido:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/models.py</span></code></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Reporter</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">full_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">70</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </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><span class=\"n\">full_name</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">content</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n    <span class=\"n\">reporter</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Reporter</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </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><span class=\"n\">headline</span>\n</code></pre></figure>\n</section>\n<section id=\"install-it\">\n<h2>Instale-o<a class=\"heading-anchor\" href=\"#install-it\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>A seguir, execute o utilitário de linha de comando do Django para criar as tabelas do banco de dados automaticamente:</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<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>makemigrations\n<span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>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 makemigrations\n<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/4.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a> procura por todos os seus modelos disponíveis e cria migrações para cada tabela que ainda não exista. <a class=\"reference internal\" href=\"/pt-br/4.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> executa as migrações e cria as tabelas em seu banco de dados, bem como, opcionalmente, fornece um <a class=\"reference internal\" href=\"/pt-br/4.0/topics/migrations/\"><span class=\"doc\">controle muito mais rico do seu esquema de dados</span></a>.</p>\n</section>\n<section id=\"enjoy-the-free-api\">\n<h2>Aproveite a API livre<a class=\"heading-anchor\" href=\"#enjoy-the-free-api\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Com isso, você tem uma <a class=\"reference internal\" href=\"/pt-br/4.0/topics/db/queries/\"><span class=\"doc\">API Python</span></a> livre e rica para acessar seus dados. A API é criada em tempo de execução, nenhuma geração de código é necessária:</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=\"c1\"># Import the models we created from our &quot;news&quot; app</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">news.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span><span class=\"p\">,</span> <span class=\"n\">Reporter</span>\n\n<span class=\"c1\"># No reporters are in the system yet.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Create a new Reporter.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"n\">Reporter</span><span class=\"p\">(</span><span class=\"n\">full_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;John Smith&#39;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Save the object into the database. You have to call save() explicitly.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Now it has an ID.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">id</span>\n<span class=\"mi\">1</span>\n\n<span class=\"c1\"># Now the new reporter is in the database.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Fields are represented as attributes on the Python object.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">full_name</span>\n<span class=\"s1\">&#39;John Smith&#39;</span>\n\n<span class=\"c1\"># Django provides a rich database lookup API.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><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=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">full_name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">full_name__contains</span><span class=\"o\">=</span><span class=\"s1\">&#39;mith&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">Reporter</span><span class=\"p\">:</span> <span class=\"n\">John</span> <span class=\"n\">Smith</span><span class=\"o\">&gt;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Reporter</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><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=\"n\">Traceback</span> <span class=\"p\">(</span><span class=\"n\">most</span> <span class=\"n\">recent</span> <span class=\"n\">call</span> <span class=\"n\">last</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n<span class=\"n\">DoesNotExist</span><span class=\"p\">:</span> <span class=\"n\">Reporter</span> <span class=\"n\">matching</span> <span class=\"n\">query</span> <span class=\"n\">does</span> <span class=\"ow\">not</span> <span class=\"n\">exist</span><span class=\"o\">.</span>\n\n<span class=\"c1\"># Create an article.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">datetime</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">date</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"p\">(</span><span class=\"n\">pub_date</span><span class=\"o\">=</span><span class=\"n\">date</span><span class=\"o\">.</span><span class=\"n\">today</span><span class=\"p\">(),</span> <span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;Django is cool&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>     <span class=\"n\">content</span><span class=\"o\">=</span><span class=\"s1\">&#39;Yeah.&#39;</span><span class=\"p\">,</span> <span class=\"n\">reporter</span><span class=\"o\">=</span><span class=\"n\">r</span><span class=\"p\">)</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Now the article is in the database.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Article</span><span class=\"p\">:</span> <span class=\"n\">Django</span> <span class=\"ow\">is</span> <span class=\"n\">cool</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Article objects get API access to related Reporter objects.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"o\">.</span><span class=\"n\">reporter</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">full_name</span>\n<span class=\"s1\">&#39;John Smith&#39;</span>\n\n<span class=\"c1\"># And vice versa: Reporter objects get API access to Article objects.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">article_set</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Article</span><span class=\"p\">:</span> <span class=\"n\">Django</span> <span class=\"ow\">is</span> <span class=\"n\">cool</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># The API follows relationships as far as you need, performing efficient</span>\n<span class=\"c1\"># JOINs for you behind the scenes.</span>\n<span class=\"c1\"># This finds all articles by a reporter whose name starts with &quot;John&quot;.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">reporter__full_name__startswith</span><span class=\"o\">=</span><span class=\"s1\">&#39;John&#39;</span><span class=\"p\">)</span>\n<span class=\"o\">&lt;</span><span class=\"n\">QuerySet</span> <span class=\"p\">[</span><span class=\"o\">&lt;</span><span class=\"n\">Article</span><span class=\"p\">:</span> <span class=\"n\">Django</span> <span class=\"ow\">is</span> <span class=\"n\">cool</span><span class=\"o\">&gt;</span><span class=\"p\">]</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\"># Change an object by altering its attributes and calling save().</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">full_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Billy Goat&#39;</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># Delete an object with delete().</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">r</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house\">\n<h2>Uma interface de administração dinâmica: não se trata apenas de andaimes - é toda a casa.<a class=\"heading-anchor\" href=\"#a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Uma vez que seus modelos estejam definidos, Django pode automaticamente criar uma <a class=\"reference internal\" href=\"/pt-br/4.0/ref/contrib/admin/\"><span class=\"doc\">interface de administração</span></a> profissional pronta para produção – um website que permite a usuários autenticados adicionarem, alterarem e removerem objetos. O único passo necessário é registrar seu modelo no site de administração:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/models.py</span></code></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"n\">content</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">TextField</span><span class=\"p\">()</span>\n    <span class=\"n\">reporter</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Reporter</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/admin.py</span></code></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=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Article</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>A filosofia aqui é que seu site é editado por uma equipe, ou um cliente, ou talvez apenas por você – e você não quer ter que lidar com criação de interfaces apenas para gerenciar conteúdo.</p>\n<p>Um fluxo de trabalho típico na criação de aplicações Django é criar os modelos e ter os sites de administração rodando o mais rápido possível, assim sua equipe (ou cliente) poderá começar a inserir os dados. Em seguida, desenvolve-se a forma com que os dados serão apresentados ao público.</p>\n</section>\n<section id=\"design-your-urls\">\n<h2>Projete suas URLs<a class=\"heading-anchor\" href=\"#design-your-urls\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>A clean, elegant URL scheme is an important detail in a high-quality web\napplication. Django encourages beautiful URL design and doesn’t put any cruft\nin URLs, like <code class=\"docutils literal notranslate\"><span class=\"pre\">.php</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">.asp</span></code>.</p>\n<p>Para projetar URLs para uma aplicação, você cria um módulo Python que chamamos de <a class=\"reference internal\" href=\"/pt-br/4.0/topics/http/urls/\"><span class=\"doc\">URLconf</span></a>. Uma tabela de conteúdos para sua aplicação, contendo um mapeamento entre padrões de URL e funções Python. URLconfs também servem para desacoplar as URLs do código Python.</p>\n<p>Aqui está como um URLconf se aparentaria para o exemplo <code class=\"docutils literal notranslate\"><span class=\"pre\">Reporter</span></code>/<code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code> acima:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/urls.py</span></code></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=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;articles/&lt;int:year&gt;/&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">year_archive</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;articles/&lt;int:year&gt;/&lt;int:month&gt;/&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">month_archive</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;articles/&lt;int:year&gt;/&lt;int:month&gt;/&lt;int:pk&gt;/&#39;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">article_detail</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>O código acima mapeia URLs, como simples expressões regulares, para a localização das funções Python de retorno (“views”). As strings dos caminhos usam tags (valores entre &lt;&gt;) de parâmetros para “capturar” valores das URLs. Quando um usuário requisita uma página, o Django percorre cada padrão, em ordem, e para no primeiro que casa com a URL requisitada. (Se nenhum deles combinar o Django executa uma view especial de exceção 404.) Isso é incrivelmente rápido, porque os caminhos são compilados em expressões regulares.</p>\n<p>Once one of the URL patterns matches, Django calls the given view, which is a\nPython function. Each view gets passed a request object – which contains\nrequest metadata – and the values captured in the pattern.</p>\n<p>Por exemplo, se um usuário solicita a URL “/articles/2005/05/39323/”, Django chamaria a função <code class=\"docutils literal notranslate\"><span class=\"pre\">news.views.article_detail(request,</span> <span class=\"pre\">year=2005,</span> <span class=\"pre\">month=5,</span> <span class=\"pre\">pk=39323)</span></code>.</p>\n</section>\n<section id=\"write-your-views\">\n<h2>Escreva suas views<a class=\"heading-anchor\" href=\"#write-your-views\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Cada view é responsável por fazer uma entre duas coisas: Devolver um objeto <a class=\"reference internal\" href=\"/pt-br/4.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> contendo o conteúdo para a página requisitada, ou levantar uma exceção como <a class=\"reference internal\" href=\"/pt-br/4.0/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a>. O resto é com você.</p>\n<p>Geralmente, uma view recupera dados de acordo com os parâmetros, carrega um template e renderiza o template com os dados recuperados. Aqui está uma view para o <code class=\"docutils literal notranslate\"><span class=\"pre\">year_archive</span></code> do exemplo acima:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/views.py</span></code></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=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">year_archive</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">year</span><span class=\"p\">):</span>\n    <span class=\"n\">a_list</span> <span class=\"o\">=</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">pub_date__year</span><span class=\"o\">=</span><span class=\"n\">year</span><span class=\"p\">)</span>\n    <span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;year&#39;</span><span class=\"p\">:</span> <span class=\"n\">year</span><span class=\"p\">,</span> <span class=\"s1\">&#39;article_list&#39;</span><span class=\"p\">:</span> <span class=\"n\">a_list</span><span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;news/year_archive.html&#39;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Esse exemplo usa o <a class=\"reference internal\" href=\"/pt-br/4.0/topics/templates/\"><span class=\"doc\">sistema de template</span></a> do Django, o qual possui diversos recursos poderosos mas prima por permanecer simples o\nsuficiente para que não-programadores possam usá-lo.</p>\n</section>\n<section id=\"design-your-templates\">\n<h2>Projete seus templates<a class=\"heading-anchor\" href=\"#design-your-templates\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>O código acima carrega o template <code class=\"docutils literal notranslate\"><span class=\"pre\">news</span> <span class=\"pre\">/</span> <span class=\"pre\">year_archive.html</span></code>.</p>\n<p>O Django tem um caminho de pesquisa para templates, o qual permite a você minimizar a redundância entre templates. Nas configurações do Django, você especifica uma lista de diretórios para procurar por templates em <a class=\"reference internal\" href=\"/pt-br/4.0/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a>. Se um template não existir no primeiro diretório, ele verifica o segundo e assim por diante.</p>\n<p>Vamos dizer que o template <code class=\"docutils literal notranslate\"><span class=\"pre\">news/article_detail.html</span></code> foi encontrado. Aqui está como ele deve se parecer:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/news/templates/news/year_archive.html</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>Articles for <span class=\"cp\">{{</span> <span class=\"nv\">year</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>Articles for <span class=\"cp\">{{</span> <span class=\"nv\">year</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">article</span> <span class=\"k\">in</span> <span class=\"nv\">article_list</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">article.headline</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>By <span class=\"cp\">{{</span> <span class=\"nv\">article.reporter.full_name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>Published <span class=\"cp\">{{</span> <span class=\"nv\">article.pub_date</span><span class=\"o\">|</span><span class=\"nf\">date</span><span class=\"s2\">:&quot;F j, Y&quot;</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\n<p>Variáveis são cercadas por chaves duplas. <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">article.headline</span> <span class=\"pre\">}}</span></code> que significa “retorne o valor do atributo headline do artigo”, mas pontos não são usados apenas para acessar atributos: eles também podem acessar chaves de dicionários, acesar índices e chamar funções.</p>\n<p>Note que <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">article.pub_date|date:&quot;F</span> <span class=\"pre\">j,</span> <span class=\"pre\">Y&quot;</span> <span class=\"pre\">}}</span></code> usa um “pipe” no estilo Unix (o caractere “|”). Isso é chamado de filtro de template, e é uma forma de filtrar o valor de uma variável. Nesse caso, o filtro “date” formata um objeto Python datetime para um formato dado (como o encontrado na função date do PHP).</p>\n<p>Você pode atrelar tantos filtros quanto você quiser. Você pode escrever <a class=\"reference internal\" href=\"/pt-br/4.0/howto/custom-template-tags/#howto-writing-custom-template-filters\"><span class=\"std std-ref\">filtros personalizados</span></a>. Você pode escrever  <a class=\"reference internal\" href=\"/pt-br/4.0/howto/custom-template-tags/\"><span class=\"doc\">tags de template personalizadas</span></a>, que irão executar código Python personalizado por baixo dos panos.</p>\n<p>Finalmente, o Django usa o conceito de “herança de templates”: É isso que o <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">extends</span> <span class=\"pre\">&quot;base.html&quot;</span> <span class=\"pre\">%}</span></code> faz. Isso significa “primeiro carregue o template chamado ‘base’, o qual define uma série de blocos, e preencha os blocos com os seguintes blocos”. Resumindo, isso permite a você reduzir drasticamente a redundância em seus templates: cada template tem que definir apenas aquilo que é único para aquele template.</p>\n<p>Aqui está como o template “base.html”, incluindo o uso de <a class=\"reference internal\" href=\"/pt-br/4.0/howto/static-files/\"><span class=\"doc\">arquivos estáticos</span></a>, deve se parecer:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/templates/base.html</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">static</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">img</span> <span class=\"na\">src</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">static</span> <span class=\"s1\">&#39;images/sitelogo.png&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span> <span class=\"na\">alt</span><span class=\"o\">=</span><span class=\"s\">&quot;Logo&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>Simplificadamente, ele define a aparência do site (com o logo do site), e fornece “buracos” para templates filhos preencherem. Isso significar que um redesenho do site pode ser feito alterando um único arquivo - o template base.</p>\n<p>Isto também permite criar múltiplas versões de um site, com diferentes templates bases, mas com reuso de templates filhos. Os criadores do Django usaram essa técnica para criar versões mobile do site surpreendentemente diferentes apenas criando um novo template base.</p>\n<p>Note que você não tem que usar o sistema de templates do Django se você preferir outro. Enquanto o sistema de templates do Django é particularmente bem integrado com a camada de modelos do Django, nada força você a usá-lo. Da mesma maneira que, você não tem que usar a API de banco de dados do Django, também. Você pode usar outras camadas de abstração de banco de dados, você pode ler arquivos XML, você pode ler arquivos do disco, ou qualquer coisa que desejar. Cada parte do Django – modelos, visões e templates – é desacoplada da próxima.</p>\n</section>\n<section id=\"this-is-just-the-surface\">\n<h2>Isto é apenas a superfície<a class=\"heading-anchor\" href=\"#this-is-just-the-surface\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Esta foi apenas uma breve visão geral da funcionalidade do Django. Algumas características mais úteis:</p>\n<ul class=\"simple\">\n<li><p>Um <a class=\"reference internal\" href=\"/pt-br/4.0/topics/cache/\"><span class=\"doc\">framework para caching</span></a> que se integra com o memcached e outros backends.</p></li>\n<li><p>Um <a class=\"reference internal\" href=\"/pt-br/4.0/ref/contrib/syndication/\"><span class=\"doc\">framework de distribuição</span></a> que permite você criar feeds RSS e Atom escrevendo uma pequena classe Python.</p></li>\n<li><p>Recursos para gerar automaticamente um site de administração mais atrativo - essa visão gera mal arranhou a superfície.</p></li>\n</ul>\n<p>The next steps are for you to <a class=\"reference external\" href=\"https://www.djangoproject.com/download/\">download Django</a>, read <a class=\"reference internal\" href=\"/pt-br/4.0/intro/tutorial01/\"><span class=\"doc\">the tutorial</span></a> and join <a class=\"reference external\" href=\"https://www.djangoproject.com/community/\">the community</a>. Thanks for your interest!</p>\n</section>","rootId":"django-at-a-glance","toc":[{"title":"Projete o seu model","anchor":"design-your-model","children":[]},{"title":"Instale-o","anchor":"install-it","children":[]},{"title":"Aproveite a API livre","anchor":"enjoy-the-free-api","children":[]},{"title":"Uma interface de administração dinâmica: não se trata apenas de andaimes - é toda a casa.","anchor":"a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house","children":[]},{"title":"Projete suas URLs","anchor":"design-your-urls","children":[]},{"title":"Escreva suas views","anchor":"write-your-views","children":[]},{"title":"Projete seus templates","anchor":"design-your-templates","children":[]},{"title":"Isto é apenas a superfície","anchor":"this-is-just-the-surface","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Introdução","url":"/pt-br/4.0/intro/"}],"prev":{"docname":"intro/index","title":"Introdução","url":"/pt-br/4.0/intro/"},"next":{"docname":"intro/install","title":"Guia de instalação rápida","url":"/pt-br/4.0/intro/install/"},"formats":{"html":"/pt-br/4.0/intro/overview/","markdown":"/pt-br/4.0/intro/overview.md","json":"/pt-br/4.0/intro/overview.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/intro/overview.txt","official":"https://docs.djangoproject.com/pt-br/4.0/intro/overview/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}