{"id":573237,"date":"2025-06-05T03:49:07","date_gmt":"2025-06-05T02:49:07","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=573237"},"modified":"2025-06-05T03:49:16","modified_gmt":"2025-06-05T02:49:16","slug":"introducao-as-visualizacoes-do-django","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/pt-br\/pycharm\/2025\/06\/introducao-as-visualizacoes-do-django\/","title":{"rendered":"Introdu\u00e7\u00e3o \u00e0s visualiza\u00e7\u00f5es do Django"},"content":{"rendered":"<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-573239 size-full\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/PC-social-BlogFeatured-1280x720-2x-6.png\" alt=\"\" width=\"2559\" height=\"1439\" \/><\/figure>\n<p>Visualiza\u00e7\u00f5es s\u00e3o centrais no padr\u00e3o de arquitetura do Django e \u00e9 essencial que qualquer desenvolvedor que trabalhe com esse framework tenha um s\u00f3lido dom\u00ednio de como trabalhar com elas. Se voc\u00ea for novato no desenvolvimento de aplicativos de Web com o Django ou simplesmente precisar recapitular as visualiza\u00e7\u00f5es, temos o que voc\u00ea precisa.\u00a0<\/p>\n<p>Compreender melhor as visualiza\u00e7\u00f5es ajudar\u00e1 voc\u00ea a progredir mais rapidamente no seu projeto com o Django. Quer voc\u00ea esteja trabalhando em um back-end de API ou em fluxos de interface de usu\u00e1rio na Web, \u00e9 crucial saber como usar as visualiza\u00e7\u00f5es.<\/p>\n<p>Continue lendo para descobrir o que s\u00e3o as visualiza\u00e7\u00f5es do Django, quais s\u00e3o os seus diferentes tipos e as melhores pr\u00e1ticas para se trabalhar com elas, e ver exemplos de casos de uso.<\/p>\n<h2 class=\"wp-block-heading\">O que s\u00e3o as visualiza\u00e7\u00f5es do Django?<\/h2>\n<p>As visualiza\u00e7\u00f5es s\u00e3o um componente central do padr\u00e3o de arquitetura MTV (&#8220;model-template-view&#8221;, &#8220;modelo-template-visualiza\u00e7\u00e3o&#8221;) do Django. Essencialmente, elas funcionam como intermedi\u00e1rias entre <a href=\"https:\/\/docs.djangoproject.com\/en\/5.1\/topics\/db\/models\/\" target=\"_blank\" rel=\"noopener\">modelos<\/a> e <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2025\/02\/the-ultimate-guide-to-django-templates\/\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/pycharm\/2025\/02\/the-ultimate-guide-to-django-templates\/\">templates<\/a>, processando as solicita\u00e7\u00f5es dos usu\u00e1rios e retornando respostas.<\/p>\n<p>Talvez voc\u00ea j\u00e1 tenha encontrado visualiza\u00e7\u00f5es no padr\u00e3o MVC (modelo-visualiza\u00e7\u00e3o-controlador). Por\u00e9m, essas visualiza\u00e7\u00f5es s\u00e3o ligeiramente <a href=\"https:\/\/docs.djangoproject.com\/en\/5.1\/faq\/general\/#faq-mtv\" target=\"_blank\" rel=\"noopener\">diferentes das visualiza\u00e7\u00f5es do Django<\/a> e n\u00e3o t\u00eam uma correspond\u00eancia exata. As visualiza\u00e7\u00f5es do Django s\u00e3o essencialmente controladores no MVC, enquanto as templates do Django correspondem grosseiramente \u00e0s visualiza\u00e7\u00f5es do MVC. Isso torna vital compreender as nuances das visualiza\u00e7\u00f5es do Django, mesmo que voc\u00ea j\u00e1 esteja familiarizado com as visualiza\u00e7\u00f5es no contexto do MVC.<\/p>\n<p>No Django, as visualiza\u00e7\u00f5es s\u00e3o parte da interface de usu\u00e1rio e lidam com a l\u00f3gica e o processamento dos dados de solicita\u00e7\u00f5es de Web enviadas aos seus aplicativos e sites que usam o Django. Elas renderizam as suas templates no que o usu\u00e1rio v\u00ea quando visualiza a sua p\u00e1gina da Web. Cada visualiza\u00e7\u00e3o baseada em uma fun\u00e7\u00e3o ou classe recebe uma solicita\u00e7\u00e3o de um usu\u00e1rio, busca o dado em seus modelos, aplica a l\u00f3gica de neg\u00f3cios ou o processamento de dados e depois prepara e retorna uma resposta a uma template por HTTP.<\/p>\n<p>Essa resposta pode ser qualquer coisa que um navegador de Web possa mostrar e tipicamente \u00e9 uma p\u00e1gina em HTML. Por\u00e9m, as visualiza\u00e7\u00f5es do Django tamb\u00e9m podem retornar imagens, documentos em XML, redirecionamentos, p\u00e1ginas de erro e muito mais.<\/p>\n<h2 class=\"wp-block-heading\">Renderiza\u00e7\u00e3o e passagem de dados para templates<\/h2>\n<p>O Django fornece o atalho <code>render()<\/code> para simplificar a renderiza\u00e7\u00e3o de templates de dentro das visualiza\u00e7\u00f5es. Esse atalho ajuda a evitar o c\u00f3digo repetitivo para carregar a template e criar a resposta manualmente.<\/p>\n<p>O PyCharm oferece complementa\u00e7\u00e3o inteligente do c\u00f3digo, que automaticamente sugere a fun\u00e7\u00e3o <code>render()<\/code> de <code>django.shortcuts<\/code> quando voc\u00ea come\u00e7a a digit\u00e1-la nas suas visualiza\u00e7\u00f5es. Ele tamb\u00e9m reconhece nomes de templates e fornece complementa\u00e7\u00e3o autom\u00e1tica em caminhos de templates, ajudando voc\u00ea a evitar erros de digita\u00e7\u00e3o e outros.<\/p>\n<p>O usu\u00e1rio fornece a solicita\u00e7\u00e3o, o nome da template e um dicion\u00e1rio de contexto, que alimentam a template com dados. Depois que os dados necess\u00e1rios forem obtidos, a visualiza\u00e7\u00e3o os passa para a template, onde eles podem ser renderizados e apresentados ao usu\u00e1rio.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.shortcuts import render\n\ndef my_view(request):\n    # Some business logic to obtain data\n    data_to_pass = {'variable1': 'value1', 'variable2': 'value2'}\n\n    # Pass the data to the template\n    return render(request, 'my_template.html', context=data_to_pass)<\/pre>\n<p>Neste exemplo, <code>data_to_pass<\/code> \u00e9 um dicion\u00e1rio que cont\u00e9m os dados que voc\u00ea deseja enviar para a template. Em seguida, a fun\u00e7\u00e3o <code>render<\/code> \u00e9 usada para renderizar a template (<code>my_template.html<\/code>) com os dados de contexto fornecidos.<\/p>\n<p>Agora voc\u00ea pode acessar e mostrar os dados na sua template (<code>my_template.html<\/code>).<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\n\n    <\/pre>\n<h1>{{ variable1 }}<\/h1>\n<p>{{ variable2 }}<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\n<\/pre>\n<p>Na template, voc\u00ea pode usar chaves duplas (<code>{{ }}<\/code>) para indicar vari\u00e1veis de template, que ser\u00e3o substitu\u00eddas pelos valores dos dados de contexto passados pela visualiza\u00e7\u00e3o.<\/p>\n<p>O <a href=\"https:\/\/www.jetbrains.com\/pycharm\/web-development\/django\/\" target=\"_blank\" rel=\"noopener\">PyCharm<\/a> oferece complementa\u00e7\u00e3o e realce de sintaxe para tags, vari\u00e1veis e loops de templates do Django. Tamb\u00e9m oferece linting dentro do editor para erros comuns. Isso permite que voc\u00ea se concentre em criar as visualiza\u00e7\u00f5es e lidar com a l\u00f3gica, em vez de gastar tempo preenchendo manualmente os elementos da template ou depurando erros comuns.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-540786\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/1-1.png\" alt=\"Complementa\u00e7\u00e3o no Django com o PyCharm\" width=\"3840\" height=\"2160\" \/><\/figure>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/pycharm\/web-development\/django\/\" target=\"\" rel=\"noopener\">Comece a usar o PyCharm Pro gratuitamente<\/a><\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Visualiza\u00e7\u00f5es baseadas em fun\u00e7\u00f5es<\/h2>\n<p>O Django tem dois tipos de visualiza\u00e7\u00f5es: baseadas em fun\u00e7\u00f5es e em classes.<\/p>\n<p>As visualiza\u00e7\u00f5es baseadas em fun\u00e7\u00f5es s\u00e3o criadas usando fun\u00e7\u00f5es simples em Python e geralmente se dividem em quatro categorias b\u00e1sicas: cria\u00e7\u00e3o, leitura (&#8220;read&#8221;), atualiza\u00e7\u00e3o (&#8220;update&#8221;) e exclus\u00e3o (&#8220;delete&#8221;) \u2014 CRUD. Esta \u00e9 a base de qualquer framework no desenvolvimento. Essas fun\u00e7\u00f5es recebem uma solicita\u00e7\u00e3o por HTTP e retornam uma resposta pelo mesmo protocolo.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.http import HttpResponse\n\ndef my_view(request):\n\n    # View logic goes here\n    context = {\"message\": \"Hello world\"}\n\n    return HttpResponse(render(request, \"mytemplate.html\", context))<\/pre>\n<p>Este trecho de c\u00f3digo lida com a l\u00f3gica da visualiza\u00e7\u00e3o, prepara um dicion\u00e1rio de contexto para passar os dados a uma template renderizada e retorna o c\u00f3digo em HTML final da template em um objeto de resposta.<\/p>\n<p>Visualiza\u00e7\u00f5es baseadas em fun\u00e7\u00f5es s\u00e3o simples e diretas. A l\u00f3gica fica contida em uma \u00fanica fun\u00e7\u00e3o em Python, em vez de espalhada pelos m\u00e9todos de uma classe, tornando essas visualiza\u00e7\u00f5es as mais adequadas para casos de usos com muito pouco processamento.<\/p>\n<p>O PyCharm permite que voc\u00ea gere automaticamente a estrutura <code>def my_view(request)<\/code> usando <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/using-live-templates.html\" target=\"_blank\" rel=\"noopener\">templates din\u00e2micas<\/a>. Essas templates s\u00e3o trechos predefinidos de c\u00f3digo que podem ser expandidos para c\u00f3digo reutiliz\u00e1vel. Esse recurso poupa tempo e garante uma estrutura consistente \u00e0s suas defini\u00e7\u00f5es de visualiza\u00e7\u00f5es.<\/p>\n<p>Para invocar templates din\u00e2micas, basta pressionar <em>\u2318J<\/em>, digitar <code>Listview<\/code> e pressionar a tecla TAB.\u00a0<\/p>\n<figure class=\"wp-block-video\"><video src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/2.mov\" controls=\"controls\" width=\"300\" height=\"150\"><\/video><\/figure>\n<p>Al\u00e9m disso, o PyCharm inclui uma janela de ferramentas <em>Django Structure<\/em>, onde voc\u00ea pode ver uma lista de todas as visualiza\u00e7\u00f5es do seu projeto do Django, organizadas por aplicativo. Isso permite localizar visualiza\u00e7\u00f5es rapidamente, navegar entre elas e identificar a qual arquivo pertence cada visualiza\u00e7\u00e3o.<\/p>\n<figure class=\"wp-block-video\"><video src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/3.mov\" controls=\"controls\" width=\"300\" height=\"150\"><\/video><\/figure>\n<h2 class=\"wp-block-heading\">Visualiza\u00e7\u00f5es baseadas em classes<\/h2>\n<p>O Django introduziu as visualiza\u00e7\u00f5es baseadas em classes, para que os usu\u00e1rios n\u00e3o precisem escrever o mesmo c\u00f3digo repetidas vezes. Elas n\u00e3o substituem as visualiza\u00e7\u00f5es baseadas em fun\u00e7\u00f5es, mas t\u00eam certas aplica\u00e7\u00f5es e vantagens, especialmente em casos que requerem uma l\u00f3gica complexa.<\/p>\n<p>As visualiza\u00e7\u00f5es baseadas em classes do Django fornecem classes-pais reutiliz\u00e1veis que implementam diversos padr\u00f5es e recursos tipicamente necess\u00e1rios para visualiza\u00e7\u00f5es de aplicativos de Web. Voc\u00ea pode obter as suas visualiza\u00e7\u00f5es dessas classes-pais para reduzir o c\u00f3digo repetitivo.\u00a0<\/p>\n<p>As visualiza\u00e7\u00f5es baseadas em classes oferecem classes-pais gen\u00e9ricas, como:<\/p>\n<ul>\n<li><code>ListView<\/code><\/li>\n<li><code>DetailView<\/code><\/li>\n<li><code>CreateView<\/code><\/li>\n<li>E muito mais.<\/li>\n<\/ul>\n<p>Veja abaixo dois trechos semelhantes de c\u00f3digo, demonstrando uma <code>BookListView<\/code> simples. O primeiro trecho mostra uma implementa\u00e7\u00e3o que usa as conven\u00e7\u00f5es-padr\u00e3o baseadas em classes, enquanto o segundo ilustra como personalizar a visualiza\u00e7\u00e3o especificando par\u00e2metros adicionais.\u00a0<\/p>\n<p><strong>Implementa\u00e7\u00e3o b\u00e1sica<\/strong>:\u00a0<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.views.generic import ListView\nfrom .models import Book \n\nclass BookListView(ListView):\n    model = Book\n    # The template_name is omitted because Django defaults to 'book_list.html' \n    # based on the convention of _list.html for ListView.<\/pre>\n<p>Quando <code>BookListView<\/code> \u00e9 renderizada, consulta automaticamente os registros de <strong>Book<\/strong> e os passa sob a vari\u00e1vel <strong>books<\/strong> ao renderizar <code>book_list.html<\/code>. Isso significa que voc\u00ea pode criar uma visualiza\u00e7\u00e3o para listar objetos rapidamente, sem precisar reescrever a l\u00f3gica subjacente.<\/p>\n<p><strong>Implementa\u00e7\u00e3o personalizada<\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.views.generic import ListView\nfrom .models import Book \n\nclass BookListView(ListView):\n\n    model = Book\n\t# You can customize the view further by adding additional attributes or methods \n    def get_queryset(self):\n\t# Example of customizing the queryset to filter books\n\treturn Book.objects.filter(is_available=True)<\/pre>\n<p>Neste segundo trecho, introduzimos o m\u00e9todo personalizado <code>get_queryset()<\/code>, que permite filtrar mais precisamente os registros mostrados na visualiza\u00e7\u00e3o. Isso demonstra como as visualiza\u00e7\u00f5es baseadas em classes podem ser ampliadas al\u00e9m da sua funcionalidade-padr\u00e3o para atenderem \u00e0s necessidades do seu aplicativo.\u00a0<\/p>\n<p>Visualiza\u00e7\u00f5es baseadas em classes tamb\u00e9m definem m\u00e9todos que se atrelam a partes essenciais do ciclo de vida de solicita\u00e7\u00f5es e respostas, tais como:\u00a0<\/p>\n<ul>\n<li><code>get()<\/code> \u2014 l\u00f3gica para solicita\u00e7\u00f5es <code>GET<\/code>.<\/li>\n<li><code>post()<\/code> \u2014 l\u00f3gica para solicita\u00e7\u00f5es <code>POST<\/code>.<\/li>\n<li><code>dispatch()<\/code> \u2014 determina qual m\u00e9todo chamar, <code>get()<\/code> ou <code>post()<\/code>.<\/li>\n<\/ul>\n<p>Esses tipos de visualiza\u00e7\u00f5es fornecem uma estrutura e oferecem personaliza\u00e7\u00e3o quando necess\u00e1ria, tornando-as adequadas para casos elaborados de uso.<\/p>\n<p>O PyCharm oferece templates din\u00e2micas para visualiza\u00e7\u00f5es baseadas em classes, como <code>ListView<\/code>, <code>DetailView<\/code> e <code>TemplateView<\/code>, permitindo gerar classes inteiras de visualiza\u00e7\u00f5es em segundos, incluindo m\u00e9todos reutiliz\u00e1veis e docstrings.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-540822\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/4.png\" alt=\"Templates din\u00e2micas do Django no PyCharm\" width=\"3840\" height=\"2160\" \/><\/figure>\n<h3 class=\"wp-block-heading\">Cria\u00e7\u00e3o de visualiza\u00e7\u00f5es personalizadas baseadas em classes<\/h3>\n<p>Voc\u00ea tamb\u00e9m pode criar suas pr\u00f3prias classes de visualiza\u00e7\u00f5es, criando subclasses das classes gen\u00e9ricas do Django e personalizando-as conforme as suas necessidades.\u00a0<\/p>\n<p>Estes s\u00e3o alguns casos de uso nos quais voc\u00ea talvez queira criar as suas pr\u00f3prias classes:<\/p>\n<ul>\n<li>Para adicionar l\u00f3gica de neg\u00f3cios, como c\u00e1lculos complicados.<\/li>\n<li>Para misturar diversas classes-pais gen\u00e9ricas e seus recursos.<\/li>\n<li>Para gerenciar sess\u00f5es ou estados entre v\u00e1rias solicita\u00e7\u00f5es.<\/li>\n<li>Para otimizar o acesso a bancos de dados com consultas personalizadas.\u00a0<\/li>\n<li>Para reutilizar l\u00f3gica comum de renderiza\u00e7\u00e3o entre diferentes \u00e1reas.\u00a0<\/li>\n<\/ul>\n<p>Uma visualiza\u00e7\u00e3o personalizada baseada em classes pode se parecer com isto:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.views.generic import View\nfrom django.shortcuts import render\nfrom . import models\n\nclass ProductSalesView(View):\n\n    def get(self, request):\n     \n        # Custom data processing \n        sales = get_sales_data()\n        \n        return render(request, \"sales.html\", {\"sales\": sales})\n\n    def post(self, request):\n\n        # Custom form handling\n        form = SalesSearchForm(request.POST)  \n        if form.is_valid():\n            results = models.Sale.objects.filter(date__gte=form.cleaned_data['start_date'])\n            context = {\"results\": results}\n            return render(request, \"search_results.html\", context)\n            \n        # Invalid form handling\n        errors = form.errors\n        return render(request, \"sales.html\", {\"errors\": errors})<\/pre>\n<p>Aqui, manipuladores <code>get<\/code> e <code>post<\/code> personalizados permitem preservar os j\u00e1 existentes entre solicita\u00e7\u00f5es.<\/p>\n<h2 class=\"wp-block-heading\">Quando usar cada tipo de visualiza\u00e7\u00e3o<\/h2>\n<p>Tanto as visualiza\u00e7\u00f5es baseadas em fun\u00e7\u00f5es quanto as baseadas em classes podem ser \u00fateis, dependendo da complexidade e das necessidades da l\u00f3gica de visualiza\u00e7\u00e3o.\u00a0<\/p>\n<p>As principais diferen\u00e7as s\u00e3o que as visualiza\u00e7\u00f5es baseadas em classes:<\/p>\n<ul>\n<li>Promovem a reutiliza\u00e7\u00e3o atrav\u00e9s de subclasses e da heran\u00e7a do comportamento das classes-pais.<\/li>\n<li>S\u00e3o ideais para gerenciar estados entre solicita\u00e7\u00f5es.<\/li>\n<li>Fornecem mais estrutura e aplicam mais disciplina.<\/li>\n<\/ul>\n<p>Voc\u00ea poderia us\u00e1-las ao trabalhar com:<\/p>\n<ul>\n<li>P\u00e1ginas de dashboards com l\u00f3gica complexa de renderiza\u00e7\u00e3o.\u00a0<\/li>\n<li>P\u00e1ginas voltadas para o p\u00fablico que mostram dados din\u00e2micos.<\/li>\n<li>Portais administrativos para o gerenciamento de conte\u00fado.<\/li>\n<li>P\u00e1ginas de listas ou de detalhamento envolvendo modelos de bancos de dados.<\/li>\n<\/ul>\n<p>Por outro lado, as visualiza\u00e7\u00f5es baseadas em fun\u00e7\u00f5es:<\/p>\n<ul>\n<li>S\u00e3o mais simples e requerem menos c\u00f3digo para serem criadas.<\/li>\n<li>Podem ser mais f\u00e1ceis de entender para desenvolvedores em Python.<\/li>\n<li>S\u00e3o altamente flex\u00edveis e t\u00eam menos restri\u00e7\u00f5es.<\/li>\n<\/ul>\n<p>Seus casos de uso incluem:\u00a0<\/p>\n<ul>\n<li>Prototipa\u00e7\u00e3o de ideias.<\/li>\n<li>Visualiza\u00e7\u00e3o de CRUD simples ou de banco de dados.<\/li>\n<li>P\u00e1ginas de chegada ou de marketing.\u00a0<\/li>\n<li>Endpoints de API para atender a solicita\u00e7\u00f5es de Web.<\/li>\n<\/ul>\n<p>Em resumo, visualiza\u00e7\u00f5es baseadas em fun\u00e7\u00f5es s\u00e3o flex\u00edveis, diretas e mais f\u00e1ceis de compreender. Por\u00e9m, em casos mais complexos, voc\u00ea precisar\u00e1 criar mais c\u00f3digo n\u00e3o reutiliz\u00e1vel.<\/p>\n<p>As visualiza\u00e7\u00f5es baseadas em classes do Django obrigam a que haja uma estrutura e s\u00e3o reutiliz\u00e1veis, mas podem ser mais desafiadoras para compreender e implementar, al\u00e9m de mais dif\u00edceis de depurar.<\/p>\n<h2 class=\"wp-block-heading\">Visualiza\u00e7\u00f5es e URLs<\/h2>\n<p>Como j\u00e1 definimos, no Django, visualiza\u00e7\u00f5es s\u00e3o fun\u00e7\u00f5es ou classes que determinam como uma template ser\u00e1 renderizada. Cada visualiza\u00e7\u00e3o est\u00e1 associada a um padr\u00e3o espec\u00edfico de URL, encaminhando ao lugar certo as solicita\u00e7\u00f5es que chegarem.<\/p>\n<p>\u00c9 importante compreender a rela\u00e7\u00e3o entre as visualiza\u00e7\u00f5es e as URLs, para gerenciar o fluxo do seu aplicativo de forma eficaz.\u00a0<\/p>\n<p>Cada visualiza\u00e7\u00e3o corresponde a um padr\u00e3o de URL, definido no arquivo <code>urls.py<\/code> do seu aplicativo do Django. Esse mapeamento de URLs garante que quando um usu\u00e1rio navegar at\u00e9 um determinado endere\u00e7o no seu aplicativo, o Django saiba exatamente qual visualiza\u00e7\u00e3o invocar.\u00a0<\/p>\n<p>Vamos dar uma olhada em uma configura\u00e7\u00e3o simples de URL:\u00a0<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.urls import path\nfrom .views import BookListView\n\nurlpatterns = [\n    path('books\/', BookListView.as_view(), name='book-list'),\n]<\/pre>\n<p>Nesta configura\u00e7\u00e3o, quando um usu\u00e1rio visita <code>\/books\/<\/code>, entra em a\u00e7\u00e3o a <code>BookListView<\/code>, para renderizar a lista de livros. Mapeando claramente URLs a visualiza\u00e7\u00f5es, voc\u00ea torna a sua base de c\u00f3digo mais f\u00e1cil de ler e mais organizada.<\/p>\n<h3 class=\"wp-block-heading\">Simplifique o gerenciamento de URLs com o PyCharm<\/h3>\n<p>\u00c0 medida que o seu aplicativo cresce, pode se tornar desafiador gerenciar e visualizar endpoints no Django. O PyCharm ataca esse problema com sua janela de ferramentas <em>Endpoints<\/em>, que fornece uma visualiza\u00e7\u00e3o centralizada de todos os padr\u00f5es, visualiza\u00e7\u00f5es associadas e m\u00e9todos de HTTP do seu aplicativo. Esse recurso permite visualizar uma lista de todos os endpoints do seu projeto, facilitando rastrear quais visualiza\u00e7\u00f5es est\u00e3o vinculadas a determinadas URLs.\u00a0<\/p>\n<p>Em vez de pesquisar em diversos arquivos <code>urls.py<\/code>, voc\u00ea pode localizar instantaneamente as visualiza\u00e7\u00f5es correspondentes e navegar at\u00e9 elas com apenas um clique. Isso \u00e9 especialmente \u00fatil em projetos maiores do Django, em que configura\u00e7\u00f5es de URLs se estendam por v\u00e1rios arquivos, ou ao trabalhar em equipes onde seja crucial determinar rapidamente o contexto.<\/p>\n<p>Al\u00e9m disso, a janela de ferramentas <em>Endpoints<\/em> permite visualizar todos os endpoints em uma interface semelhante a uma tabela. Cada linha mostra o caminho da URL, o m\u00e9todo de HTTP (<code>GET<\/code>, <code>POST<\/code>, etc.) e a fun\u00e7\u00e3o ou classe de visualiza\u00e7\u00e3o associada a um determinado endpoint.\u00a0<\/p>\n<p>Esse recurso n\u00e3o ap\u00e9nas aumenta a produtividade, mas tamb\u00e9m melhora a navega\u00e7\u00e3o pelo c\u00f3digo, permitindo que voc\u00ea identifique facilmente padr\u00f5es de URLs que estejam duplicados ou faltando. Esse n\u00edvel de visibilidade \u00e9 valioso para depurar problemas de roteamento ou incorporar novos desenvolvedores a um projeto.<\/p>\n<p>Confira este v\u00eddeo para saber mais sobre a janela de ferramentas <em>Endpoints<\/em> e os benef\u00edcios que voc\u00ea pode ter com ela.\u00a0<\/p>\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\">\n<div class=\"wp-block-embed__wrapper\">\u00a0<\/div>\n<\/figure>\n<h2 class=\"wp-block-heading\">Melhores pr\u00e1ticas para usar as visualiza\u00e7\u00f5es do Django<\/h2>\n<p>Estas s\u00e3o algumas diretrizes que podem ajudar voc\u00ea a criar visualiza\u00e7\u00f5es bem estruturadas e f\u00e1ceis de manter.<\/p>\n<h3 class=\"wp-block-heading\">Mantenha o foco das visualiza\u00e7\u00f5es<\/h3>\n<p>As visualiza\u00e7\u00f5es devem se concentrar em processar solicita\u00e7\u00f5es, buscar dados, passar dados para as templates e controlar o fluxo e os redirecionamentos. Deve-se lidar com uma <a href=\"https:\/\/forum.djangoproject.com\/t\/where-to-put-business-logic-in-django\/282\" target=\"_blank\" rel=\"noopener\">l\u00f3gica de neg\u00f3cios<\/a> complicada e com processamentos complexos em outro lugar, como nos m\u00e9todos do modelo ou em classes dedicadas de servi\u00e7o.\u00a0<\/p>\n<p>Por\u00e9m, tome cuidado para n\u00e3o sobrecarregar os seus modelos com excesso de l\u00f3gica, pois isso pode levar ao padr\u00e3o nocivo de &#8220;modelo gordo&#8221; no Django. A <a href=\"https:\/\/docs.djangoproject.com\/en\/5.1\/topics\/class-based-views\/\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o do Django sobre visualiza\u00e7\u00f5es<\/a> d\u00e1 mais insights sobre como estrutur\u00e1-las adequadamente.\u00a0<\/p>\n<h3 class=\"wp-block-heading\">Mantenha as visualiza\u00e7\u00f5es e templates enxutas<\/h3>\n<p>\u00c9 melhor manter as visualiza\u00e7\u00f5es e templates enxutas. As visualiza\u00e7\u00f5es devem cuidar do processamento de solicita\u00e7\u00f5es e da obten\u00e7\u00e3o de dados, enquanto as templates devem se concentrar na apresenta\u00e7\u00e3o, com o m\u00ednimo de l\u00f3gica.<\/p>\n<p>Processamentos complexos devem ser feitos em Python, fora das templates, para facilitar a manuten\u00e7\u00e3o e os testes. Para saber mais sobre isso, confira a <a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/topics\/templates\/\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o do Django sobre templates<\/a>.<\/p>\n<h3 class=\"wp-block-heading\">Desassocie as consultas a bancos de dados<\/h3>\n<p>Extrair as consultas a bancos de dados para gerenciadores ou reposit\u00f3rios separados de modelos, em vez de coloc\u00e1-las diretamente nas visualiza\u00e7\u00f5es, pode ajudar a reduzir a duplica\u00e7\u00e3o. Consulte na <a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/topics\/db\/models\/\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o do Django sobre modelos<\/a> orienta\u00e7\u00f5es sobre como gerenciar intera\u00e7\u00f5es com bancos de dados de forma eficaz.\u00a0<\/p>\n<h3 class=\"wp-block-heading\">Use visualiza\u00e7\u00f5es gen\u00e9ricas baseadas em classes quando poss\u00edvel<\/h3>\n<p>As visualiza\u00e7\u00f5es gen\u00e9ricas baseadas em classes do Django, como <code>DetailView<\/code> e <code>ListView<\/code>, permitem a reutiliza\u00e7\u00e3o sem que voc\u00ea precise escrever muito c\u00f3digo. Escolha us\u00e1-las, em vez de reinventar a roda, para usar melhor o seu tempo. A <a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/topics\/class-based-views\/generic-display\/\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o sobre visualiza\u00e7\u00f5es gen\u00e9ricas<\/a> \u00e9 uma excelente fonte de informa\u00e7\u00e3o para entender esses recursos.\u00a0<\/p>\n<h3 class=\"wp-block-heading\">N\u00e3o h\u00e1 problema em usar visualiza\u00e7\u00f5es baseadas em fun\u00e7\u00f5es em casos simples<\/h3>\n<p>Em visualiza\u00e7\u00f5es b\u00e1sicas, como atender a solicita\u00e7\u00f5es de APIs, uma fun\u00e7\u00e3o pode ser mais eficaz que uma classe. Reserve visualiza\u00e7\u00f5es complexas baseadas em classes para fluxos complicados de interface de usu\u00e1rio. A p\u00e1gina de <a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/topics\/http\/views\/\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o sobre como criar visualiza\u00e7\u00f5es<\/a> oferece exemplos \u00fateis.<\/p>\n<h3 class=\"wp-block-heading\">Estruture rotas e URLs de forma limpa<\/h3>\n<p>Organize as rotas e os manipuladores de visualiza\u00e7\u00f5es, agrupando-os em aplicativos conforme sua funcionalidade. Isso facilita encontrar as coisas e navegar pelo c\u00f3digo-fonte. Confira a <a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/topics\/http\/urls\/\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o do Django sobre despachantes de URLs<\/a> para ver as melhores pr\u00e1ticas para estruturar as suas configura\u00e7\u00f5es de URLs.\u00a0<\/p>\n<h2 class=\"wp-block-heading\">Pr\u00f3ximos passos\u00a0<\/h2>\n<p>Agora que voc\u00ea j\u00e1 tem uma compreens\u00e3o b\u00e1sica das visualiza\u00e7\u00f5es no Django, voc\u00ea ir\u00e1 querer ir mais fundo nesse framework e saber quais s\u00e3o as pr\u00f3ximas etapas.<\/p>\n<ul>\n<li>Recorde os seus conhecimentos de Django na nossa postagem de blog <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/01\/how-to-learn-django\/\"><em>How to Learn Django<\/em><\/a>, que \u00e9 ideal para iniciantes ou para quem est\u00e1 procurando atualizar seus conhecimentos.<\/li>\n<\/ul>\n<ul>\n<li>Descubra como <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/creating-and-running-your-first-django-project.html\" target=\"_blank\" rel=\"noopener\">criar e executar o seu primeiro projeto em Django<\/a> no PyCharm, com nosso tutorial sobre como criar um aplicativo b\u00e1sico de lista de afazeres, ou explore nossa lista completa de <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/09\/django-project-ideas\/\">ideias de projetos em Django<\/a> para ter mais inspira\u00e7\u00e3o.<\/li>\n<\/ul>\n<ul>\n<li>Explore o <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/06\/the-state-of-django\/\">estado do Django<\/a> para ver as \u00faltimas tend\u00eancias no desenvolvimento em Django e ganhar mais inspira\u00e7\u00e3o.<\/li>\n<\/ul>\n<ul>\n<li>Se voc\u00ea ainda estiver decidindo qual framework para Python usar, nossos guias comparativos <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2023\/11\/django-vs-flask-which-is-the-best-python-web-framework\/\"><em>Django \u00d7 Flask<\/em><\/a> e <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2023\/12\/django-vs-fastapi-which-is-the-best-python-web-framework\/\"><em>Django \u00d7 FastAPI<\/em><\/a> podem ajudar.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\">Suporte ao Django no PyCharm<\/h3>\n<p>O PyCharm Professional \u00e9 o melhor IDE de sua categoria para o <a href=\"https:\/\/www.jetbrains.com\/pycharm\/web-development\/django\" target=\"_blank\" rel=\"noopener\">desenvolvimento em Django<\/a>. Ele permite que voc\u00ea programe mais rapidamente, com assist\u00eancia \u00e0 codifica\u00e7\u00e3o espec\u00edfica para o Django, navega\u00e7\u00e3o e refatora\u00e7\u00e3o por todo o projeto e suporte total a templates do Django. Voc\u00ea pode se conectar com o seu banco de dados com um \u00fanico clique e trabalhar com frameworks de TypeScript, JavaScript e front-end. O PyCharm tamb\u00e9m \u00e9 imediatamente compat\u00edvel com o Flask e o FastAPI.\u00a0<\/p>\n<p>Crie aplicativos melhores e otimize o seu c\u00f3digo. Comece a usar o PyCharm agora mesmo, para ter uma experi\u00eancia de desenvolvimento sem esfor\u00e7o no Django.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/pycharm\/web-development\/django\/\" target=\"\" rel=\"noopener\">Comece a usar o PyCharm Pro gratuitamente<\/a><\/div>\n<\/div>\n\n\n<p><em>Artigo original em ingl\u00eas por:<\/em><\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/03\/evgenia-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Evgenia Verbina\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Evgenia Verbina<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":573239,"comment_status":"closed","ping_status":"closed","template":"","categories":[1401,8377],"tags":[963],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/573237"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=573237"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/573237\/revisions"}],"predecessor-version":[{"id":573252,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/pycharm\/573237\/revisions\/573252"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/573239"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=573237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=573237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=573237"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=573237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}