E aí pessoal tudo tranquilo nesse vídeo você aprenderá como trabalhar com o Django desde o início criaremos um projeto prático que será usado como base para apresentar os principais conceitos do frame Como por exemplo o que é um projeto de ângulo O que são apps o sistema de rotas templates models e muito mais na descrição do vídeo você encontra o link para o repositório do github com o código fonte produzido [Música] para já começar o nosso conteúdo vamos aqui para a tela do computador e Inicialmente vamos entender o que que é o Django né o
Jango ele é uma Framework é uma frame que nada mais é ali do que um conjunto de código escrito em uma determinada linguagem que vai te auxiliar a realizar determinados tipos de tarefas ou construir determinados tipos de aplicação o Django é uma Framework do ecossistema Python Ou seja é algo desenvolvido na linguagem Python feito para desenvolvedores Python e ele vai te auxiliar no desenvolvimento de aplicações web Além disso O Diogo além de ser que ele tem uma especificação né Ele é uma frameworkstack e o que que é isso quer dizer que o Django por si
só ele tem a ideia de te prover todas as ferramentas necessárias para esse tipo de tarefa que é o desenvolvimento web diferente de uma micro frame que Vai disponibilizar apenas o mínimo necessário então a ideia do Django é que somente com o Django você vai conseguir fazer a maioria das coisas que você precisa fazer no desenvolvimento de aplicações do Web e por isso que o Jungle é conhecido como seu frame que altamente produtiva porque ele já vai te entregar muita coisa pronta você não vai ter que se preocupar com os pormenores do desenvolvimento web e
conseguir se focar ali no que de fato é importante que a regra de negócio da tua aplicação inclusive aqui já na página inicial do Django ele fala né que o Jango ele faz ser simples a construção de aplicações web de maneira rápida e com menos código Além disso grande parte ali do que é vendido no Django né é que ele é extremamente rápido Ah ele já tem todos os mecanismos necessários para a segurança e também ele é fácil de escalar Ou seja você consegue construir uma aplicação que é fácil de ser aumentada né você conseguir
adicionar novos recursos Beleza então isso é o Junco e agora a gente precisa Então colocar a mão na massa e começar então a construir a nossa aplicação O que que a gente precisa ter na máquina basicamente o Python instalado e um editor de código fonte que no nosso caso vai ser o visor de coach Como eu disse na descrição do vídeo vai ter um link com todo passo a passo de como construir né montar esse ambiente de desenvolvimento na tua máquina Beleza então deixa eu vir aqui para minha área de trabalho a gente vai inicialmente
criar uma nova pasta que vai ser a parte onde vai ficar todo o conteúdo do nosso projeto né todo o nosso código fonte Então vou criar aqui uma nova pasta nessa parte eu vou dar o nome do nosso projeto aqui como uma ideia é ter apenas os primeiros passos né os fundamentos vai construir um projeto bem simples basicamente vai ser um projeto que a gente chama de crood né crud que é Create update ou seja uma aplicação que consegue cadastrar novos itens ler esses itens cadastrados atualizarem deletar esses itens tá E aí como exemplo a
gente vai utilizar exemplo clássico que é construir uma aplicação de lista de tarefas né uma twoodle list e aqui eu vou chamar esse projeto de Two Duos Então vou chamar pasta de tw tudo essa parte que eu acabei de criar a gente vai ter que abrir ela dentro do nosso editor de código fonte ou seja o visual Studio code Então vou aqui abrir o vs code Beleza tô aqui conversa com o olho aberto e aí a gente tem várias maneiras de conseguir abrir essa pasta dentro do vscote é uma forma mais simples é pegar essa
pasta que a gente acabou de criar arrastar para dentro do vs Gold soltar pronto mandei ela mais rápida de fazer isso toda vez que você abre uma passa na potência do vscold ele vai perguntar que se você confia nos autores dessa pasta a partir que eu criei então eu confio em mim mesmo até onde eu consigo pensar então Yes de Beleza então a gente já tem a nossa parte aqui criada O que que a gente precisa fazer agora basicamente nós precisamos instalar o Django porque o Django ele é uma biblioteca no final das contas Então
ela precisa ser instalada e utilizar a ferramenta do Jungle para criar a estrutura principal do projeto na estrutura base do nosso projeto bem o ponto é para fazer a instalação a gente utiliza uma ferramenta chamada PIP que é o gerenciador de pacotes do Python a questão é que a gente não vai fazer essa instalação diretamente por quê quando a gente utiliza o PIP para fazer a instalação de algum tipo de pacote Esse pacote nessa biblioteca ela vai ser instalada dentro do nosso instalação Global do Python isso não é recomendado porque imagina só cada ferramenta cada
biblioteca possui em várias versões e dependentes né ou seja uma biblioteca pode precisar de outras bibliotecas para funcionar se eu faço a instalação de forma Global eu posso acabar gerando alguns problemas de conflito e o problema principal é que imagina que você tá trabalhando em dois projetos de Jungle ao mesmo tempo um desses projetos utilizando na versão 4 e o outro projeto utilizando na versão 3 Toda vez que você precisar mudar para trabalhar em um novo projeto você vai ter que desinstalar a versão do Diante que você tem atualmente instalar nova versão isso é muito
trabalhoso não faz muito sentido e vai ser muito provável de acabar gerando algum tipo de erro de conflito dentro do teu ambiente tá então o ideal é a gente criar um que a gente chama de ambiente virtual que é um local reserva ali que vai ter apenas as dependências daquele projeto e que não vai sujar digamos assim a nossa instalação Global do Python na nossa máquina tá então para isso a gente vai precisar utilizar o terminal agora então eu vou utilizar o Terminal Integrado do próprio vs code tá então você pode vir que aí viu
terminou ou no meu caso aqui eu tenho um atalho que é contra aspas simples né ele já vai abrir aqui o terminal e ele vai abrir o terminal a integrado que no meu caso como eu tô no Windows vai ser o powershell uma vez com o terminal aberto a gente precisa criar o nosso ambiente virtual para isso a gente utiliza o comando tá então menos M vem ponto vem até veja que ele criou uma pasta chamada ponto venve que que esse comando faz eu tô executando interpretador do Pai então utilizando a Flag - M que
quer dizer mod ou isso seja eu tô utilizando um módulo do Pai então que é o modo venve que é o modo responsável por gerenciar ambientes virtuais e logo em seguida eu estou dando um nome para esse meu ambiente virtual você pode dar o nome que quiser pode ser Joaquim Joaquim qualquer coisa mas por convenção a comunidade utiliza o nome.vem tá que é Ponto V de virtual e em vídeo invarment né ambiente virtual essa pasta ela vai ter mais ou menos essa estrutura mas ela pode mudar de acordo com o sistema aqui eu tô no
Windows Então ela tem essa estrutura se você tiver no Linux ou no Mac iOS a estrutura de pastas vai ser um pouco diferente essa parte você pode pensar como se fosse a tua instalação do Python só que é uma espécie de cópia da instalação Global isolada para esse projeto em específico e é nessas pastas que vão ficar as nossas bibliotecas uma vez que o ambiente virtual foi criado a gente precisa ativar esse ambiente virtual a outro ponto que eu não posso esquecer de falar esses comandos variam de sistema para sistema tá Esse comando é o
comando que a gente utiliza no Windows no Linux o comando ele vai ser um pouquinho diferente em vez de pai então você vai utilizar pai então 3 tá isso se você tiver no Linux ou no Mac iOS mas naquele documento que eu vou deixar na descrição do vídeo vai ter todas as informações e os comandos respectivos para cada um dos sistemas tá uma vez que o ambiente virtual foi criado a gente precisa ativar esse ambiente virtual e aqui a gente vai utilizar o comando vende né ponto barra ponto vem viu depois scripts activate tá dessa
maneira aqui Dom enter vou ter um erro o comando ele tá certo tá não é que o comando teve algum tipo de problema mas eu deixei esse acontecer porque provavelmente vai acontecer com muitos alunos e aí eu já quero mostrar isso para mostrar como resolver tá esse erro é um erro do Power Shell o Power Shell por padrão né que é um dos terminais aqui utilizados no Windows ele tem uma restrição de segurança que evita a execução de scripts externos e como é que eu sei disso eu posso executar aqui um comando get é que
dizer que o champólice não precisa você fazer isso na tua máquina tá só tô mostrando e veja que ele tá aqui como restrictation então a política de execução dentro do poshéu ela tá como restrita então não consigo executar coisas externas e aqui para a gente conseguir resolver esse problema a gente vai ter que alterar a polícia a política de execução dos Comandos tá para isso basicamente a gente precisa executar aqui um comando que é o eu sei o comando um pouco grande mas eu vou deixar ele naquele documento tá e também na descrição do vídeo
só para vocês copiarem e colarem executa Esse comando beleza ele não vai aparecer nenhuma saída aqui no terminal E aí eu posso executar novamente o comando de ativação do ambiente virtual e veja que não deu mais nenhum problema e agora na frente aqui aonde vem o caminho da parte da atual eu tenho aqui entre parênteses justamente o nome do meu ambiente que é ponto vende isso identifica que um ambiente ele tá ativo a partir desse momento com o ambiente ativo toda a instalação de pacotes Python que eu fizer vai ser feita dentro do ambiente virtual
beleza novamente Esse comando aqui vem escritos Ultimate ele é específico para o Windows tá no Linux e no Mac iOS para você ativar o ambiente virtual você vai fazer surf barra bem barra aqui te vejo tá o comando vai ser dessa maneira mais novamente eu vou deixar os comandos de acordo com cada ambiente no documento de instruções beleza a partir de agora não vai haver mais diferença de comandos tá todos os comandos que a gente executar vão ser iguais tanto para o Windows problemas ambiente virtual criado e ativo que a gente precisa fazer a instalação
do pytho E lembra que eu disse que a gente faz ela através de um de um carinha chamado PIP que é o gerenciador de pacotes do Python a gente utiliza estou e o nome do pacote que é o Django do enter e o PIP ele vai buscar lá no repositório de pacotes Python Esse pacote chamado Django vai realizar o download dele e instalar dentro do nosso ambiente virtual beleza e aí basicamente a gente precisa esperar tudo acontecer Pronto ele já finalizou ó se a gente olhar aqui dentro de vanv aqui em Lib veja que a
gente tem sites e tem várias pastas agora que foram criadas Inclusive a partir do Jungle essas pastas aqui são justamente o pacote que a gente acabou de baixar tá Então veja que ele foi instalado normalmente virtual e não o nosso diretório Global né dentro da instalação Global do Python Beleza então agora que o Django já está instalado a gente pode utilizar o comando do Django para criar o nosso projeto e ele vai criar a estrutura básica desse projeto tá então utiliza o comando Django admin start Project né então eu tô utilizando o comando do Django
e um subcomando chamado start Project para iniciar um novo projeto logo em seguida a gente dá o nome desse projeto porém basicamente com esse comando vai fazer é criar uma pasta com alguns arquivos de configuração E aí algumas pessoas da comunidade e eu estou incluso nelas Prefiro não dá o nome do projeto e sim chamar essa pasta sempre de setup isso não é uma prática que é obrigatória tá muita gente chama pelo nome do projeto mesmo então a gente colocaria TW tio Duos aqui mas é a prática que eu costumo seguir eu gosto que é
chamar sempre de setup Porque nessa ele vai criar uma parte chamada setup com as configurações do projeto Depois te digo administrativo setup a gente coloca um ponto aqui no final tá esse ponto é importante para que ele não crie uma pasta a mais que seria o comportamento padrão e essa pasta mais é desnecessária Porque a gente já criou a pasta Twitter Deus então aqui eu posso dar um enter ele não vai exibir nada no terminal mas veja que ele criou aqui um arquivo chamado manage ponto pai esse arquivo a gente vai utilizar ele bastante mas
a gente não vai editar esse arquivo é um arquivo onde o Django consegue carregar ali as coisas que ele precisa carregar para poder funcionar e o setup que é a pasta principal do nosso projeto a gente tem algumas configurações beleza inclusive um arquivo que a gente vai mexer bastante que é o settings que tem algumas configurações mais globais aqui do nosso do nosso projeto beleza feito isso o nosso projeto já tá criado e a gente pode executar o projeto para ver ele funcionando então vou voltar aqui no terminal e agora o Jango admin Esse comando
de mim a gente utilizaria uma única vez na criação a partir de agora tudo a gente vai fazer da seguinte forma pai então pai aqui não precisa esse ponto barra só colocar menos ponto que já funciona E aí o nome do comando tá então isso aqui é meio que equivalente a utilizar de ângulo admin só que agora eu tô utilizando pelo menos ponto par que é o contexto da minha aplicação da do meu projeto então parto menos de quanto pai Run server Esse comando vai executar o servidor de desenvolvimento do Django para a gente já
viu o projeto funcionando ele vai aparecer aqui umas mensagens de vermelho Mas a gente pode ignorar por enquanto então agora eu posso abrir o meu navegador e acessar localhost 2 pontos 8 mil e veja que vai aparecer essa telinha aqui do Django informando aqui a instalação ela funcionou com sucesso e que a gente tá vendo essa página porque a gente está com the bug ativo né com o a funcionalidade de ativa lá no nosso na nossa configuração Isso prova que o Jungle foi instalado e ele está funcionando para garantir Inclusive eu posso parar esse servidor
para isso vem aqui no terminal e pressiona control c ele vai parar o servidor de desenvolvimento Se eu tentar acessar o localhost 2.8000 com um servidor parado veja que ele vai carregar carregar não vai dar nada e vai dar aqui um erro de conexão né Ele disse que a conexão foi recusada então de fato o nosso projeto funcionou só algumas configurações que eu acho interessante já de fazer agora é vir aqui no settens.py descer lá para o final do arquivo e mudar isso aqui ó lá em inglês Coach tá vendo que ele tá como é
n e o s ele tá como o inglês dos Estados Unidos a gente vai mudar para PT traço BR que é o português brasileiro e também alterar aqui o time Zone tá ativar o time Zone da nossa região né da sua região esse time Zone ele tem padronizado eu vou deixar um link de referência na descrição do vídeo para você ver quais são os possíveis camisões que você não pode colocar qualquer informação aqui mas eu sei que o meu time Zone é da minha região é o América barra Fortaleza e aí tem por exemplo América
Barra São Paulo existem outros para o Brasil né mas são valores específicos você não pode colocar qualquer cidade aqui tá bom mas eu vou deixar o link como referência de quais são os times antes possíveis de colocar aqui nessa configuração feito isso eu vou executar novamente o projeto lá no terminal então tá então voltando aqui no navegador e atualizando veja que agora tá em português né então inclusive ele já tem ferramentas aí para você conseguir trabalhar com internacionalização né fazer com que tua aplicação ela funciona para múltiplos idiomas e inclusive outras coisas como configuração de
moeda enfim coisas do tipo é bem legal por isso que ele se vende como a Framework free steck porque ele vai te dar todas as ferramentas necessárias Beleza então basicamente é isso né a gente já tem aqui o nosso projeto criado e executando corretamente então nesse vídeo a gente vai dar continuidade ao nosso projeto e o objetivo da aula de hoje é entender a estrutura de projeto de Jungle entender também Qual a diferença entre uma app e um projeto que é um são dois conceitos que a gente tem bastante aí dentro de aplicações com o
diálogo e também já criar nossa primeira página para entender basicamente ali como é que funciona o fluxo de requisição e resposta dentro de uma aplicação de ângulo Beleza então é isso informações passadas vamos lá para o nosso código né então eu já tô aqui conversa code aberto também já estou com meio ambiente virtual ativo e só para deixar claro vocês vão ver algumas diferenças tá vocês vão ver o terminal tá um pouco diferente e basicamente isso é porque eu tô utilizando aqui um outro ambiente tá eu tô utilizando a máquina Linux por baixo dos planos
para programar eu prefiro utilizar o Linux e também vai ver esse arquivo aqui a mais que é um Git gnor caso você não conheça esse arquivo ele serve basicamente para dizer aqui o que que tem que ser ignorado pelo pelo sistema de direcionamento de código que é o Gui tá bom Mas duas coisas aí que não vão interferir no teu processo de aprendizado tá os comandos vão ser o mesmo e você não precisa desse arquivo Git Ignore para programar no Django Beleza então é isso primeiramente vamos entender um conceito que eu acho muito importante que
é onde app e Project o Jungle ele divide as os projetos das aplicações nesses dois conceitos Project e app O que que é uma app uma app dentro do Django é um pedaço do projeto como um todo que tem tudo aquilo que é relacionado a um determinado contexto vou dar um exemplo para ficar mais claro isso imagina que você está desenvolvendo um blog né então num blog o que que ele tem ele vai ter por exemplo toda a parte de gerenciamento de artigos para você conseguir criar um artigo publicar um artigo editar e excluir enfim
mas você também vai ter muito provavelmente ali a parte de gerenciamento de usuários Quem são usuários que podem utilizar esse blog que podem escrever artigos que podem revisar publicar ou até mesmo usuários que podem comentar em um artigo Então veja que a gente tem duas partes diferentes do mesmo projeto uma parte gerenciar os artigos e outra parte gerencia os usuários por mais que ela se relacione entre si são coisas diferentes e isso é basicamente a divisão que o Junco permite você fazer então a gente poderia pensar aqui toda parte do código que é gerenciada que
gerencia os artigos é uma app e a parte do código que gerencia os usuários é uma app separada né uma outra app e um projeto no diálogo nada mais é do que um conjunto de várias apps que trabalham é um interagindo com a outra né a gente pode além Vamos pensar por exemplo um e-commerce né uma loja virtual você vai ter gerenciamento de produtos gerenciamento de categorias gerenciamento de usuários de pedidos tudo isso pode ser separado em apps diferentes que conversam entre si e o projeto do e-commerce é o conjunto dessas apps Beleza então no
momento que a gente tem apenas a estrutura básica de um projeto a gente não tem uma app ainda e na Epic que a gente vai ter de fato toda a regra de negócio da aplicação aquilo que vai ser responsável por mexer com o banco de dados para exibir as nossas páginas web vai estar dentro de uma app ou de múltiplas apps separadas tá como nosso projeto é simples a gente vai ter basicamente duas apps Tá mas na real vai ser meio que só uma a outra app vai ser mais só para organização do código então
vamos ver como é que cria uma App no jogo então vou abrir aqui meu terminal Lembrando que o virtual em ambiente virtual tá ativo e a gente vai utilizar aqui o comando Python manage contra o pai start app a gente utilizou start Project para criar o projeto o start app para criar uma app e a gente dá um nome para esse App geralmente a gente vai dar um nome que faz sentido para o contexto né de que ela tá trabalhando a nossa epi vai ser app responsável pelo gerenciamento de tarefas aqui eu gosto de programar
utilizando terminologias em inglês tá então eu vou chamar essa app de shoodus geralmente a gente coloca o nome das apps no plural então pai também deixa muito pai start app de um enter veja que ele criou aqui uma nova Parte é chamada twoods com uma outra estrutura de pastas aqui e beleza app foi criada e agora essa época ela já faz parte do nosso projeto na verdade não a gente vai precisar fazer uma configuraçãozinha mas vou mostrar já já o que eu quero falar agora uma vez que a gente entendeu esse conceito de projeto e
jipe é sobre a estrutura de pastas de um projeto Então vamos entender para que que serve essas pastas e os arquivos dentro dessas pastas inicialmente dentro aqui da parte principal a gente já tem o manage ponto Paio né Eu cheguei a falar sobre isso no vídeo anterior mais ou menos quanto o pai é o arquivo necessário para carregar ali todo o contexto de execução do Django por isso que a gente utiliza sempre o comando Python mana de outro país e executa esse arquivo para ele conseguir carregar todos os módulos de configuração do Django e realizar
os comandos corretamente Com base no teu projeto atual depois nós temos a nossa pasta setup que é a pasta inicial do nosso projeto né onde tem todas as configurações iniciais nós temos aqui alguns arquivos como o danderinite Né que é um arquivo necessário aí para definir módulos do Python então isso aqui não é necessariamente do diabo é uma coisa do próprio Python mas entrando já especificamente no dia a gente tem um arquivo que é o arquivo de configuração principal tudo de configuração do Projeto vai estar aqui a gente já vem com várias configurações né como
configuração de quais são as apps instaladas e veja que a gente tem várias apps aqui que são apps que vem do próprio Jungle com código pronto a configuração de mídias que são blocos de código que vão realizar configurações dentro do nosso projeto Entre cada requisição que foi feita para aplicação né isso aqui são coisas um pouco mais avançadas para se trabalhar a configuração dos templates a gente tem configuração do banco de dados é configuração de validação de senhas dentro do sistema são configurações que a gente jogar mexer como as configurações de internação né como a
qual língua ficou de time Zone e arquivos de configurações também de arquivos estáticos né então tudo que a configuração do Projeto vai estar aqui dentro desse Sedex ponto pai depois nós temos o arquivo url.y esse arquivo é o arquivo principal de rotas onde você vai definir Quais são as urls do teu projeto veja que ele define por padrão uma única URL chamada admin então se eu tentar acessar lá coloca o roxo dois pontos 8 mil barra de mim eu vou ter alguma coisa que vai ser executada porque essa rota foi configurada aqui no meu arquivo
de URL .ly e a gente tem dois arquivos com nomes um pouco estranho né que é o WS esse isso aqui né wsgi é um padrão que a gente tem dentro do Pai então que diga ensina né diz como que a comunicação entre um projeto Python e aqui projeto pai então no geral Não especificamente do Jango tá um projeto pai então consegue conversar com um servidor de aplicações web então odiando ele já te entrega esse arquivo pronto para que a tua aplicação no teu projeto de ângulo consiga ser colocado em produção com diversos servidores de
aplicação web que conhecem esse padrão do Python E aí a gente tem o wsgi e o a sgi o sgi é a mesma ideia só que ele é específico para aplicações assincronas né que utilizam programação A5 né o nosso caso a gente vai basicamente criar uma aplicação síncrona tá então em teoria o que seria utilizado seria o wsgi mas em teoria porque isso só vai ser necessário quando você trabalha em colocar a aplicação para a produção ou seja Coloca ela dentro de um servidor que vai servir a aplicação para o teu usuário final e aqui
a gente tá sempre em ambiente de desenvolvimento Então não é uma coisa que a gente tem que se importar agora Mas no geral você vai mexer no arquivo de sentem-se no arquivo de URL raramente você vai mexer no SG ou no wsg beleza E aí a gente tem a estrutura de pastas das apps que ela geralmente seguem a mesma ideia tá pode ter um arquivo mais ou menos dependendo do contexto Mas no geral quando você cria app você tem isso aqui então vamos lá o danderinite já falei é coisa do pai então não necessariamente do
Django a gente tem um arquivo Ai de Mim ponto pai que é o arquivo de configuração do admin então lembra que eu mostrei lá no setup a gente tem por exemplo algumas apps já do Django uma dessas raps é o admin que é um painel administrativo que o Jungle já te entrega por completo E aí configurações desse admin a gente faz dentro de cada uma das apps através desse arquiva de 1.5 isso não é o que a gente vai mexer nesse nesses vídeos tá no nosso foco falar aqui sobre admin então podemos passar diante depois
nós temos o apps.p esse arquivo ele vai ter configurações específicas daquela app então aqui eu tenho configurações específicas da minha epitus Então veja que ele tem uma classe chamada config com algumas configurações básicas e o uma configuração que diz qual que vai ser o tipo de dado padrão do identificador dos meus modelos né Depois nós temos um models ponto pai nesse arquivo você vai colocar a sua os modelos da tua app na camada de modelos e aí já já vou explicar o que que são esses modelos né Depois a gente tem o testes ponto pai
que onde você vai colocar testes automatizados para essa app e havia os ponto pai que a gente vai trabalhar na camada de vídeos e eu também vou explicar Logo logo o que que é essas camadas tá bom e depois a gente tem um arquivo degraus que vão ficar as migrações daquela app e quando a gente for falar sobre models eu explico melhor sobre essa mycration porque senão vai trazer informação Mas vocês vão acabar ficando confuso Tá mas essa é a estrutura básica que a gente tem dentro de um projeto beleza porém a gente não vai
precisar de tudo que tem aqui tá como eu disse a gente não vai mexer com admin e também a gente não vai trabalhar com testes automatizados então Inclusive eu posso apagar esses arquivos tá então posso ganhar de mim e também aqui em testes e beliche você poderia deixar também tem problema nenhum mas eu gosto de apagar para não ficar arquivo demais aqui dentro do meu projeto tá e basicamente é isso que a gente vai deixar né o apps do modelsing Beleza então é isso entendido a estrutura básica de projeto de ângulo a gente pode seguir
adiante para criar nossa primeira tela né nossa primeira página para ver como é que funciona o fluxo aqui do Django primeiramente lembra que eu disse que a ep ela foi criada mas não necessariamente ela faz parte do projeto ainda isso porque as apps elas precisam ser instaladas a ideia principal das apps é que elas sejam modulares Ou seja você cria uma app mas essa app ela pode ser utilizada em múltiplos projetos múltiplos projetos de jogos podem utilizar essa mesma app né então A ideia é que ela seja uma coisa acoplável né você possa recriar por
um projeto mas reutilizar para um outro caso seja é pertinente né faça sentido então aqui dentro de settens ponto pai nós temos essa configuração que chamada de estolat apps que são as apps instaladas no momento veja que eu tenho algumas que são PIS do próprio Jungle né todas começam aqui com o diabo Então tem um admin o alfa contatos são apps que vem do próprio Jânio mas eu não tenho nenhuma app aqui que diga que eu tenho um app Chamado de Deus Então ela tá dentro do minha estrutura de projetos mas ela não faz parte
do projeto ainda eu preciso instalar essa app para instalar essa app eu basicamente altero essa configuração então aqui ó depois eu coloco mais uma linha e coloca uma string que vai ter ali a definição da minha época tem duas formas de fazer isso eu posso só colocar o nome da APP dessa maneira já seria o suficiente mas eu gosto de seguir o que tá na documentação que é colocar o caminho completo então eu coloco o nome da pasta ponto aí veja que dentro da pasta tem o arquivo apps então depois eu coloco ponto apps ponto
o nome da classe de configuração que a classe shoodus config beleza eu gosto de fazer dessa forma mas se colocar só que o doce também funciona Tá mas eu prefiro Essa maneira que Inclusive a maneira recomendada na documentação feito isso app de fato agora tá instalada e ela sim faz parte do nosso projeto tá beleza feito isso agora sim a gente pode começar a trabalhar dentro dessa app de luz e o que eu quero mostrar aqui é simplesmente criar uma página do Jungle bem simples só dando um hellow hoje aí né então para isso a
gente precisa entender como é que funciona a divisão de responsabilidades dentro do Junco o Django ele utiliza um padrão de arquitetura chamada de MTV Model template viu cada uma dessas camadas né a camada tem cliente a camada viu possuem responsabilidades a camada Model é a camada relacionada a nossa base de dados então na camada moda eu vou ter classe spayton que vão representar as entidades que a minha aplicação trabalha a gente tá querendo aplicação de lixo de tarefas Então dentro da camada de moda eu vou ter uma classe que vai representar uma tarefa lá no
banco depois nós temos a template né que é o t do MTV a template é a camada de visualização dos dados é a camada de interação é por onde o usuário vai interagir com aplicação as nossas páginas web ou seja arquivos HTML arquivos de template HTML e por fim a camada de views que é quem vai fazer a cola digamos assim entre essas duas camadas a camada de View é quem vai ter todo o código necessário para dizer o que que tem que ser feito quando a determinada requisição for feita então quando o usuário coloca
lá no navegador o nosso nosso site barra home por exemplo o que que tem que ser feito o que que tem que ser feito no banco de dados O que que tem que ser retornado para o usuário que fez essa requisição isso vai estar na camada de vírus Beleza então para começar a trabalhar aqui e a gente vê o básico a gente vai trabalhar basicamente com a camada de vírus e com a camada de template tá a camada de modo a gente vai deixar para mais para frente então vamos aqui envios e envios a gente
tem várias formas de trabalhar mas inicialmente eu vou mostrar aqui uma maneira que através de funções então cada viu vai ser não necessariamente precisa ser mais no momento sim uma função que vai dizer o que que tem que ser feito quando a requisição for feita né Para nossa aplicação então eu vou criar aqui uma função utilizando o defe que eu vou chamar de home essa função necessariamente precisa receber um argumento né chamado request na verdade o nome não é importante mas ele vai receber um argumento que vai representar a requisição que foi feita pelo cliente
comumente a gente chama de request mas não é necessário ter esse nome tá E ela tem que retornar uma resposta http ela tem que retornar alguma coisa então aqui eu vou utilizar um Ritter e por enquanto a gente não vai utilizar essa importação eu vou importar aqui from Django htp imports http resposta eu vou retornar uma Instância desse então http responde é que eu vou colocar só uns 30 Olá treina web do nada né Mas beleza basicamente essa estrutura básica de um avião ela é uma função que recebe uma requisição e Retornam resposta é isso
porém veja que nenhum momento eu tô dizendo qual que é a rota que isso aqui executa quando é que esse home tem que ser executado é quando eu fizer uma requisição para Barra home barra clientes barraco Duos eu não sei não disse isso ainda E aí para isso que serve aquele arquivo de URL né então aqui no RL a gente configuras da aplicação Então dentro desse arquivo eu vou primeiro apagar esses comentários aqui são necessários eu vou importar a minha viu então vou dizer o seguinte olha from ponto fios em porte homem e aqui ó
dentro desse URL paternos eu vou definir um novo padrão de URL Então vou colocar aqui ó PF vou colocar um string vazia porque eu quero que seja a rota barra a rota principal da nossa aplicação ela vai Executar a minha viu homem bem basicamente é isso que a gente precisa fazer então com isso agora já defini Qual é a URL que vai executar essa View aqui em específico tá beleza acho que é isso vamos aqui no terminal vou executar aqui o Python Manager Levanta a nossa saída de desenvolvimento deixa eu abrir aqui então o meu
navegador e agora quando eu acessar a loca roxo 8000 eu vou exibir aqui o texto olá para mostrar para vocês Olá perfeito né só que aqui não tá muito legal eu tô retornando um texto um texto no geral a gente vai querer exibir HTML né Então queria por exemplo colocar isso aqui dentro de H1 a gente poderia fazer o seguinte olha colocar aqui um H1 na mão uma tag H1 aqui sem problema nenhum salvar o servidor de desenvolvimento então ele identifica quando um código foi um edificado e já reinicia o servidor não preciso parar e
executar novamente tá se eu voltar aqui no navegador e atualizar ele não só vou deixar aqui não é barra 1 né é H1 barra 1 escreve htm certo também para funcionar né atualizei veja que agora sim eu tenho um HTML mas meio complicado né eu escrever um HTML inteiro dentro de um string não vai ficar legal e aí que a gente entra na outra camada que a camada de templates Então olha só aqui dentro de tudo eu vou criar uma nova pasta ali O folder templates dentro de templates eu vou criar mais uma outra parte
chamada tio Duos e eu sei que isso é estranho mas é assim que a gente faz dentro de cada app de criar uma página chamada templates e provavelmente uma pasta com o mesmo nome da APP e aqui dentro eu vou criar um arquivo chamado home ponto html E aí nesse arquivo eu vou colocar meu HTML que eu quero exibir então eu posso colocar aqui ó um H1 Olá web salvei vou voltar aqui navios e em vez de retornar um htp responde eu vou utilizar essa funçãozinha aqui que já estava importado Olha a função render essa
função render que que ela vai fazer ela vai renderizar um template do Django Então eu preciso passar aqui como primeiro argumento a própria riquest e como segundo argumento o nome do meu template o meu template Ele tá em tudo isso barra home.html home ponto HTML pronto feito isso salvei se eu voltar aqui na verdade atualizar veja que o resultado é o mesmo e só para garantir que de fato isso que tá funcionando Olha só eu vou colocar um outro texto estou aprendendo Jango na treina web salvei voltei aqui e atualizar veja só de fato tá
vindo a partir do meu arquivo HTML que é um template de ângulo separado então a gente consegue ter uma melhor separação como eu vou mexer com HTML fica muito mais fácil de conseguir trabalhar com HTML em vez de utilizar uma string pura aqui dentro da minha camada de vírus tá e basicamente essa estrutura né o fluxo que a gente tem dentro de uma aplicação de ângulo você tem no arquivo de URL a definição de quais são as rotas existentes e para cada rota qual avio que tem que ser executada na camada de vírus você vai
ter o que que tem que ser feito quando aquela viu executada no caso aqui eu tenho que renderizar um template e não template eu vou ter ali o HTML que deve ser exibido para o meu usuário final Beleza então vamos lá como eu já tinha falado o Model nessa camada Model ela é a camada ali que tá linkada diretamente ao banco de dados Então a gente vai ter dentro dessa camada classe spayton que vão representar as entidades que aplicação do trabalho por nosso caso a gente está querendo aplicação de tarefas né uma too do list
então na nossa aplicação a gente vai ter um modelo que vai ser um modelo de modelo de tarefa Então dentro da nossa ep de Deus nós vamos ter aqui o arquivo models e aqui que nós colocamos os nossos modelos da aplicação então como eu disse que Todo modelo é uma classe Python Então vou utilizar aqui ó IC toda a classe todas as classes da camada de modelo para serem reconhecidas como modelo elas precisam arredar de uma outra classe que vem do próprio Junco que a classe Model inclusive já tem uma importação aqui do módulo models
que vem aqui de ângulo.db então aqui nós vamos herdar de models ponto Model beleza uma vez que a classe ela foi definida a gente pode pensar que a classe Ela Vai representar diretamente a tabela do banco de dados e cada uma das colunas desse banco dessa tabela do banco de dados na nossa classe payton vão se transformar em atributos da classe então por exemplo o que que a gente vai ter uma tarefa a gente vai ter o título da tarefa a data que ela foi criada a data de entrega a data em que ela foi
finalizada e talvez no status né Se ela já tá se ela foi entregue se ela tá pendente se ela tá atrasada aqui a gente vai trabalhar basicamente com o título a data de criação a data de entrega né a deadline seria a data ali prevista para entrega e de fato a data em que ela foi finalizada o status a gente vai trabalhar mais esse status vai ser dinâmico com base nas informações que a gente já tem Tranquilo então nós vamos ter aqui um Tyler Tá eu vou utilizar sempre termos em inglês porque eu costumo fazer
assim então esse tyle vai ser o que no banco de dados a gente pode pensar que esse Type ele vai ser um chafield ele vai ser um campo ali que vai ter caracteres de texto né então para a gente representa isso dentro do modelo do Django nós vamos utilizar classes que fazem parte desse módulo de models então utilizando modo e os pontos tá ele vai ser ali no caso do banco de dado vai transformar em um vai achar né dependendo do banco está sendo utilizado aí dentro desse chafield a gente pode passar aqui alguns argumentos
né no Construtor para configurar esse campo então por exemplo eu posso passar aqui um Max lá enfim Quanto quantos caracteriza eu posso colocar no máximo dentro desse Campo aí eu vou dizer que eu posso utilizar no máximo 100 eu tenho outras informações Como por exemplo o nu e eu vou colocar ele como falsi então tô dizendo que esse campo lá no banco de dados ele não pode ter valores nulos eu tenho também o Blank que eu vou também colocar como falso ou seja eu não posso ter valores em branco ou seja eu não posso cadastrar
um título de um que seja apenas espaços em branco ou um string vazia é um string vazio espaços e branco são diferentes de nu mas aqui nesse caso utilizando o Blank a gente não vai permitir isso mas vamos ter também a data de criação que eu vou chamar aqui de created a data que ele foi criado vai ser um models ponto desde timefield né data e hora tem tanta informação da data quanto a informação do tempo no dente está em fio e a gente vai utilizar uma coisa interessante ele vai ter a data em que
a tarefa foi criada então é meio estranho que o usuário definisse manualmente e que seja feita de forma automática o próprio dele está em Field ele tem um campo chamado autoral add e eu coloco ele como troll então isso aqui eu tô dizendo aqui na hora que esse tudo focadastrado o criei vai ser definido de forma automática como aquele aquele específico em que ele foi feito o cadastro tá naquele momento também vou colocar aqui as informações de novo igual a falsa e Blank igual a falsa nós vamos ter a data de entrega que é a
deadline quando é que eu espero fazer entrega daquela tarefa Então deadline vai ser também um date timefield nesse daí não vou colocar outro novo que é assim é aqui de fato o usuário vai definir qual vai ser a data de entrega daquela tarefa eu vou definir apenas que ele vai ter um do falso e um Blank igual a falso beleza além da data de entrega a gente tem de fato a data em que ela foi finalizada Então vou utilizar eu vou deixar ele como truco porque não faz sentido quando eu criar a tarefa eu já
tenho que dizer a data que ela foi finalizada se ela não foi finalizada ainda né então é isso aqui que a gente tem para criar um modelo né eu criar uma classe esse modelo essa classe ela vai herdar de modo e os ponto móvel e os atributos dessa classe vão ser transformadas ali em Colunas da tabela do banco de dados e para definir esses tipos a gente vai também utilizar classes desse módulo models que vem do diabo.db beleza com isso a gente já tem o nosso modelo pronto e agora como é que eu faço para
isso aqui se transformar em uma tabela do banco de dados se a gente reparar desde a primeira execução do projeto foi criado um arquivo Chamado dbsqlight 3 da onde é que vem esse arquivo se a gente falar em settings nós vamos ver que aqui embaixo nós temos uma configuração de databases que a configuração dos bancos de dados utilizados pela aplicação e veja que ele tá utilizando aqui como end o sqlight 3 que é um banco de dados em arquivo e o nome desse banco de dados é DB acontece que lá de três justamente o arquivo
que foi criado isso aqui é o nosso banco de dados tá não é o ideal para ambiente de produção mas para ambiente de desenvolvimento é muito bom porque você não precisa ter um sgbd como uma SQL instalado na máquina para conseguir criar os seus projetos se a gente for olhar esse banco de dados E para isso eu recomendo que você tenha uma extensão instalada chamada sqlite viller tá procura que nas extensões vs code essa que Lite viu e instala essa extensão ela é muito boa porque ela permite que você consiga ver a estrutura de um
banco de dados com essa intenção instalada quando eu clico aqui no arquivo DB ponto escalar de 3 eu consigo abrir aqui quais são as tabelas do banco e veja que eu não tenho nenhuma tabela Então eu preciso criar essas tabelas do banco de dados Eu Preciso Dizer para o Django fazer o seguinte olha para os modelos definidos dentro da tua aplicação dentro do projeto e transforma isso de fato em tabelas do banco de dados então para isso a gente vai vir aqui no terminal e vamos utilizar o comando Python do pai my Grace veja que
ele aplicou várias migrações aqui e agora a gente vai entender o conceito de migrações também Então olha só se eu voltar aqui no DBS 3 Ele criou um monte de tabela veja só ele criou aqui um Jungle my greations então primeiro a gente precisa entender o que que são migrations o Django ele não vai criar a tabela do banco de dados só porque o modelo existe porque não é um modelo que define com a tabela tem que ser criada O que define que uma tabela tem que ser criada é uma coisa que a gente chama
de migration migração inclusive dentro da nossa época nós temos uma parte chamada my glations que não tem nada dentro né só o arquivo do limite o que acontece é que eu preciso dizer para o jogo criar essas migrações só que veja que um monte de coisa foi criada no nosso banco de dados sem eu ter criado migração nenhuma essas migrações vem das próprias Apps do Django né lembra que quando a gente foi lá no ponto pai já tinham algumas apps instaladas essas apps são Apps do Django e elas utilizam o banco de dados e elas
têm as suas migrações já definidas então quando eu rodei ali o my great ele pegou essas migrações que não tinham sido executadas ainda e as executou O que eu preciso fazer é criar migração do meu tio Du então para isso a gente também utiliza um comando aqui do Django que é o Python manage tanto pai make migrations veja que ele falou aqui que criou a migração chamada Create Modern né é uma criação que vai criar esse modelo de tarefa se eu voltar aqui de uso migrations eu tenho agora um arquivo chamado 001 underline e nicho
esse arquivo é meu arquivo de imigração ele é quem de fato vai definir o que que tem que ser feito lá no banco de dados para criar esse modelo aqui Então veja que que ele faz ele algumas operações qual operação ele vai criar um modelo criar uma tabela Qual o nome da tabela tudo Quais são os campos dessa tabela ele vai ter o campo Haiti que ele já coloca automaticamente mesmo que eu não tenha definido aqui dentro do modelo o campo Titan e finished então ele já faz isso aqui todo de forma automatizada para gente
tá E com essa migração criada aí sim eu posso aplicar essa migração para de fato essa tabela ser criada no banco de dados E por que que tem toda essa volta né Por que que eu preciso criar um modelo criar migração e depois aplicar na migração Isso é para versionamento do banco de dados como esse sistema de migrações eu consigo ter versões do banco então eu tenho uma migração que representa a versão do banco é em um determinado estado da aplicação tem uma outra migração que é a versão do banco mais à frente isso permite
eu avançar e voltar versões do banco de dados sem que sem eu ter que fazer isso manualmente no banco né configurando o banco então a gente pode utilizar todo o Django para gerenciar o banco de dados de maneira completa Tranquilo então agora que eu tenho criada eu vou aplicar novamente então vai tomar neste ponto pai my great e veja que agora ele aplicou somente a migração do nosso Nossa repetidor porque ele já viu que as migrações das Apps do Jango né admin AlfaCon tem já haviam sido aplicadas ele aplicou somente a aplicação que estava faltando
né aplicou somente a migração que estava faltando que a migração que cria essa tabela de tudo se eu voltar aqui no db acontece 3 agora veja que eu tenho uma tabela chamada tio Duos underline to do porque esse nome é para evitar conflito ele sempre coloca o nome da APP Underline o nome do Model tá então aqui dentro Eu tenho meus Campos né tudo certinho perfeito aqui da maneira como é esperado tá então é isso né Isso é um conceito de modos Então os modelos são classes que representam essas tabelas do banco de dados e
dentro dessa Classe A gente vai ter atributos que vão representar as colunas desse banco de dados e as migrações é uma maneira da gente conseguir versionar o banco e aí o fluxo é você cria um modelo cria migração e aplica essa migração e isso vai permitir você poder avançar ou voltar a versões do banco de dados sem ter que fazer isso manualmente do banco mexendo com SQL tranquilo beleza é isso só que para a gente dá um complemento aqui a mais eu quero trazer algumas configurações que eu acho que são importantes para o projeto de
ângulo e eu acho legal aprender elas desde o começo por mais que aqui a ideia seja ainda ser muito introdutório sobre o assunto Tá primeiro o seguinte vamos Minimizar tudo isso aqui vamos aqui no ponto Pai olha só essa configuração aqui tá vendo é o 50 kg essa configuração é configuração relacionada à segurança não é interessante que esse tipo de configuração fique exposta no sistema tá diretamente no código então isso aqui é uma prática do jeito que tá agora é o ideal seria que essa configuração ela estivesse extraída e isolada em um outro local que
local é esse o nosso ambiente de execução no nosso caso a nossa máquina a máquina que está executando o projeto está desenvolvendo o projeto então o que que a gente vai fazer agora é configurar o Django para isolar essas configurações do ambiente que a aplicação tá executando tá dessa maneira essas coisas que são Segredo né digamos assim que não podem ficar expostas no código não vão ficar mais visíveis tá bom então para isso a gente tem várias formas mas a maneira que eu gosto de utilizar é usando uma biblioteca chamada Python de Campo tá então
vou vir aqui no terminal fazer o PIP install Python traço the cuple ele vai fazer aqui instalação no meu foi rápido porque ele utilizou Cash eu já tinha instalado essa biblioteca algumas outras vezes e uma vez que essa biblioteca está instalada eu vou criar um arquivo chamado ponto aqui na parte inicial do projeto e nesse arquivo eu vou colocar essas configurações voltando aqui no setup.y não eu vou copiar esse aqui ó tá vendo assim vou copiar isso aqui tudo e vou colar aqui no ponto Henry e vou deixar aqui apenas igual e eu posso inclusive
tirar aqui esses essas aspas simples ela deixar dessa maneira aqui e agora no século em vez de eu colocar isso aqui diretamente o que que eu vou fazer eu vou importar Então pronto config vou agora tirar esse string daqui vou chamar o config e passar justamente o mesmo nome que eu defini aqui no ponto Henry que é Secret aqui tá agora isso aqui tá externalizado tá não vai estar mais exposto dentro do código ponto importante esse arquivo ele deve ficar somente na tua máquina de desenvolvimento tá ele não pode ser exposto ou seja se você
tá utilizando o kit Hub dentro do Git gnor é importante que esse arquivo esteja listado nos arquivos que devem ser ignorados pelo pela ferramenta de gerenciamento de código tá diversamento de código que você está utilizando Além disso é legal a gente colocar outras informações também Como por exemplo o the bug aqui também então vou deixar aqui vou fazer a mesma coisa olha só confie the bug só que tudo que eu configure pega ele retorna como string tá então eu preciso dizer que eu preciso fazer um casting conversão para boleando e eu também vou dizer que
caso essa configuração não tenha sido definida lá no arquivo dela vai ser falso também algo interessante de ser colocado Então a gente vai fazer a mesma ideia vou copiar aqui o laudo hosts Vou colocar aqui dentro só que eu não posso colocar dessa maneira tá não posso colocar uma lista Então vou colocar aqui apenas um asterisco para dizer olha permite qualquer rosto de fazer requisição a minha mente de desenvolvimento aqui no lado do rosto a gente conseguir pegar isso eu vou precisar também importar aqui um carinha chamado csv tá essa classe csv que vai conseguir
converter esse formato aqui que vai ser separado por vírgulas no formato de lista então aqui eu chamo confie Acho até copiar eu coloco csv a gente também pode isolar a configuração do banco de dados tá tem uma boa prática também de fazer isso então aqui no banco de dados tá vendo que ele está exposto é um banco de dados em arquivo então isso aqui não é bem problemático mas quando a gente colocar isso aqui em produção por exemplo a gente vai ter dentro dessa configuração que informações que são privadas como por exemplo aonde é que
o banco de dados está localizado a senha de acesso isso não é muito interessante Então a gente também pode isolar esse tipo de configuração só que para isso a gente tem um uma pequena uma pequena problemática assim que a gente tem que resolver tá porque geralmente quando a gente coloca essas configurações de banco em variáveis de ambiente a gente utiliza um padrão de string de conexão que não é um padrão suportado pelo Jungle Então eu preciso fazer com que eu converta esse padrão de string de conexão para esse padrão que o Jungle utiliza E aí
para fazer essa conversão a gente vai utilizar uma outra biblioteca que eu vou instalar aqui através do PayPal que é o DJ traço data base até base URL se eu não me engano é assim deixa eu ver se eu consigo encontrar isso deu certo ele fez aqui o download do DJ Database o URL e olha só lá no começo eu vou fazer aqui a importação dele então from DJ data deles URL Import parse e aqui eu vou passar um atalho na verdade um eles né um apelido e em vez de chamar de passe vou chamar
ele como bebê feito isso aqui no nosso databases aqui onde a gente tem end na verdade na verdade foi o todo tá a gente vai apagar esse defeito vamos passar aqui o config vamos passar então uma configuração chamada data base underline URL vírgula vou passar aqui um defu que vai ser igual a um string que vai ser SQL Lite 2 pontos vou fazer o seguinte vou passar uma F3 a barra e aí a string dbsq Lite 3 isso depois aqui dessa Steam eu passo uma vírgula cast acredito que é isso vamos só dar aqui uns
entres para ficar fácil de ler pronto e com isso em ti isolou essas configurações aqui eu não vou colocar essa configuração dentro do ponto Henry porque eu já utilizo o combo de full tá então vou deixar assim mesmo vamos ver se o que vai funcionar eu espero que sim Então vai então Sérvia aparentemente ele tá funcionando tudo certinho aqui para gente tá ele tá fazendo uma reclamação aqui ele não tá dizendo que não conseguiu encontrar essa importação mas acho que seja alguma coisa do próprio versus code mesmo até porque a aplicação ela executou e é
isso tá então só para ter certeza eu vou inclusive apagar aqui o banco de dados apaguei o banco e aí eu posso criar ele novamente com python manage ponto pai uma igreja para aplicar as migrações aplicou tudo certinho criei o banco de dados tudo certo mas agora as nossas configurações estão isoladas só para finalizar uma última coisa que eu gosto de fazer também é configurar algumas coisas relacionadas a padronização de código tá o pai então ele tem um negócio chamado de Pepe ente que são algumas regrinhas de como você tem que escrever o código pai
tem termos de estilo né se você utilizar simples aspas duplas contas espaços você utiliza na alimentação e tem todas essas regrinhas que são meio chatas de decorar de ficar aplicando então existem ferramentas que automatizam né fazem a formatação do código de maneira automatizada eu gosto de utilizar essas ferramentas que a gente vai utilizar também aqui no projeto Então nós vamos utilizar uma biblioteca chamada Black o black ele vai justamente fazer essa formatação do código Então olha só vou vir aqui no arquivo de settens e veja o arquivo ele tá dessa forma aqui né veja que
tá tudo utilizando aspas simples por exemplo aqui eu vou até fazer o seguinte eu vou tirar aqui esses três que eu tinha colocado antes e deixar tudo na linha só para ficar uma linha grande ver se ele vai conseguir mudar também deixa eu voltar para o que era antes espera aí pronto veja que ele passou aqui da margem né tá vendo Então quando eu vier no terminal agora editar Black ponto eu tô dizendo para ele utilizar o black e formatar todos os arquivos do meu projeto de um enter eles são modificando tudo então ele Já
ajeitou aqui a indicação do código né para não ficar passando demais aqui da linha máxima ele passou a utilizar aspas duplas em tudo Só que também não é muito interessante é ficar toda vez vindo aqui executar Black e ponto né O legal é que isso aqui seja automatizado então a gente pode criar uma configuração do próprio vs code Então pessoal Ctrl settens Então veja que vai ter aqui a opção Open workspace settings eu tô criando configurações para esse projeto eu vou colocar aqui uma configuração que é o formato ou save né E se eu fazer
o seguinte você fizer só isso vem aqui no settenx e clicar aqui salvar contra o s ele vai dar um aviso ele tá dizendo Olha você tem um Black instalado você gostaria de utilizar ele como formatador de full só que eu vou configurar isso na mão também tá então vou aqui nesse ponto Jason e eu vou utilizar uma configuração que é o The full Não não é editor de formato de formato é Python ponto formato em ponto provider e a gente vai colocar opção Black feito isso toda vez que eu apertar control S ele já
vai auto-formatar aqui ele vai perguntar isso aqui mas acho que é só para o meu caso porque eu tenho uma extensão específica para isso Tá Mas por exemplo eu vou substituir que esse ciclo aqui de aspas duplas para aspas simples apertei o ctrl S aqui e ele não fez deixa eu ver porque Ah tá eu tenho que configurar também um formato mesmo então colocar aqui formato procurar aqui para o black MS Agora sim eu vejo que eu pressionei o control s e ele colocou aqui as aspas duplas já automaticamente tá Então são duas configurações aí
que eu gosto de fazer para isolar as configurações do projeto e não ficar essas informações secretas expostas né E também a configuração de formatação do código E aí todo o código fica padronizado com o mesmo estilo de codificação Beleza o que a gente precisa agora É de fato criar as nossas páginas a gente já tem um modelo pronto então preciso criar páginas de listagem de tarefas as páginas para cadastrar atualizar e excluir uma tarefa dentro do nosso sistema e nós vamos começar a fazer isso agora para entender como é que eu consigo pegar os dados
que estão no banco de dados como é que eu consigo exibir isso dentro do template e basicamente a gente vai começar a ver muito mais a camada de viu e a camada de template Tá mas de forma mais detalhada Então vamos lá aqui dentro do nosso app ajudou a gente vai trabalhar agora principalmente aqui dentro dessa app nós vamos criar um navio que vai ser responsável por listar as tarefas que tem cadastradas no banco de dados então vamos aqui em View S ponto pai por enquanto nós temos apenas uma única vez que havia o home
né que a gente viu ali para ver como é que funcionava o fluxo básico de dentro do jogo a gente vai apagar essa viu nós não vamos mais utilizar então deixa para pagar essa importação que não tá sendo usada também vou pagar essa função home Isso aqui vai gerar um erro lá no nosso arquivo de URL está porque essa home não existe mais não vou apagar essa importação também apagar aqui esse pef beleza voltando aqui para o vírus nós vamos criar uma nova função Então deve que vai ser responsável por listar as tarefas cadastradas eu
vou chamar ela aqui de tildo ela precisa receber uma request e vai ter que retornar alguma coisa no caso o nosso a nossa response que vai dizer que tem que renderizar um determinado template então vou fazer aqui um retorno render eu passo como primeiro parâmetro sempre a request e depois o template a ser renderizado a gente vai criar um template chamado dentro da pasta de luz chamada judô underline HTML por enquanto vamos fazer assim tá bem sim bem semelhante ao que a gente já tinha antes vamos aqui no nosso templates esse home ponto htm não
vai ser mais necessário então eu vou apagar ele de leite Ok e vou criar um novo template chamado underline HTML aqui o seguinte a primeira coisa para facilitar nossa vida na hora de trabalhar com templates porque a gente vai ter algumas algumas tintas que são específicas dos templates do Django e eu quero que essa sim tem que ser entendida pelo vs code então eu recomendo fazer a instalação de uma biblioteca minha biblioteca não perdão de um plugin dentro do vast code que é o Django tá só que Django que é do baptiste dartney eu não
sei se quando você certo provavelmente não mas a ideia dessa extensão é adicionar síntese para os templates do Jungle tá E aí uma vez que ela está instalada eu posso vir aqui ó em vez de definir que esse arquivo um arquivo HTML eu posso dizer que esse arquivo é um arquivo do tipo de ângulo HTML tá ele vai passar em entender isso aqui Como assim template do jump Mas para não ter que fazer isso manualmente eu também posso automatizar através de uma configuração então lembra que a gente fez aquela configuração do vscold para o projeto
que tá aqui no arquivo certo pai a gente também vai fazer aqui uma configuração chamada de file Association e eu vou associar que todos os arquivos em qualquer pasta que estejam dentro de uma pasta chamada templates e dentro de qualquer pasta e que tenham o final ponto HTML vão ser levado em consideração Como assim tem sido Django traço HTML tá veja que aqui ele já fez automaticamente Olha se eu criar um outro arquivo por exemplo Teste Ponto HTML veja que ele já tá com uma centexia do HTML tá então já fez isso automático não preciso
mais fazer manualmente outra configuração que é recomendada fazer é a configuração do emmet tá então eu posso colocar aqui ó em mente incluso e aqui eu coloco o seguinte Jungle traço HTML dois pontos HTML se eu não me engano é assim a configuração Mas se eu não me engano aqui no próprio extensão tem dizendo como configurar isso deixa eu ver cadê cadê aqui não tem mais eu acho que é isso mesmo É isso mesmo tá bem aqui ó Trixie HTML vai ser tratado como HTML pelo Jungle e a gente consegue utilizar as extensões para escrever
código mais rápido tá então essas duas configurações aqui que eu gosto de fazer e Beleza então Por enquanto vou colocar aqui apenas um H1 lista de tarefas né então só para ver que que tá tudo testando vamos também configurar nossa URL então vamos aqui em setup o URL e eu vou importar aqui dos pontos viu Import to the last Vou colocar aqui mais um pef para rota barra vai exibir a viu tio deles né vai executar aqui uma vírgula no final para ele colocar um abaixo do outro pronto feito isso vamos Executar a aplicação Python
Manager feito isso vamos lá no navegador vamos aqui atualizar a página 8000 tá aqui lista de tarefas beleza só que eu quero exibir as tarefas que tem cadastradas então o que que eu preciso fazer eu preciso aqui na minha viu buscar as tarefas do banco de dados e de alguma maneira dizer que essas tarefas tem que ser enviadas para dentro do meu template e lá no meu template conseguir exibir essas informações mas como é que eu faço isso a gente pode trabalhar com um negócio chamado de Contax tá então Olha só eu vou criar aqui
uma variável chamada por exemplo o nome igual a Cleison e eu quero que essa variável que tá no meu código pai Então seja enviado para dentro do meu template para isso depois aqui dentro do render eu vou colocar como terceiro parâmetro um dicionário Python na chave do dicionário eu coloco como eu quero acessar isso dentro da minha template eu vou chamar aqui de nome e depois como o valor eu coloco Qual o valor que vai estar associado essa chave vai ser a minha variável feito isso agora dentro da minha template eu tenho acesso a um
objeto chamado nome que está sendo enviado a partir da minha viu e para exibir eu utilizo a síntese do Play Chaves tá então coloca aqui entre dois Chaves a variável que eu quero acessar não precisa desse espaço beleza aí no começo e no final mas eu gosto de colocar para ficar mais bonito visualmente Tá bom então salvei isso aqui olha se eu vir aqui para o template para página htm atualizar veja que agora aparece nome olha só que interessante eu posso fazer outras coisas interessantes também por exemplo eu posso criar aqui uma variável chamado alunos
que vai ser uma lista que vai ter nome de alguns alunos não vai ter que por exemplo Elton Fonseca vai ter o Ariel vai ter a Ana Beatriz e por enquanto tá bom e dentro do meu contexto aqui que eu tô passando no render eu vou passar mais uma chave chamada alunos que vai ter como valor a minha variável alunos agora aqui dentro Eu também posso acessar esse alunos Olha só atualizar tá aqui a minha lista Elton Fonseca Ariel sardinha Ana Beatriz mas tá feio né não só porque não tem utilização mas porque ele tá
vindo como uma lista de fato eu queria que isso aqui fosse uma lista não ordenada por exemplo né tivesse uns pontinhos aqui bonitinho Então olha só o que que eu posso fazer em vez de exibir diretamente alunos eu posso criar aqui uma web e eu quero inteirar Ou seja eu quero fazer um laço de repetição em cima desse meu alunos e para cada um desses alunos exibir o conteúdo Como Um item de li então eu posso utilizar um foco e aí como é que eu faço um forró dentro da síntese da template do Django né
eu coloco Chaves por cento então abro com Chaves por cento e fecho com porcento Chaves é que eu coloco um foco aluno em alunos bem semelhante ao que a gente faz no Python só que aqui eu preciso fechar o foco tá então eu coloco novamente a mesma síntese e dentro desse fora eu vou ter acesso ao aluno que é cada um dos itens aqui que eu tô interando em cima dessa lista e eu vou exibir como um li utilizando aqui a cinta que de interpolação que a gente já viu aluno Então olha se eu voltar
aqui atualizar veja aqui eu consegui exibir cada um dos itens então eu já sei como exibição template né navios o que que eu vou precisar fazer buscar no banco de dados todos os estudos todas as tarefas cadastradas passar essas tarefas como um contexto daqui para o meu render e aqui dentro Eu intero sobre cada um dessas tarefas e exemplo dentro de uma tabela dentro de uma lista dentro de alguma coisa Então beleza como é que eu faço buscas no banco de dados eu vou utilizar a própria classe de modelo então eu vou importar essa classe
então from models Import judo como é que eu busco todas as tarefas do banco de dados deixa eu apagar que essas variáveis não vou mais utilizar isso eu posso criar aqui uma variável chamada de luz né as minhas tarefas vai ser igual ao meu tio Du E aí toda classe de modelo vai ter acesso a um objects esse objeto é que a gente utiliza para fazer a manipulação do banco para conseguir buscar os resultados buscar coisas que estão cadastrados no banco de dados como eu quero pegar todo mundo eu chamo aqui o ponto ou beleza
e aí eu passo isso aqui como um contexto vai conter a variável tudo no meu tio do list agora eu já sei como fazer não entero em cima deles então deixa eu apagar aqui esse nome que não tá sendo mais enviado e veja eu interar em aluno eu vou interar sobretudows na minha variável tos e aqui eu vou exibir somente o título então do ponto salve voltei na minha página atualizei e não vai ter ninguém porque eu não tenho ninguém cadastrado Então tudo certo então só para a gente conseguir ver vamos cadastrar manualmente alguma coisa
nesse banco tá E aí eu recomendo utilizar também uma extensão para isso tá bom se vocês precisarem aqui por mais SQL vocês vão encontrar essa extensão aqui ó mais quer no meu tá instalado só na minha máquina principal deixa instalar também aqui no Ubuntu na minha máquina linda que eu tô utilizando o wsl eu sei que é mais Kelly o nome tá mas ele funciona para praticamente todos os bancos de dados inclusive o sqlide uma vez que você instalar essa extensão mais querem Então veja se tá no mesmo desenvolvimento tá que é que vem aqui
da Database claramente.com vai aparecer esse ícone aqui ó na tua barra de essa barra lateral se não aparecer Clica com o botão direito e marca aqui ó data base vai aparecer esse e aqui a gente pode criar conexões Então vou criar uma conexão essa conexão vai ser com o sqlight né a gente vai procurar aqui ó tá vendo que ele tem mais Kelly Maria DB posto que quisesse que ela serve para monte de coisa vou criar uma conexão com sqlight Ele tá dizendo aqui que o esquelete não tá instalado eu preciso instalar ele então install
sqlight ele vai pedir aqui a minha senha deixa eu colocar aqui não foi Beleza deixa só ele terminar de instalar isso aqui na minha máquina pronto e aquele pedestre BBF clica aqui nesse botão ó e aí eu vou buscar o arquivo skylight.db aqui ele tá indo para o root aí eu consigo Então ele vai ser um pouquinho chato para isso então vou ter que pegar aqui na mão Então deixa eu vim colocar o caminho que tá o arquivo tá aqui ó se você tiver no Windows Provavelmente quando você clicar aqui nesse botão já vai aparecer
a própria parte do projeto aqui no Linux ele vai lá pelo root eu tenho que colocar o caminho inteiro Então deve apontar esse celular de três daqui um save é que ele fez a conexão olha só tá aqui todo minha tabela do banco de dados e diferente do sqlight Via que a gente está utilizando antes o vírus eu só consigo visualizar não consigo editar as coisas tá nesse aqui não eu consigo fazer as alterações diretamente não posso vir aqui ó posso clicar aqui nesse mais aqui ó em 7000 ele vai criar aqui uma caixinha para
colocar as informações então título colocar aqui ó estudar Opa escrevi tudo errado estudar Django a data de criação vou colocar aqui ou não deadline deixa eu ver deixa eu colocar aqui eu vou dizer que vai ser para o dia 20 não se posso aplicar aqui na verdade não dia 20 pronto e no fim da Chevette vou deixar em branco e vou colocar aqui beleza ele já fez o registro aqui de uma tarefa dentro do meu banco de dados voltando aqui na minha página e atualizando tá aqui e estudar Junco Então já consegue fazer a listagem
dos dos dados que estão dentro do banco de dados aqui na minha template né só que isso aqui funciona né Já conseguiu fazer o objetivo Mas tá bem feio né então a gente já vai também nessa aula né nesse vídeo adicionar uma finalizaçãozinha para isso aqui ficar bonito tá utilizando o Bootstrap Tranquilo então vamos lá então aqui como eu não sou muito bom de front-endigitalização e também nem quero perder muito tempo escrevendo CSS a gente vai utilizar uma frame que de utilização CSS que é o Bootstrap tá Então olha só vou abrir aqui a lavava
e vou entrar no site get bootstrap.com em outro site Mas é só a gente vai utilizar ele tá então Olha só vamos aqui em Docs e aqui a gente vai ter o seguinte tá vendo esse documento aqui ó vou copiar ele inteiro só clicar aqui em cima copy vou aqui no meu vscold Cadê tá aqui e vou substituir todo esse conteúdo beleza aqui eu não gosto desse toque minúsculo assim pronto e aqui a gente vai fazer a só adicionar nosso template né aqui vai ser o nosso template base já com importação do Bootstrap o CSS
do Bootstrap e também dois java script Trap esse código e voltar aqui para o navegador Então veja que já mudou aqui um pouquinho texto na fonte e tudo porque já tá com o Bootstrap e o seguinte aqui eu vou mudar de PT de Anne para pt br né para dizer que é português brasileiro no tyle deixa dar um enter aqui porque eu gosto de deixar assim vou chamar aqui de tw2 traço lista de tarefas e aqui a gente vai trabalhar no nosso bairro então o seguinte esse Bari eu vou ter basicamente uma barra de navegação
ali só com o nome da nossa aplicação então para isso eu vou voltar aqui no get Bootstrap vou pesquisar Então olha só tem aqui esse primeiro link works E então a gente pode pesquisar aqui na documentação uma barra de navegação bem simples né Então olha só essa aqui é o suficiente Então vou copiar esse código esse primeiro aqui ó vou voltar aqui no meu vast code e vou colar então só ajustar aqui em tentação pronto e aqui em vez de navivah vou chamar de tw tudos salvei o código vamos voltar aqui no navegador atualizar página
tá aqui só que essa página navegação eu acho que ela é muito clara né eu gosto dela do tema mais escuro Então vamos procurar aqui cadela sobre cores cadê cadê tá aqui então olha só aqui ele fala que a gente tem que colocar um BG Dark na classe lá na nave então nave tá aqui aí vai ser esse beijo é Body não sei como é que pronuncia isso BG Dark e aqui no deita BS tem como Dark Então coloca aqui depois da classe vamos ver se isso é o suficiente beleza outra coisa eu não gosto
de utilizar o container fluid na verdade deixa eu ver como é que fica Deixa eu tirar aqui deixar só container não acho que o container fica melhor mesmo isso pronto é que a gente já tem a barra de navegação bonitinha só vai ter isso tá não vou colocar nenhum link específico só para ter alguma visualização ali do que que é aplicação e depois eu vou ter aqui um Men nesse meio eu vou ter que um H1 lista de tarefas salvei aqui lista de tarefas tá vendo que ele ficou colado Então a gente vai utilizar o
sistema de Grid aqui do Bootstrap Então dentro desse Men eu vou colocar aqui uma classe container ele já deu esse espacinho aqui já ficou bem melhor aqui eu tô achando que tá muito colado em cima tá então eu posso fazer da seguinte maneira eu posso vir aqui no nave e dizer que eu vou ter um margem bora então MB até que mb2 ele já deu espacinho mas acho que mais tá bom então mb4 pronto aqui em B4 então deixa de tarefas E aí embaixo dessa lista de tarefas eu quero colocar uma tabela né a tabela
com as tarefas cadastradas Então vou vir aqui em nave bar perdão vou vir aqui no Bootstrap procurar por table então overview e aqui ele já tem um código de uma tabelazinha bem básica né vou copiar aqui depois do meu H1 eu vou colar Então vem toda esse código aqui eu vou deixar somente um até então posso apagar essas duas beleza e aqui deixa eu só ver como é que tá ficando aqui a nossa tabela né então o que que eu vou mostrar eu vou mostrar isso aqui que vai ser o ID vou mostrar o título
Então deixa eu ver como é que tá meu arquivo de motos aqui uma dica tá se você quiser Navegar para um outro arquivo dentro do quiser vir aqui clicar né procurar pelo arquivo e clicar Você pode pesquisar control p e digitar o nome do arquivo então o models tá aqui direto então a gente tem o título tem a data de criação a deadline a data de finalização então depois do que era a data de criação então criado em acho que criado tem um acento no i eu não tenho certeza eu sou péssimo nisso depois eu
tenho a deadline que é a data de entrega depois nós temos o finish que a data de finalização então th aqui ele pede para colocar um scope com data de finalização finalizado em pronto e aqui o seguinte tá deixa eu só colocar uma TD que só para ter alguma coisa qualquer besteira aqui só para a gente ver como é que ficou a tabela Então tá aqui ó o id o título criado em data de entrega e finalizado em Beleza então agora o que eu tenho que fazer é exibir de fato os dados da tarefa né
então aqui olha só para cada tarefa eu quero exibir uma TR então o que que eu vou fazer vou fazer um fórum como Aquela extensão que a gente colocou a gente pode só digitar fora e veja que ele já dá aqui um alto complexo do e aqui dentro Eu vou jogar essa terra pronto se eu atualizar vai continuar exibindo só uma porque já tem uma tarefa cadastrada mas agora eu quero mostrar os dados da tarefa né então aqui eu vou exibir o ID da tarefa Então coloca aqui interpolação que é do Play Chaves né tio
do ponto e aí eu posso utilizar o ID ou pecar tá aí de é o nome da coluna e pecar é uma espécie de ilhas tá uma espécie de apelido para chave primária geralmente a gente sempre vai utilizar APK é o comum depois aqui eu tenho o título então Opa tudo ponto title depois eu tenho que eu tenho a data de criação né então tio do ponto created at depois eu tenho a deadline shoothline e por fim eu tenho a data de finalização que eu acho que eu coloquei como então isso mesmo volta aqui atualizo
tá aqui né estudar Jungle a data que ele foi criado a data que é para ser feita a entrega e finalizado em não né aqui eu tô percebendo que essa data de entrega Ela poderia ser só um date né eu coloquei como um date time Mas nem é necessário ser um deste time depois a gente pode mudar Inclusive a única coisa que não foi legal foi finalizado em ficou um nome aqui né não ficou muito legal Porque de fato é o nome não dado nulo então o que que eu posso fazer eu posso utilizar um
filtro do Django o que que é um filtro um filtro dentro dos templates do Jango é tudo aquilo que você coloca utilizando o caracter de Pipe Então deixa eu colocar ele aqui olha só Se eu colocar aqui um Pipe depois do finish Eu tenho algumas funções digamos assim que são filtros para alterar o valor eu tenho um filtro chamado de fogo coloca aqui um dois pontos E aí eu posso colocar um valor padrão e aí como o valor padrão eu quero que seja só um traço então se eu atualizar agora sim então quando não tiver
valor ele vai definir vai colocar como traço se tiver valor ele coloca o valor de fato é só para a gente conseguir ver isso na prática Olha só se eu colocar esse valor aqui no deadline não vai aparecer um traço vai aparecer o valor que vai de fato registrado no banco porque isso aqui não é Noni tá não é no valor em branco Beleza então o que mais que a gente pode fazer aqui é colocar mais uma coluna com as ações que eu posso realizar né então vou poder marcar uma tarefa como concluída e apagar
uma tarefa então ideal que eu tenho aqui também as ações que eu possa realizar para cada uma das tarefas exibidas né então eu posso vir aqui depois eu finalizar também criar mais uma th de um Scopel e aqui eu vou chamar de ações e eu vou criar uma nova Opa coloquei um entrar mais aqui eu vou ter duas tarefas a tarefa duas ações né uma ação para marcar a tarefa como concluída e uma ação para excluir a tarefa Então vou criar isso aqui através de links né então eu tenho um link por enquanto que não
vai apontar para lugar nenhum vou colocar aqui algumas classes do Bootstrap que é o btn e o btn que eu vou chamar aqui de concluir eu acho que tem acento aqui mas enfim depois eu vou ver essas coisas de assento e ajeitar tá porque realmente sou horrível nisso vou ter uma outra um outro link que eu vou ter que uma classe que eu vou chamar de btn btn Danger que vai chamar de excluir eu até pesquisar logo isso aqui não tem acento não tô vacilando aqui pronto vamos ver como é que ficou aqui conclui esses
botões eu tô achando eles meio grandes vamos ver aqui no Bootstrap Olha só botão coisa para controlar o tamanho desses botões tem aqui as variações beleza botão tags Outlander LG eu quero utilizar esse aqui ó btn SM né deixar um botão menorzinho Então posso colocar também essa classe que a btn SM vamos ver como é que ficou Acho que fica melhor porque esse botão não fica tão grande assim né então beleza Quem já tem a listagem E aí só um ponto tá eu vou apagar esse item Então vou vir aqui ó no Database tio Deus
tudo vou selecionar a tarefa cadastrada e vou é delatar então confirmar apaguei se eu atualizar página fica meio estranho né vai ficar a lista de tarefas e uma tabela sem nada Então olha só o que que eu vou fazer eu vou vir aqui antes do list eu vou fazer um if eu posso fazer isso aqui também no Django tá então eu vou fazer aqui ó if Então já tenho aqui um Sniper para fazer um autocomplete eu vou verificar alguma coisa exibe essa tabela aqui ó Então vou pegar todo o código da tabela dá um Ctrl
X e vou colar aqui dentro aí só ajeitar aqui essa em tentação Cadê aqui selecionar todo mundo pronto e eu posso ter um else Esse é você tem que ficar antes vai exibir a tarefa se tiver alguma tarefa exibir a tabela de tarefas se não ele vai exibir aqui só um p né não há tarefas cadastradas e depois cadastradas aqui e depois o meu andrive salve vou voltar aqui no navegador Vou atualizar página beleza ele viu não há tarefas cadastradas se eu cadastrar alguma tarefa Então vou vir aqui olha cadastrar então estudar Jungle foi criado
agora então Now deadline sei lá dia 20 ok em sorte voltar aqui atualizar agora sim ele exibe a tabela né não vai exibir mais aquele texto tranquilo só uma coisa né eu percebi que esse essa data de entrega não faz muito sentido nenhum finalizado ter o horário né basicamente Vou Precisar só da data de fato então Vamos alterar isso é bom que a gente já vê uma coisinha interessante sobre as my granchos né aqui no modelo né no models voltar aqui no models eu vou alterar esse deadline para não ser um dente time Field ser
somente um date Field e o models também vai ser um date Field beleza E aí para não dar problema eu vou pegar aqui no meu banco de dados eu vou apagar o registro que eu já tenho atualmente só para evitar e dar problema aqui beleza alterei o meu tipo Então eu tenho que criar uma nova migração toda vez que eu criei uma nova modelo ou altero modelos existentes eu crio uma nova migração Então vou aqui ó pai nesse ponto pai make my greations parar o servidor veja só Ele criou uma nova migração que que ele
faz nessa migração ele altera o campo deadline em tudo e altera o campo Se eu olhar o arquivo de imigração Olha só traduz my greath Ele criou uma nova migração que ele até dá um nome bem legalzinho né ele já dá um nome bem descritivo ele tem uma dependência essa migração para ela se aplicada a migração 001 e nicho ela tem que ter sido aplicada primeiro então ele define ela como uma dependência olha só que bacana e quais são as operações ele vai fazer um alterfield ele vai alterar um campo no modelo teodoo no campo
deadline e vai mudar para dafield e a mesma coisa aqui no salvar isso aqui né só aplicar na migração Então pythoven fez isso aqui olha só no meu banco de dados quando eu agora colocar para cadastrar ele vai ser somente a data aqui uma questão de banco tá mas ele fez essa mudança só que acontece que o banco de dados sqlight ele não tem só um tipo data mas só para vocês verem isso na prática Tá eu vou cadastrar algo novo e estudar Django vou colocar um Now deadline para dia 20 e o branco vou
dar um insert se eu voltar aqui atualizar a aplicação tá rodando também né então me deixe em ponto pai data de entrega veio como nome Deixa eu ver qual foi o problema a migração tá correta eu acho que ele deve ter dado algum problema na hora de alterar a tabela para a gente não perder muito tempo você quer a gente pode fazer bem rápido apaga o arquivo deve apontar esquelete 3 e aplica as migrações de novo vai então me deixa tanto pai não perdão como é grande beleza Ele criou tudo de novo aqui Então deixa
eu agora assim ó o tipo tá como deite então ele deve ter dado algum problema na hora de conseguir aplicar essa migração no esquelete às vezes esses problemas acontecem tá Principalmente quando a gente faz alteração de tipo do campo é comum ele não conseguir fazer essa alteração e aí a gente tem que fazer manualmente ou apagar o banco e gerar aplicar as migrações novamente mas isso foi feito E aí só para a gente conseguir ver vou cadastrar de novo aqui tá então estudar Jungle createst Now deadline dia 20 Eu acho que eu preciso atualizar isso
aqui tá senão ele vai dar problema eu preciso refazer essa conexão ele vai conectar com uma coisa que não existe mais então apaga a conexão creio de novo esquece light deixa eu pegar aqui o caminho do arquivo tá aqui barra de chocolate 3 conecte e seria alguém novo então título e estudar Django dia 20 e eu fui deixar tudo vazio e sorte beleza inseriu beleza deixa eu rodar aqui o servidor Agora sim só a data né que faz mais sentido para gente que realmente quando você vai botar uma data de entrega Você não vai colocar
com horário você vai colocar somente o dia né então beleza é isso aqui a gente já conseguiu fazer o que era o objetivo né que era criar essa página de listagem de tarefas e consegui já listar de fato as tarefas cadastradas no banco então a gente já viu um pouquinho aí sobre os modelos né como conseguir fazer essas consultas no banco de dados vimos também um pouquinho a mais sobre os templates principalmente sobre as templates tags né que é o que vai permitir por exemplo a gente conseguir pegar informações que estão vindo lá da views
do da camada de vírus e exibir dentro da template fazer verificações com IFF e também laços de repetição né a gente fez aqui um forró dentro da template para Exibir todos os valores tranquilo a gente vai basicamente trabalhar com uma nova maneira de conseguir criar as nossas views até o momento a gente tem utilizado as chamadas fbvs que são fungos baseadas em funções e vamos passar a utilizar baseadas em classe além disso a gente também vai criar uma nova página a gente vai começar a trabalhar também na nova página que a página de cadastro de
tarefas e ver o recurso bem interessante O junco que é a herança de template para a gente conseguir ter reaproveitamento de código a nossa camada de template Tá então vamos lá Primeiro vamos trabalhar com esse conceito que são as classes bens de views no momento se a gente for vir aqui na nossa camada de views dentro da nossa app de luz nós temos um avião que já viu ela é responsável por ao receber a requisição buscar as tarefas cadastradas no banco e renderizar uma template com essas tarefas né passado ali dentro do contexto e essa
viu ela é uma função Então ela é uma fbv uma funchambi a gente tem além das vias baseadas em função as vias baseadas em classes as classes o recomendado a digamos assim a abordagem mais moderna é utilizada a cbvs quais bens de views Então nós vamos parar de utilizar fbvs para passar a utilizar cbvs E por que que a gente vai fazer isso primeiro porque um recurso mais recente do Django digamos assim é tão recente assim mas em comparação as fbvs ele é mais recente ele é o recomendado ser utilizado hoje principalmente porque ao utilizar
classes a gente consegue ter um código mais organizado e também ter vantagens em relação a própria orientação a objeto como o conceito de heranças e isso permite que a gente tenha código reutilizável e que consiga automatizar certas tarefas que são comuns tarefas de crude criar ler atualizar e deletar são coisas comuns que a gente faz no dia a dia dentro das aplicações então de ângulo ele proveu uma série de classes para serem utilizadas como dentro da camada de vinho que já fazem isso de maneira automática e a gente pode utilizar isso para não ter que
escrever esse código manualmente tá então o seguinte a gente Primeiro vai importar uma classe dessa camada de fio então from Opa pronto Django views.deneric né que são as classes bens de views genéricas Import e aqui a gente vai ter um monte né aqui a gente quer é a list viu que ela vai é uma viu que vai fazer uma listagem de alguma coisa então por enquanto eu vou deixar aqui essa função e nós vamos criar uma classe chamada judô list viu ela vai herdar de Leste viu e basicamente que a gente tem que definir aqui
é o seguinte Model igual tudo eu tô informando para essa lei civil Qual o modelo com qual ela tem que trabalhar que é o modelo de judô e é isso basicamente é isso né Essa função aqui ela é traduzida nessa classe utilizando classes beleza apaguei vou lá no meu arquivo de URL então setup URL Spotify isso aqui não existe mais nessa função tudo isto o que existe é o tio do Last View e aqui em vez de eu passar Playstation E não esqueça de abrir fechar o parênteses tá é isso vamos ver se isso aqui
vai funcionar então Python server vou lá no meu navegador Vou atualizar página e teve um probleminha né que tá dizendo que não tá não tem tarefas cadastradas a única modificação que a gente vai ter que fazer em relação ao código atual é que quando a gente utiliza ele passa como contexto da template um nome diferente né a gente passou como contexto o nome chamado tio Duos só que a gente tem que chamar de tudo underline tá então vou pegar esse sítio do underline e também vou substituir aqui no fórum voltei aqui no navegador atualize a
página já apareceu Clayson como é que ele sabe qual é o meu template porque eu já fui esperto e utilizei o padrão tá por padrão a lista vai procurar uma template que vai ter o mesmo nome da apples e que tem o nome do no meu modelo judô underline então eu já utilizei a padronização por isso que ele conseguiu encontrar tranquilo e pronto a gente já mudou aqui para classes fazer mais nada veja que é bem bem legal né bem rápido de conseguir implementar as coisas com o as quais bases Então posta parar Inclusive a
importação aqui do handebol a gente não vai mais utilizar e Beleza agora eu quero trabalhar na nova página que a página de cadastro de tarefas a gente também vai utilizar as classes meses de uso então aqui além de importar aulas te viu eu vou importar a Create viu então vou criar uma nova classe eu vou passar aqui a minha Create viu o que a gente sabe fazer Model tudo né O que a gente sabe que tem que passar aqui então beleza por enquanto vou deixar só isso vamos lá para o nosso arquivo de URL vou
criar aqui um novo que vai ser a rota vou fazer o seguinte eu vou colocar Creed né só que Create e também tenho que importar aqui o meu judô Creative então eu passo para ele aqui viu Hazel então criei mais uma rota dentro da minha aplicação e vamos ver o que que acontece né então vou voltar aqui no navegador a aplicação já tá executando vou tentar acessar aqui o localhost 2.8000/crigel ele deu um erro aqui de configuração imprópria Ele tá dizendo aqui que ele tá utilizando um Model formix dentro da minha classe to the krat
viu que não tem Fields né o atributo fios então quando a gente utiliza o coete viu eu preciso além do modelo e formar esse campo Fields Quais são os campos que eu quero permitir que o usuário informe no cadastro se a gente for ver ele no nosso modelo que que a gente tem tem Titan createstline desses aqui qual que o usuário tem que manualmente colocar o title e a deadline o Create vai ser criar automaticamente e o finish só vai ser preenchido quando ele marcar aquela tarefa como concluída então aqui em filtros eu vou colocar
uma lista informando esses campos tá então e deadline salvei aqui o código Vamos ver que que vai acontecer né vou voltar aqui atualizar a página aí ele deu um outro erro que é o template dos note xixi a gente não criou o template que vai exibir né quando essa viu foi executada Ele tá dizendo que ele tá procurando por um template chamado underline forma um ponto HTML Então vamos criar esse template vamos e o file tudo underline forme ponto html e vamos só colocar aqui um ou não vai fazer o seguinte vou vir aqui vou
copiar todo o código vou colar aqui e vou só substituir o que tem dentro do meio tá então aqui dentro do meio eu vou substituir Nova tarefa e aqui no header também né do title então aqui vai ser nova tarefa vamos ver o que que vai acontecer né se vai dar certo atualizei fome não eu botei tudo do ponto opa pera aí vamos calma judô underline Agora sim atualizei a página beleza tá aqui Nova tarefa Então já tá exibindo só que beleza meu formulário como é que a gente vai fazer a gente vai ter que
criar esse formulário na mão acontece que não quando eu vou aqui utilizando a Create View eu passo esse campo Field ele cria uma classe de formulário para gente que ele envia para dentro da template através do contexto E esse tem esse formulário ele tá ele é chamado de fome tá então posso colocar aqui ó tudo pela Chaves fome Salve vamos ver que que vai aparecer atualize a página olha só tá então deadline Bem feinho mas tá aqui né então isso aqui tem os campos Então a gente vai ter que utilizar um pouco de html eu
vou criar aqui um formulário então forma Action vai ser um Action post né não perdão vai ser igual a post e vou passar aqui o meu fome salvei atualizei vai ficar igual Mas agora tá dentro de uma tag forma e eu preciso de um botão para submeter o formulário então eu vou criar aqui um esse botão vai ter um Type que vai ser o Type summit para submeter o formulário eu vou colocar aqui no valor né salvar então voltei aqui atualizei beleza vamos testar cadastrar ver que que vai acontecer então Titan teste qual vai ser
a deadline Vou colocar aqui dia 10/10/2014 salvar ele deu um erro aqui 403 proibido verificação csrf falhou pedido cancelado que que é isso isso aqui é uma das mecânicas de segurança que o Johnny planeta chamada de csrf tá csrf é um tipo de ataque que é crossfire basicamente é quando um outro site através de algum tipo de script tenta realizar uma requisição para outro site que tá aberto no mesmo navegador então é como se tivesse por exemplo uma outra aba aqui aberta e essa outra aba utiliza um script java script ali para conseguir submeter um
formulário E aí o que o Junco faz para evitar esse tipo de ataque é criar um impulso né uma um outro Campo ali que fica escondido com chave que só o Jango sabe então ele garante dessa maneira que a requisição foi feita pelo próprio site não pelo site externo eu vou deixar na descrição do vídeo um link para um artigo lá no nosso blog que falem mais detalhes sobre o tipo de ataque csrf e como é que é feita as formas de evitá-lo tá E aqui no Jango basicamente Toda vez que você criar um formulário
que faz uma requisição post você tem que colocar essa tag aqui ó essa template tag que é csrf anderline token Inclusive tem até um sniperf aquela extensão já tem aqui a opção para colocar isso para você feito isso olha só voltei aqui no navegador Vou acessar novamente aqui o Barra Create não mudou nada mas olha só vou clicar com o botão direito vem aqui ó fonte da página de execução ele vai mostrar o código HTML e olha só que dentro do meu formulário cadê Aqui tá aqui aqui ó dentro do meu formulário tem um input
Olha só escondido e um valor Mega aleatório que ele cria que só o Diogo sabe então dessa maneira ele garante que a requisição foi feita pelo próprio pelo próprio site do Django tá pelo próprio aplicação e não para aplicação externa Beleza agora vamos lá tentar de novo teste 10/10 do 10 de 2024 salvar beleza ele deu aqui um erro também de configuração imprópria ética Ele tá dizendo olha no URL ou definir um get Absolut URL mefen quando a gente utiliza viu ele tem que saber quando o cadastro é feito com sucesso para onde é que
ele tem que redirecionar o usuário O que que tem que ser exibido com a página que tem que ser mostrada a gente precisa configurar isso também e a gente configura isso aqui através do success [Música] URL eu preciso nomear as minhas URL Então deixa eu fechar aqui todo mundo vou lá em setup o rls.pay tá vendo que eu tenho aqui a minha URL padrão né aqui a listagem e a URL de cadastro a única coisa que eu tenho definida é qual a rota e qual a Vivo a ser executada Além disso eu posso definir um
name igual a string para nomear as minhas rotas então eu vou dizer que essa rota aqui de listagem eu vou chamar ela de todu e essa outra aqui eu vou chamar de judô underline tá a partir disso eu posso fazer referências através desse name e lá no meu arquivo de vídeos eu vou importar então from Django URL Import e ele vai me retornar essa rota completa né a rota real que eu quero utilizar então aqui no meu sucks URL eu coloco meu reverse laser com o nome da minha rota judô underline list então depois do
cadastro eu quero redirecionar para rota de listagem Então vamos ver se isso aqui vai funcionar agora vou novamente aqui para o Create vamos lá novamente teste 10 do 10 de 2024 salvar Olha só voltou para listagem tá aqui cadastrado inclusive aquele primeiro que tinha dado erro na URL ele foi cadastrado Ele só não conseguiu redirecionar então o cadastro ele já tá funcionando né só que tá Bem feinho né então Primeira coisa eu quero colocar um botão aqui que vai Me direcionar para aquela página de cadastro aqui na listagem Então vamos lá meu Deus templates depois
aqui olha só desse meu vou colocar uma tag a que vai ter o maior HF aquela rota de cadastro e aí como é que eu faço para fazer a mesma ideia de através do nome da Rota eu ter a rota completa só que no meu template eu utilizo uma template tag do Jungle que a template tag URL E aí depois vai ele coloca as aspas e digo qual o nome da Rota judô underline aqui eu vou colocar como o valor nova tarefa e também vou colocar aqui algumas classes btn btn Prime salve Vou atualizar aqui
a página aqui Nova tarefa cliquei Nova tarefa para página de cadastro Então vamos trabalhar agora aqui nessa estilização né se formar aqui tá bem precisa dar uma boa melhorada nele aqui para utilizar as coisas do Bootstrap para ficar uma formulário bem bonitinho Tá então vamos lá então o seguinte aqui para estilização a gente vai utilizar uma outra biblioteca para o Django tá porque é o seguinte se a gente chegar aqui no nosso código no momento o nosso formulário ele é renderizado somente utilizando aqui o forme né e eu não quero ter que fazer a renderização
de Campo por campo para adicionar as classes do Bootstrap então para facilitar nossa vida nós vamos utilizar uma biblioteca chamada Django crispy forms tá essa biblioteca ela vai adicionar aqui uma funcionalidade do Django que é conseguir renderizar o formulário já aplicando estilizações de certos templates tá o Christopher é uma biblioteca mais genérica E aí ele tem algumas bibliotecas Deixa eu ver se eu consigo encontrar aqui a parte que fala sobre isso aqui os templatex então ele tem template Packs aí para o boot 2 por 3 por 4 para o uniforme fundation Tale Wind e também
para o chrispy 5 que é o que a gente quer utilizar Então olha só vou clicar aqui e ele vai vir para a página do gichub do Príncipe 5 ele fala que a gente vai instalar basta utilizar aqui o pipisal de crisp Bootstrap 5 Então vamos lá vs code terminal vou parar aqui a aplicação crispy Bootstrap 5 bom enter ele vai baixar tudo aqui para gente e fazer a instalação dentro do nosso projeto feito isso vamos dar uma olhada no que mais que ele fala aqui na documentação olha uso ele fala que lá em stoler
apps eu preciso adicionar esses dois carinhas aqui ó chrispy vou lá para o meu sets Então deixa eu fechar aqui todo mundo setup setatings Trap 5 outra coisa que eu gosto de fazer para organização dessas eu gosto de separar tá então vou criar aqui uma constante chamada Jungle apps que vai ser igual a uma lista vazia outra chamada parte apps também uma lista vazia e my apps com a lista vazio dentro de jango é eu vou colocar as Apps do Django Então até aqui ó vou dar um control x e vou colocar aqui nessa lista
Inter de Park apps as apps que vieram de aplicações externas que é o crescimento e o crips eu vou colocar as minhas apps que no caso é apples no Apps eu vou fazer só uma concatenação né uma soma digamos assim desses três dessas três listas mais Myers pronto aqui eu acho que fica mais organizado tá eu gosto de fazer dessa forma Além disso ele pede para a gente colocar essas duas configurações vou copiar a gente pode colocar em qualquer lugar tá eu gosto de colocar essas configurações extras aqui no final mas não é obrigatório e
é isso feito isso o krispy já tá configurado aqui no nosso projeto E aí como é que a gente utiliza vamos ver aqui na documentação Olha só no Diego chrispy forms ele tem aqui Um tá aqui ó tag wait forms procurar aqui a parte do template Ele tá dizendo que a gente precisa carregar aqui um load chrispy tags então é utilizar esse chrispy forms vai funcionar se é assim mesmo né então vou copiar aqui ao load vamos lá no nosso template template tudo lá no comecinho do nosso arquivo Vamos colocar esse load craceform tags e
depois a gente vai chamar esse príncipe forma Então vou voltar aqui Ele carrega tudo então não precisa nem desse botão de submete e nem do CCR vai dar certo mesmo né salvei coloquei tudo que eu precisava vamos lá então [Música] atualizar beleza olha só ele já carregou o botão eu preciso colocar mesmo eu pensei que ele já colocava automático mais não então vamos colocar aqui o botão eu pensei que ele colocava mais é ele colocou tá aqui até que forma mas foi post colocou tudo mas ele não colocou o botão né Então espera aí tenho
uma coisa que a gente tem que fazer aqui para colocar o botão cadê cadê cadê cadê tá tem uma coisa estranha aqui era para ele já até trazer o botão ele não trouxe por algum motivo deixa eu ver o que foi que houve então eu parei aqui o vídeo rapidinho e vou para dar uma olhada aqui que aconteceu e acontece que para a gente conseguir exibir o botão tem que fazer uma configuração que é um pouquinho mais chata tá E aí para a gente não perder muito tempo com isso vou fazer o seguinte em vez
de utilizar essa forma a gente vai utilizar uma forma diferente que é a gente vai criar tag for manualmente né com o método post Então deixa eu botar aqui dentro do formulário a gente vai colocar manualmente o csrf e o nosso botão Então vai ter um type a = so beat summith salvar vou colocar também Opa aqui veio um cara que tá errado a classe que vai ser o btn btn Fire e aqui dentro em vez de utilizar aquela forma eu vou fazer através de um filtro tá então forme coloco aqui o filtro crispy dessa
maneira então tá aqui o longe né a gente colocou CCR colocou forma colocou o botão e aí utilizou através de um filtro tá bom a aplicação ela já está executando se eu voltar aqui no na aplicação salvar atualizar né já apareceu Então vamos só testar aqui a nova novo teste data 10 do 10 de 2024 salvar beleza funcionou Tá bom então com isso nosso template aqui já da página de cadastro ele tá funcionando e carregando formulário de maneira automatizada e já estilizada só um ponto né Tá vendo que ele tá com o title e design
ele tá parecendo os termos em inglês isso porque ele vai pegar através do modelo Então se a gente for ver aqui ó ele vai pegar exatamente o nome aqui ó tá então para não ficar em inglês a gente pode passar uma configuração a mais aqui chamada de verbos não precisa ser no começo tá mas eu gosto de colocar no começo Então esse verbo sname é o nome digamos humanizado né que eu quero mostrar para o usuário e aqui eu vou colocar string título e a mesma coisa que no deadline então overboard data de entrega beleza
salvei aqui o código vamos lá atualizar página tá aqui título data de entrega tudo certinho né veja que ele até coloca aqui os asteriscos porque são Campos obrigatórios e olha só se eu tentar salvar o formulário sem preencher nada ele vai dar um erro que dizendo que eu tenho que preencher esse campo Mas essa é uma validação do HTML5 se eu pressionar q f12 clicar aqui nesse botão né selecionar um elemento clicar em cima do meu input eu posso vir aqui olha só e meio que hackear digamos assim o Frontier e eu posso tirar esse
Recorde daqui tirei o recorde desse formulário né Desse pudim e também vou tirar o recorde desse outro input aqui da data né então vamos lá apaguei dessa maneira eu vou conseguir submeter o formulário sem preencher porque desabilitei digamos assim a validação do HTML5 se eu clicar em salvar olha só tem a validação do próprio Django então ele vai verificar esse campo aqui ele é obrigatório Você não enviou e ele já vai mostrar informações campo é obrigatório e vai colocar o imputezinho vermelho dizendo que ele tem um erro tá é bem bacana Então é isso né
a nossa página de cadastro já tá pronta né então é bem da hora fazer isso no Django porque a gente consegue aí juntar as coisas de views para acelerar o processo de cadastro de criação dessa página e utilizar que o Christopher para gerar esses formulários de maneira já estilizado para a gente o último ponto aqui dessa desse vídeo né dessa aula é reaproveitamento de código se a gente olhar o template Ele tem muita coisa que é igual ao template tem a nave bar e tem aqui a importação do script e a finalização do conteúdo né
só o que muda é o que tá aqui dentro da mim então para a gente não ter essa repetição de código a gente pode utilizar a herança de templates a gente pode pensar essa TPS com a mesma Herança da orientação objeto só que para templates do Jungle E aí como é que a gente faz isso aqui em templates eu vou criar um arquivo chamado base ponto HTML veja que eu criei na pasta template senão na pasta do Dudu tá eu creio ele aqui fora dentro de base ponto HTML eu vou colocar tudo aquilo que é
comum entre todos os templates então para agilizar vou vir aqui no tio do fome vou copiar tudo e vou colar aqui dentro eu só vou tirar esse load daqui que ele não vai ser necessário no template base e vou apagar tudo que dentro do MEN tá bom e aí o que que eu vou fazer eu vou criar blocos que são locais onde eu posso injetar código a partir dos templates filhos Então dentro do container eu vou criar aqui um blog então utiliza template tag Block end Block Eu Vou Chamar esse bloco de contente né o
meu conteúdo e aqui também nesse Tyto eu tenho essa partezinha aqui também que vai mudar né então também vou criar um blog chamado de page underline Titan então criei dois blocos de conteúdo que vai ser o título da página e o conteúdo da página certo agora em tudo list por exemplo vou fazer aqui primeiro tudo aquilo que repetir eu não preciso mais colocar E aí como é que eu digo que esse template ele vai é dado template base eu utilizo a template tag extende eu coloco base ponto html tudo aquilo que já tem no mês
HTML eu posso tirar então posso tirar isso aqui tudo até o meio e tudo isso aqui também vai ficar só o H1 e a minha tabela né junto com meu botão e todo esse conteúdo eu vou colocar dentro de um bloco Então coloca aqui ó contente eu utilizo o mesmo nome que eu utilizei lá no template de base e jogo todo esse código para dentro dele não vou tirar daqui e vou jogar para cá tá aqui pronto aí joguei aqui dentro para dentro do content e eu também tinha aquele outro bloco bloco que era o
peixe né então Black veja underline tyton e dentro dele eu vou colocar justamente o título da página que a lista de tarefas salvei vou fazer a mesma coisa com o tio do fome então aqui olha só Vou estender então extende base ponto html vou criar aqui o meu blog tarefa e vou tirar tudo aquilo que se repete né então e do bem para baixo também vai ficar só o formulário e o H1 então Recordar isso aqui criar um novo bloco que meu bloco contente jogo esse formulário aqui dentro pronto salvei o código e vamos ver
o que que isso aqui vai fazer né se vai dar certo a aplicação já tá rodando se eu voltar aqui para minha página olha só acessar aqui a minha barra tá aí ó tudo funcionando com o layout que já existia se eu for aqui para o Barra cliente também já tá funcionando então tá tudo certinho e aí eu não tenho mais essa repetição de código dos meus templates né Eu tenho um único local com todo template base tudo aquilo que se repete em todo mundo e eu utilizo os blocos e herança de template para injetar
o conteúdo que altera em cada um dos templates filhos tá o único ajuste que eu acho interessante fazer é colocar um link aqui nesse Twitch Duos que ele não tá indo para lugar nenhum né Então olha só nessa nave aqui lá no nosso beise.l aqui no HF vou utilizar também uma URL e ela vai apontar para o judô underline se eu clicar ele vem para cá nesse vídeo nosso objetivo é trabalhar na nossa página de atualização de tarefas de edição de uma tarefa a gente já tem a página de listagem a página de cadastro agora
a gente vai comentar essa nova página Então vamos lá aí vamos aqui no nosso app dos views e a gente vai trabalhar agora com uma nova classbence de View que é update fazer uma atualização Então vamos criar uma nova classe Class update na verdade update update viu E ela é bem semelhante View bem semelhante na verdade eu diria até quase que igual na verdade vai ser bem igual mesmo a gente vai ter um Model tudo a gente já sabe vamos ter também um formulário que vai ser gerado a partir dos feudos tá então e também
vamos ter uma success url né Para onde é que vai ser retornado quando a atualização né o formulário foi submetido com sucesso vai ser retonado ali para o riverse Pronto é isso tá então realmente é bem igual né só que a diferença é que o update View ele vai procurar uma um tio do específico né uma tarefa específica ser atualizada Então eu preciso saber de alguma maneira Qual é a tarefa que eu quero editar e é isso a gente vai fazer através do ID da chave primária então lá no nosso arquivo de rotas e esse
pef vai ser update barra e aí a gente vai ter um valor dinâmico nessa rota que vai ser justamente vai dito da tarefa eu quero atualizar então por exemplo se eu quero atualizar deixa eu vir aqui na aplicação essa tarefa aqui que é o aí de um Então vai ser update barra 1 se eu quero atualizar tarefa de número 4 do add 4 vai ser update/4 no Django na que no arquivo de URL para a gente definir que uma parte da rota é uma variável a gente coloca entre maior e menor que define Qual o
tipo dessa variável é do tipo inteiro dois pontos o nome dessa variável por padrão o update View ele vai procurar uma variável na rota chamada PK de primer aqui e ela que a gente vai utilizar a nossa viu a série executada vai ser tudo update viu e também vamos dar um Dame né então name igual a tio do underline update Beleza então é isso salvei aqui o código vamos ver como é que vai ficar eu vou atualizar aqui a página carregou bonitinho Então vamos vir aqui eu quero editar a tarefa de ai de um então
local roxo 2.8000 barra update/1 veja que ele carregou aqui o nosso template já o sendo o mesmo template que a gente utilizou para cadastro que é o tio do forn já veio com o formulário preenchido com os dados atuais e aqui eu posso alterar Então vou mudar aqui para estudar Jungle vou colocar o seguinte finalizar a Playlist de introdução ao Django tá treina web playlist é complicado né playlist Vou salvar e veja que ele fez aqui a atualização perfeitamente tá mas aqui tem uma coisa que a gente precisa melhorar eu esqueci de colocar aqui nas
ações do botão de editar E além disso aqui tá como Nova tarefa e aqui em cima também né Eu quero um título diferente aqui para esse caso então eu vou reutilizar o mesmo template mas aqui a gente tem que verificar se é uma edição ou se é um cadastro para exibir a mensagem correta então vamos fazer isso aqui primeiro lá no nosso template do underline vou fazer o seguinte o update viu ele envia para o contexto do template um objeto chamado Object ou então o próprio nome do modelo no caso do só que tudo em
minúsculo que é justamente o que está sendo editado naquele momento e aí o que que eu vou verificar eu vou verificar aqui dentro do contente tá vendo vou fazer aqui um if e ou seja se eu tiver um objeto aqui chamado tio do Punto PK quer dizer que isso aqui é uma edição porque porque eu tenho uma tarefa que tem um ID já registrado quer dizer que algo que já foi cadastrado e tá sendo alterado nessa cena editado e eu vou colocar um elsy depois desse if então Élcio que se não se isso aqui não
for verdade quer dizer que é um cadastro Então coloca um H1 nova tarefa salvei volta aqui atualiza a página tá aqui ó editar tarefa e aqui eu tenho que fazer a mesma coisa aqui em cima tá vendo no tyle da página então eu vou só copiar esse trecho Vou colocar aqui dentro do meu Block page Tá então vamos só ajeitar a alimentação aqui aqui também beleza só que aqui não voltei o H1 né vai ser só o texto puro Então tira esses alunos aqui beleza salve a página vamos voltar aqui para o navegador atualizar editar
tarefa se eu for cadastrar Nova tarefa aqui ó Nova tarefa Nova tarefa então beleza A gente não preciso criar um template novo né e agora eu quero também um botão para eu conseguir ir para página de edição Então vamos lá a gente vai mexer agora mais uma ação tá então vou deixar aqui eu concluir ou excluir vou colocar um novo a com a classe btn btn vamos ver aqui acho que eu vou colocar secombery btn SM e aqui vai ser o editar Vamos só ver como é que vai ficar tá aqui botãozinho de editar né
então tem editar excluir e aqui no link né no HF desse editar a gente vai utilizar lá o nosso URL e qual que é a nossa rota né aqui no RN a gente definiu como update então underline update salvei Isso aqui vai dar um erro tá vamos ver isso aqui acontecendo Vou atualizar página ele deu um erro por quê ele não consegue fazer o reverse porque esse tipo de update essa rota ela tem Cadê aqui ela tem uma variável e eu preciso informar essa variável ele tá até dizendo olha continua updates ele tem um argumento
que não foi encontrado né que é justamente esse pecar E aí como é que eu passo ele então lá no nosso tio doeste aqui depois do update né do nome da Rota que eu tô querendo pegar eu vou passar o nome da variável pecar vai ser igual a quem eu quero preencher nesse valor que vai ser Justamente a tarefa que eu tô enterando judô ponto pegar salvei volta aqui na página atualizo carregou E aí se eu clicar aqui por exemplo para editar a tarefa de aí de dois né que é o teste editar ver aqui
certinho então teste editado opado salvar conseguiu fazer a edição perfeitamente beleza e agora nós vamos trabalhar nossa página de exclusão de tarefa tá a gente já tem aí a parte deles de cadastro e de atualização né então a gente já fez três partes do nosso Cruze vamos lá para nossa views né Então veja que o fluxo a gente já tá até acostumado né trabalha na vírus cria o formulário né criar URL e trabalha nosso template nós vamos também utilizar aqui então aqui eu vou importar e vamos aqui criar nossa classe e vamos trabalhar com o
Model de tudo vamos deixar assim por enquanto porque é o que a gente sabe sobre a deleite viu e vamos ver o que que vai acontecer na medida que os erros vão aparecendo né então vamos deixar assim vamos lá para nosso arquivo de URL que vai ser aqui de Elite E aí se eu tô deletando alguma coisa eu tô deletando algo em específico então até a mesma ideia do update eu preciso dizer quem eu tô apagando Então como a gente já sabe que tudo no dia que é muito bem padronizado a ideia mesmo né vou
ter uma variável na rota chamada pecado tipo inteira voltei aqui o meu e vou definir também um name que vai ser o tio do underline The Elite tranquilo feito isso vamos ver o que que vai acontecer né só que eu vou definir já a URL Para eu não ter que ficar na mão né lá na própria página Então vou vir aqui em templates então nós temos aqui o nosso botão de excluir Vamos alterar aqui esse HF para uma url então RL tudo delite preciso informar quem é APK Então vai ser igual ponto p k salvei
beleza vamos ver aqui vamos rodar aplicação Python minneide.pay Run Seven vamos voltar aqui no navegador a atualizar a página beleza vamos tentar apagar por exemplo esse aqui o novo teste que é o Wide 4 então excluir e beleza ele deu um erro aqui template dos not Exit Ele tá dizendo que falta um template né que ele tá tentando encontrar e que ele não encontra chamado exibe uma página de confirmação de exclusão e dentro dessa página de confirmação de exclusão a gente tem que ter um botão ali que vai fazer uma requisição para a mesma rota
só que com verbo post dizendo olha confirma a exclusão tá então a gente tem não vai apagar do nada né ele vai primeiro perguntar se a gente quer ou não apagar e aí essa página que exibe a confirmação é esse template aqui né que ele tá procurando que é o nome do modelo com o sufixo underline confirma Então vamos criar esse template vamos lá e o Fire HTML é dado o meu template base ponto base ponto html vou criar aqui o meu bloco né peixe underline tá então nesse bloco eu vou colocar aqui excluir tudo
e vamos ter um Então o meu bloco content no bloco content Vou colocar aqui um H1 excluir na verdade né tarefa aqui excluir tarefa e vou colocar um ponto de interrogação opa vou ter que sem querer tarefa beleza vamos só deixar assim por enquanto vou atualizar aqui a página e beleza apareceu excluir tarefa e aqui eu vou colocar uma tag uma pergunta Tem certeza que deseja excluir é isso e a tarefa E aí como é que eu posso passar alguma informação da tarefa né o meu dente viu ele envia para o contexto do template um
objetivo né uma variável chamada Object ou o próprio nome do modelo tudo da mesma maneira como a gente viu lá no update viu então eu posso colocar o seguinte tem desenho excluir a tarefa é que eu coloco tudo tá então salvei volta aqui na página e atualiza tem certeza que deseja excluir a tarefa novo teste e aí só presta que ficar mais visível eu vou colocar ele dentro de um uma tag strong tá só para ele ficar aqui em então e ponto de interrogação também falta no final né então depois daquele ponto de interrogação beleza
só que aí como é que eu confirmo isso eu preciso criar um formulário que ao ser submetido Vai forçar uma requisição do tipo post aqui para essa mesma Rota e isso é que vai fazer a exclusão acontecer de fato Então olha só depois da tag P eu vou criar um fórmula sem o Action mas que vai ter um mefford igual a dentro desse formulário eu vou precisar ter o meu CS token lembra que todo formulário post precisa ter o csf token e vou ter um botão aqui do tipo submete vai ter também uma classe Trap
que é o btn e o que eu vou colocar o btn danger tá com o texto Vou atualizar página apareceu aqui e eu também vou colocar um outro botão na verdade colocar um link tá uma tag a para minha URL tudo underline Listen vai ter uma classe também do boot Trap que é o btn btn success cancelar então seu cancelar ele volta aqui para listagem E se eu excluir ele vai fazer a submissão do formulário gerando uma requisição com o verbo post para essa mesma rota E aí a exclusão vai ser feita de Fato né
então vou vir aqui ó excluir ele vai estar um outro erro de configuração imprópria ele tá faltando um sucks URL como a gente tem um formulário dentro do deleteview ele tem um comportamento semelhante ao update View eu preciso dizer para onde é que eu vou redirecionar a página depois que o formulário for processado com sucesso e a exclusão foi feita então eu coloco também um Sucker laser para judô underline feito isso vamos voltar aqui para rota principal a gente vai ver que a exclusão ainda não foi feita né vou clicar aqui excluir exclui e a
exclusão foi feita de fato então de fato agora a gente conseguiu concluir a exclusão de nossa tarefa vamos até testar aqui por exemplo nesse teste editado funcionou então belezinha só para garantir Olha só vamos dar uma olhada no nosso banco de dados aqui ó somente duas que foram as duas que restaram né o restante foi tudo cancelado né Foi tudo excluído perdão então com isso a gente finaliza aqui a nossa funcionalidade de exclusão E com isso a gente já tem um Cruz completo né mas a aplicação ela não tá completa ainda de fato a gente
precisa ainda implementar aqui a nossa funcionalidade de concluir uma tarefa que a gente vai fazer já no próximo vídeo Então vamos lá vamos lá para nossa época de estudos e views bem a gente já tem aqui as nossas quatro views que realizam as operações de crude dentro do sistema e a gente precisa de uma nova ver o que vai marcar uma tarefa como concluída como é que esse processo vai acontecer aqui no nosso models nós temos que é um campo que por padrão ele vem como nulo né então a gente não tá cadastrando nada nesse
Campo ainda basicamente a ideia de marcar uma tarefa como concluída é preencher esse campo com aquela data atual então cliquei ali no botão de concluir a tarefa eu vou pegar esse finish e colocar como a data de hoje né e isso vai ser o que considero uma tarefa como concluída Então olha só não tem nada assim muito genérico nisso né é algo bem específico da minha regra de negócio então não vai ter um navio do Django que vai fazer tudo isso para gente como a gente já tem como você viu o Crate viu o update
viu então a gente vai utilizar aqui dentro dos generics a classe viu que ela é só uma viu ela só determina uma viu em formato de classe é a única coisa que ela faz todo o resto a gente vai ter que fazer manualmente tá então eu vou criar aqui uma nova classe e a gente vai chamar aqui de tudo complete viu que vaidade viu E aí quando a gente utiliza a classe View nós vamos definir métodos que vão dizer o comportamento da nossa aplicação então eu vou ter um método para cada verbo http Então como
a gente está trabalhando na aplicação web tradicional é basicamente a gente trabalha com dois raps htp o verbo get e o verbo post o verbo get é quando é feito uma requisição para uma rota ali para exibir uma página HTML alguma coisa do tipo e vai para o post geralmente quando a gente faz a submissão de um formulário então eu vou criar aqui uma um método chamado get que vai executar um código quando houver um requisição do tipo get esse verbo né o perdão esse método ele vai ter que receber dois parâmetros O primeiro é
o parâmetro que todo o método de classe precisa receber que é o selfie e o segundo é a própria equest a requisição então lembra que quando a gente estava trabalhando com a fanction lá no começo era mais ou menos dessa estrutura quando a gente trabalha com a classe base viu também funciona assim tá é só que o seguinte Além disso eu preciso saber qual a tarefa que está sendo marcada como concluída então a ideia semelhante ao delete viu o update View né então além de receber Quest eu também vou receber um outro parâmetro que é
APK a primer aqui daquela tarefa em específico né então eu preciso buscar no banco de dados Qual é essa tarefa então marca ela como concluída como é que eu faço essa consulta eu poderia fazer o seguinte judô objetos ponto get BK igual APK que que isso está fazendo eu tô dizendo para buscar no banco de dados uma tarefa né que tenha a coluna PK igual ao parâmetro PK que eu recebo aqui na minha viu tá eu posso fazer isso aqui mas tem uma maneira mais interessante de fazer que é utilizando aqui do from Django shortc
imports essa função aqui ela é um atalho por isso que ela vem aqui do Django shortcuts para conseguir fazer a busca de um determinado item no banco e caso ele não seja encontrado é exibir uma página de não encontrado tá então eu vou criar uma variável chamada te deu e vou igualar ela com o get Object ou for primeiro parâmetro que eu preciso passar é qual a classe de modelo é a minha classe de tudo e depois eu preciso passar o parâmetro de busca que APK igual APK com isso eu já tenho outro jogo em
mãos né a tarefa em mãos então o que que eu preciso fazer marcar ela como concluída então eu vou pegar o tildo vai ser igual a data de hoje E aí como é que eu faço para pegar essa data né o finish Edith ele vai ser deixa eu pegar aqui a classe Model né A minha classe te dou ele é do tipo date Field tá E aí a gente precisa criar Nova Instância de uma data e aqui eu preciso igualar a data de hoje né como é que eu consigo pegar a data de hoje no
Python a gente pode utilizar a própria biblioteca deste time tá então aqui ó from date time ponto Import do ponto igual date eu vou igualar esse aqui igual a data de hoje né No momento que eu cliquei nesse botão com isso eu alterei o valor e eu preciso salvar essa alteração no banco então a gente chama aqui do ponto save então isso aqui vai de fato realizar vai salvar isso aqui no banco de dados Tá e por fim eu vou quero redirecionar isso para página de listagem de tarefas como é que eu faço um redirect
aqui no Django também lá do short a gente vai importar um redirect a função redirect e aqui embaixo vai chamar um Hitler e Direct e eu passo para onde eu tô redirecionando eu quero redirecionar lá para o meu tio underline Beleza então basicamente essa aqui é a ideia né então vamos configurar Nossa rota aqui setup URL Vou importar o meu tio do completo viu vou criar aqui Um Novo Pack eu vou chamar ele aqui de complete e o ID da tarefa né então 22 pontos pk tudo completo viu e defina aqui um name que vai
ser o too do underline complete acho que é isso vamos testar Então na verdade foi configurar a primeira URL lá na nossa listagem né então vamos aqui templates aqui no concluir eu vou colocar a minha url que vai ser para tudo underline complete com o parâmetro PK = pronto vamos Executar a aplicação então pai tem um meninge quanto o pai server vamos lá na nossa página atualizar aqui a página Então tudo funcionando Vamos marcar essa tarefa aqui como concluída então concluir veja aqui apareceu agora o finalizado em né a data foi setada aqui corretamente como
a data de hoje Então a nossa funcionalidade de concluir tarefa já tá funcionando Porém para a gente fechar aqui com chave de ouro vamos fazer alguns ajustes algum alguns pequenos ajustes na aplicação para ela ficar mais interessante primeiro ponto que eu queria verificar é o seguinte a relação da listagem né como é que ela tá ordenada vamos fazer o seguinte Olha eu tenho uma tarefa de um que é finalizar a Playlist de introdução ao Junco da trena web que ela foi criada não a data de entrega dela dia 21 de Maio de 2023 então eu
vou criar aqui Uma Nova tarefa e eu quero que a data de entrega dela seja antes eu vou colocar para o dia 19 de maio de 2023 né então vou colocar aqui ó teste 2 19/05 de 2023 salvar e olha só o teste 2 ele tá com uma data de entrega anterior a data de entrega da tarefa de ai de 1 mas ela vem aqui no final porque a ordem é com base no cadastro a ordem Tá Com base no id e assim faz mais sentido a gente exibir Primeiro as tarefas que estão mais próximas
da data de entrega mais próximas de serem concluídas Então como é que eu posso ajustar essa ordenação se a gente voltar aqui na nossa nosso code lá na nossa camada de views quem faz isso essa listagem é a classe de estudo civil aqui eu não tenho nada que eu possa modificar né pelo menos a não a primeira vista e eu também não quero alterar aqui a classe como ela tá então a gente pode fazer essa modificação lá na classe de modelo Então posso vir aqui em models e nas classes de modelo do Django a gente
pode criar um negócio chamado de Classic essa meta Class é uma classe com configurações para o modelo que permitem que a gente consiga definir meta informações metadados né que são informações sobre os dados dentro da camada de modelo do Django e dentro dessa meta Class eu posso definir um campo né um parâmetro chamado acho que é assim se eu não me engano que é uma lista que eu vou passar por onde eu quero ordenar esses dados e eu vou dizer que eu quero ordenar a partir da deadline Então vou ordenar aqui a parte da deadline
salvei vou voltar aqui na aplicação né no meu na minha página Vou atualizar a página e veja que a ordem mudou agora o teste dois ele tá vindo como o primeiro porque a data de entrega dele tá mais recente se eu quiser essa mesma ordem só que inversa por exemplo quem tá mais longe de ser primeiro basta eu colocar na frente aquele deline o menos tá então menos deline E aí funciona do jeito que a gente quer só que aqui vai ser apenas deadline sem do jeito que a gente tá aqui tá Beleza então a
gente já tem ordenação aqui feita outra coisa é o seguinte essa tarefa ela já tá concluída então não faz muito sentido eu poder concluir ela de novo né então o ideal seria que esse botão aqui quando a tarefa ela já está concluída ficasse desabilitado e outro ponto é não faz muito sentido eu também poder editar uma tarefa uma vez que ela já foi concluída excluir tudo bem Eu posso excluir a tarefa não quero mais ela aqui posso excluir mas concluir editar não faz muito sentido então caso a tarefa ela já esteja concluída eu vou desabilitar
os botões de conclusão né para concluir e para editar Então vamos lá para o nosso template e basicamente o que eu vou fazer aqui é um IFF tá Então olha só aqui no nosso concluir eu vou dar aqui um enter para conseguir enxergar né para não ficar muito grande isso aqui ficar difícil da gente conseguir enxergar que está sendo feito então deixa eu dar aqui alguns entes habilitação beleza então na tag a eu vou colocar um IFF aqui do ângulo template eu vou verificar se o meu tio do ponto existe se existir eu vou colocar
uma propriedade que é o de zaybody Salve vamos ver como é que ficou não mudou deixa eu ver aqui no Bootstrap né Na verdade eu quero isso no botão Na verdade eu acho que isso aqui não vai funcionar colocar o dizerbo porque a gente está trabalhando com um link né Deixa eu só ver como é que a gente pode fazer aqui se eu não me engano a gente faz isso dentro da classe tá então deixa eu pegar esse todo aqui recortar ele e vou colocar aqui dentro da definição da classe Olha só vem aqui então
vamos ver se isso aqui é o suficiente a página agora sim olha só o botão de concluir que ele tá desabilitado não consigo marcar ele né não consigo clicar e a mesma ideia a gente vai fazer para o editar Então olha só vou copiar esse trechinho aqui do código que né que adiciona a classe de zebra dentro das classes desse link caso o esteja preenchido né então eu quero aqui no editar então vamos aqui editar Eu também dar uns entre eles aqui para a gente conseguir enxergar bem vamos ajustar a indenização e aqui pronto dizerbord
pronto vamos voltar aqui na página atualizar e o botão de editar e o botão de gokui estão desabilitados é para esse item específico aqui que é o item 3 porque ele já foi concluído né uma tarefa que já tá concluída então não consigo concluir não consigo editar mais eu consigo excluir beleza e aqui um outro ponto e aí já é um ponto sobre a organização de código não vai ter nenhuma mudança de funcionalidade é que o seguinte a regra de negócio dentro da nossa aplicação para concluir uma tarefa é uma regra bem simples basicamente eu
verifico se na verdade o certo o como a data de hoje e salvo né a tarefa atualmente é um processo simples mas pode ser que mais na frente a aplicação ela cresça um ponto que conclui uma tarefa não seja tão simples né preciso fazer algumas verificações alguns testes e imagina que eu tenho vários locais aonde eu concluo uma tarefa eu teria que repetir essa regra de negócio em todas essas vias que fazem esse trabalho né de concluir uma tarefa E aí o jugo ele tem uma filosofia chamada de Fat Models a tradução é meio estranha
seria como views magras e modelos gordos é meio estranho mas basicamente ela diz o seguinte regras de negócio estão devem estar dentro da camada de um modelo e não dentro da camada de viu a viola deve ser a mais simples possível então nós vamos extrair essa regra de negócio que novamente a regra do negócio bem simples mas é uma regra de negócio da nossa aplicação para dentro do modelo Então olha só vou recortar esse código na verdade nem vou recortar vou deixar aqui do jeito que tá vamos lá para o nosso models ponto pai e
aqui dentro eu vou criar um método Tá eu vou criar aqui um método que é o Mark s por ser um método ele precisa receber aqui o selfie como o primeiro parâmetro e o que que eu vou fazer eu vou verificar se o selfie ele já está com o fim deixa quieto então e selfie e aqui eu vou negar né só quero entrar nesse se não tiver uma data de finalização aqui é norte né não é ponto de exclamação então quantas linguagens então se a data de finalização não tiver setada eu vou setar ela então
selfie pronto igual datey preciso importar que esse dente né então a gente vai importar ele aqui pronto e depois eu vou salvar então selfie ponto safe beleza e agora lá na minha viu em vez de eu fazer esse processo eu chamo o próprio todo ponto Mark as complique beleza posso apagar aqui posso tirar essa importação né e assim a primeira vista parece que não teve tanta melhoria sim né eu tirei duas linhas de código daqui para colocar algumas linhas de código aqui na camada de modelo mais a vantagem disso é que eu centralizei a regra
de negócio dentro do modelo então se em algum outro local eu preciso definir que uma um modelo foi marcada como completa eu não vou precisar fazer isso na mão eu vou precisar repetir essa regra de negócio eu chamo o método do modelo que sabe como fazer isso e se eu precisar alterar essa regra de negócio é altero em um único lugar em vez de sair alterando em vários lugares diferentes Tá então vamos só ver isso aqui vai funcionar vamos voltar aqui para nossa página vou marcar aqui o teste dois como conflito né completo concluir beleza
foi marcada aqui como completo e já tá funcionando Tranquilo então é isso com isso a gente finalizou aqui o projeto já deu para ver inclusive uma filosofia do Django sobre boas práticas e organização do código que é o fat Model Skin News Conseguimos ver como criar uma View que foge do padrão né que é um avião aqui que não necessariamente vai ter um avião genérico que consegue fazer tudo para gente a gente vai ter que fazer a regra todo o processo na mão mas ainda assim utilizando as classes bens de views que o Django provei
tranquilo o que vimos nesse vídeo é só o começo se você quer se especializar ainda mais desenvolvimento ideal para você somos uma escola especializada em forma mais desenvolvedores possuem mais de 15 anos de experiência no mercado e já falamos mais de 200 mil alunos na nossa plataforma você encontra informações sobre as principais linguagens e tecnologias e falando de uma maneira muito mais completa sobre todos os assuntos que você acabou de ver nesse vídeo então clique no link da descrição e faça já a sua matrícula bom pessoal se você gostou do vídeo Não esqueça de curtir
e compartilhar com todo mundo que você conhece queira aprender sobre programação caso tenha ficado alguma dúvida ou quer dar algumas sugestão coloque nos comentários queremos responder a todos bem vou ficando por aqui e até a próxima