Você acaba de entrar em um time responsável por criar um site de notícias usando o Django, considerando as suas habilidades com este framework, você recebeu tarefas para a construção de algumas partes do projeto, que representam a base fundamental de todo o site. Segue o escopo de cada tarefa.:
local: news/models.py
🍀 Dica: Os Requisitos 1 à 3 solicitarão a criação de modelos. Sempre que criar/modificar um modelo, é necessário criar as migrações para espelhar as modificações para os bancos de dados, inclusive o banco de testes contam com estas modificações. Comando para gerar a migrate a partir dos modelos criados:
python3 manage.py makemigrations✍️ Detalhes do requisito
- Crie a classe
Category; - A classe
Categorydeve herdar osmodelsdo Django; - A classe
Categorydeve ter uma propriedade chamadaname; - A propriedade
namedeve ser um campo de caracteres com um tamanho máximo de 200 caracteres; - A propriedade
namenão deve aceitar informações vazias ou maiores que 200 caracteres; - O método
__str__da classeCategorydeve retornar a propriedadenameda categoria criada;
🤖 O que será verificado pelo avaliador
- Se a classe
Categoryexiste; - Se a classe
Categorypossui a propriedadename; - Se é possível criar uma nova categoria;
- Se o método
__str__retorna o nome da categoria criada; - Se
namepossui uma propriedade demax_length; - Se não é possível criar uma categoria com um nome vazio;
- Se não é possível criar uma categoria com um nome maior que 200 caracteres;
- Se as mensagens de validações são as padrões definidas pelo Django;
local: news/models.py
✍️ Detalhes do requisito
- Crie a classe
User - A classe
Userdeve herdar osmodelsdo Django; - A classe
Userdeve ter as propriedades chamadaname,email,passworderole; - As propriedades
name,passworderoledevem ser campos de caracteres com um tamanho máximo de 200 caracteres; - A propriedade
emaildeve ser um campo do tipoemailcom um tamanho máximo de 200 caracteres; - As propriedades devem ser:
name: Campo de caracteres, com tamanho máximo de 200 caracteres;email: Campo de email, , com tamanho máximo de 200 caracteres;password: Campo de caracteres, com tamanho máximo de 200 caracteres;role: Campo de caracteres, com tamanho máximo de 200 caracteres;
- As propriedades
name,email,passworderolenão devem aceitar informações vazias ou maiores que 200 caracteres; - O método
__str__da classeUserdeve retornar a propriedadenameda pessoa usuária criada;
🤖 O que será verificado pelo avaliador
- Se a classe
Userexiste; - Se a classe
Userpossui as propriedadesname,email,passworderole; - Se é possível criar uma nova pessoa usuária;
- Se o método
__str__retorna o nome da pessoa usuária criada; - Se
name,email,passworderolepossuem uma propriedade demax_length; - Se
name,passworderolesão campos de caracteres; - Se
emailé um campo de email;` - Se não é possível criar uma pessoa usuária com alguma informação vazia;
- Se não é possível criar uma pessoa usuária com alguma informação maior que 200 caracteres;
- Se as mensagens de validações são as padrões definidas pelo Django;
local: news/models.py
✍️ Detalhes do requisito
- Crie a classe
News; - A classe
Newsdeve herdar os models do Django; - A classe
Newsdeve ter as propriedades chamadatitle,content,author,created_at,imageecategories; - As propriedades devem ser:
title: Campo de caracteres com tamanho máximo de 200 caracteres e com validação que não permita títulos com apenas uma palavra;content: Campo de texto, sem tamanho máximo de caracteres;author: Chave estrangeira da tabela ligada o modelUser;created_at: Campo de data;image: Campo de imagem;categories: Chave estrangeira da tabela ligada o modelCategory;
- As propriedades
title,content,created_atecategoriesnão devem aceitar informações vazias; - A propriedade
imagepode aceitar informações vazias; - A propriedade
titlenão deve aceitar informações maiores que 200 caracteres; - A propriedade
created_atnão deve aceita datas fora do padrãoAAAA-MM-DD; - A propriedade
imgdeve ter um campoupload_toque deve ser igual ao diretório'img/'; - A propriedade
categoriesdeve aceitar 1 ou mais categorias e deve se relacionar como muitos para muitos; - O método
__str__da classeNewsdeve retornar a propriedadetitleda notícia criada;
🤖 O que será verificado pelo avaliador
-
Se a classe
Newsexiste; -
Se é possível criar uma nova notícia;
-
Se a classe
Newspossui as propriedadestitle,content,author,created_at,imageecategories; -
Se o método
__str__retorna o título da notícia criada; -
Se não é possível criar uma notícia com alguma informação vazia;
-
Se
titlepossui uma propriedade demax_length; -
Se
contentnão aceita informações menores que 1; -
Se ao tentar criar um notícia com alguma informação vazia, é gerada a resposta:
{'<campo>': ['Este campo não pode estar vazio.']}
Obs: substitua
<campo>pelos campostitleoucontent.
-
Se não é possível criar uma notícia com um título maior que 200 caracteres;
-
Se ao tentar criar uma notícia com um título com uma única palavra, é gerada a seguinte resposta:
'O título deve conter pelo menos 2 palavras.'.Obs: você pode dar uma conferida nessa página da documentação sobre mensagens de erro personalizadas, ou perguntar para a IA da plataforma de aprendizagem.
🍀 Dica: Antes de continuar, execute os 2 comandos abaixo:
python3 manage.py migrate
python3 manage.py runscript seedsO primeiro comando irá criar as tabelas no banco e o segundo comando irá popular o banco, execute um de cada vez
local: news/templates/home.html
✍️ Detalhes do requisito
- Crie um template para a página inicial do projeto;
- Crie a view e a url necessárias para renderizar o template
home.html; - Inclua as
urlsdenewsnasurlsdo projeto; - O template da página inicial deve ser renderizado na rota
http://127.0.0.1:8000/; - O template deve ter uma tag
linkimportando o arquivo csscss/style.cssque está na página de estáticos; - A importação de arquivos estáticos deve ser feita através do template tag
static; - O caminho para a página inicial deve ter o nome de
home-page; - O template da página inicial deve ter como título
Página Inicial; - O template da página inicial deve ter um cabeçalho
headercom a classeheader; - O template da página inicial deve ter uma lista não ordenada com a classe
header-linksdentro do cabeçalho; - O template da página inicial deve ter na lista não ordenada um link
acom referência para ahome-pagee com o textoHome; - O template da página inicial deve ter cards das notícias cadastradas no banco;
- O template da página inicial deve ter títulos
h2com a classenews-titlee os títulos das notícias como valores; - O template da página inicial deve ter tags
spancom a classenews-datee a datas de criação das notícias como valores; - O template deve exibir as datas no formato
DD/MM/AAAA; - O template da página inicial deve exibir as imagens das notícias;
🤖 O que será verificado pelo avaliador
- Se existe uma url nomeada
home-page; - Se o template
home.htmlestá sendo renderizado na urlhome-page; - Se existe uma importação do arquivo
static/css/style.csscomo umstylesheet; - Se existe um link para a
home-pageescritoHome; - Se existe o título
Página Inicial; - Se existe um cabeçalho
headercom a classeheader; - Se existe uma lista não ordenada com a classe
header-links; - Se as notícias possuem um título
h2com a classenews-title; - Se as notícias possuem uma tag
spancom a classenews-datepara a data; - Se as datas das notícias estão no formato
DD/MM/AAAA; - Se as notícias possuem imagens;
🍀 Dica: Algumas coisas nos próximos templates são parecidas com as do template criado agora, será que vale a pena pensar em um template base?
local: news/templates/news_details.html
✍️ Detalhes do requisito
- Crie um template para a página detalhes da notícia;
- Crie a view e a url necessárias para renderizar o template
news_details.html; - O template da página detalhes da notícia deve ser renderizado na rota
http://127.0.0.1:8000/news/<int:id>;
Obs: o endpoint
<int:id>deve ser substituído dinamicamente pelo id da notícia
- O caminho para a página detalhes da notícia deve ter o nome de
news-details-page; - O template da página detalhes da notícia deve ter como título
Página de Detalhes da Notícia; - O template da página detalhes da notícia deve ter um cabeçalho
headercom a classeheader; - O template da página detalhes da notícia deve ter uma lista não ordenada com a classe
header-links; - O template da página detalhes da notícia deve ter no cabeçalho um link
acom referência para ahome-pagee com o textoHome; - O template da página detalhes da notícia deve exibir as seguintes informações:
- O título da notícia em título
h1; - O conteúdo da notícia em parágrafo
pcom classenews-content; - Cada categoria da notícia em uma tag
spancom classenews-categories; - A pessoa autora da notícia em uma tag
spancom classenews-author;; - A imagem da notícia;
- A data de criação da notícia no formato
DD/MM/AAAA;
- O título da notícia em título
- Modifique as notícias no template
home.htmlpara que quando clicadas haja um redirecionamento para a página detalhes da notícia;
🤖 O que será verificado pelo avaliador
- Se existe uma url nomeada
news-details-page; - Se o template
news_details.htmlestá sendo renderizado na urlnews-details-page; - Se existe o título
Página de Detalhes da Notícia; - Se existe um cabeçalho
headercom a classeheader; - Se existe uma lista não ordenada com a classe
header-links; - Se a notícia possui um título em tag
h1e com a classenews-title; - Se a notícia possui um conteúdo em tag
pe com a classenews-content; - Se a notícia possui suas categorias em tags
spane com a classenews-categories; - Se a notícia possui uma pessoa autora em tag
spane com a classenews-author; - Se a notícia possui uma data e se esta data está no formato
DD/MM/AAAA; - Se a notícia possui imagem;
local: news/templates/categories_form.html
✍️ Detalhes do requisito
- Crie um template para o formulário de cadastro de uma categoria;
- Crie a view e a url necessárias para renderizar o template
categories_form.html; - O template do formulário de uma nova categoria deve ser renderizado na rota
http://127.0.0.1:8000/categories/; - O caminho para o formulário de uma nova categoria deve ter o nome de
categories-form; - O template do formulário de uma nova categoria deve ter como título
Formulário para Nova Categoria; - O template do formulário de uma nova categoria deve ter um cabeçalho
headercom a classeheader; - O template do formulário de uma nova categoria deve ter uma lista não ordenada com a classe
header-links; - O template do formulário de uma nova categoria deve ter no cabeçalho um primeiro link
acom referência para ahome-pagee com o textoHome; - O template do formulário de uma nova categoria deve ter no cabeçalho um outro link
acom referência para acategories-forme com o textoCadastrar Categorias; - O template do formulário de uma nova categoria deve ter uma tag de formulário com a propriedade
methoddo tipoposte a propriedadeactioncom a url para/categories; - O template do formulário de uma nova categoria deve carregar o token de segurança
CSRFem seu interior usando a tag de template adequada; - O template do formulário de uma nova categoria deve ter uma
labelque como o valorNome; - O template do formulário de uma nova categoria deve ter um
inputcom as algumas especificações:- A propriedade
typedo tipotext; - A propriedade
namecom o valorname; - A propriedade
maxlengthcom o valor200; - Precisa ser um campo obrigatório;
- A propriedade
- O template do formulário de uma nova categoria deve ter um botão do tipo
submitcom textoSalvar; - Após o cadastro de uma categoria, a pessoa usuária deve ser redirecionada para a página principal;
🍀 Dica: Usar a criação de formulário nativa do Django pode agilizar as coisas
🤖 O que será verificado pelo avaliador
- Se existe uma url nomeada
categories-form; - Se o template
categories_form.htmlestá sendo renderizado na urlcategories-form; - Se existe o título
Formulário para Nova Categoria; - Se existe um cabeçalho
headercom a classeheader; - Se existe uma lista não ordenada com a classe
header-links; - Se existe um link para a
categories-formescritoCadastrar Categorias; - Se existe a tag de formulário com as propriedades
methodeaction; - Se existe a tag
label; - Se existe a tag
inputcom as propriedadestype,name,maxlengtherequired; - Se existe um botão do tipo
submit; - Se o formulário tem o estado inicial vazio;
- Se é possível cadastrar uma nova categoria;
- Se após o cadastro de uma nova categoria, há o redirecionamento para a página principal;
local: news/templates/news_form.html
✍️ Detalhes do requisito
- Crie um template para o formulário de cadastro de uma notícia;
- Crie a view e a url necessárias para renderizar o template
news_form.html; - O template do formulário de uma nova notícia deve ser renderizado na rota
http://127.0.0.1:8000/news/; - O caminho para o formulário de uma nova notícia deve ter o nome de
news-form; - O template do formulário de uma nova notícia deve ter como título
Formulário para Nova Notícia; - O template do formulário de uma nova notícia deve ter um cabeçalho
headercom a classeheader; - O template do formulário de uma nova notícia deve ter uma lista não ordenada com a classe
header-links; - O template do formulário de uma nova notícia deve ter no cabeçalho um primeiro link
acom referência para ahome-pagee com o textoHome; - O template do formulário de uma nova notícia deve ter no cabeçalho um segundo link
acom referência para acategories-forme com o textoCadastrar Categorias; - O template do formulário de uma nova notícia deve ter no cabeçalho um terceiro link
acom referência para anews-forme com o textoCadastrar Notícias; - O template do formulário de uma nova notícia deve ter uma tag de formulário com a propriedade
methoddo tipopost, a propriedadeactioncom a url para/news/e a propriedadeenctypecom valormultipart/form-data; - O template do formulário de uma nova notícia deve carregar o token de segurança
CSRFem seu interior usando a tag de template adequada; - O template do formulário de uma nova notícia deve ter as seguintes tag:
- Uma
labelcomo o valorTítulo; - Um
inputdo tipotextcom o nometitle; - Uma
labelcomo o valorConteúdo; - Um
textareacom o nomecontent; - Uma
labelcomo o valorAutoria; - Um
selectcom o nomeauthor; - Múltiplos
optionsendo seus valores os nomes das pessoas usuárias cadastradas no banco; - Uma
labelcomo o valorCriado em; - Um
inputdo tipodatecom o nomecreated_at; - Uma
labelcomo o valorURL da Imagem; - Um
inputdo tipofilecom o nomeimage; - Múltiplas
labelsendo seus valores os nomes das categorias cadastradas no banco; - Múltiplos
inputdo tipocheckboxcom o nomecategories, cada input ligado a umalabelde categoria; - Um botão do tipo
submitcom o valorSalvar; - Após o cadastro de uma notícia, a pessoa usuária deve ser redirecionada para a página principal;
- Uma
🍀 Dica: Lembre-se de que os arquivos vem em um local diferente do que os outros campos na requisição
🤖 O que será verificado pelo avaliador
- Se existe uma url nomeada
news-form; - Se o template
news_form.htmlestá sendo renderizado na urlnews-form; - Se existe o título
Formulário para Nova Notícia; - Se existe um cabeçalho
headercom a classeheader; - Se existe uma lista não ordenada com a classe
header-links; -
- Se existe um link para a
home-pageescritoHome;
- Se existe um link para a
- Se existe um link para a
categories-formescritoCadastrar Categorias; - Se existe um link para a
news-formescritoCadastrar Notícias; - Se existe a tag de formulário com as propriedades
methodeaction; - Se existe a tag
label; - Se existe a tag
inputcom as propriedadestype,name,maxlengtherequired; - Se existe a tag
labelcomo o valorTítulo; - Se existe a tag
inputdo tipotextcom o nometitle; - Se existe a tag
labelcomo o valorConteúdo; - Se existe a tag
textareacom o nomecontent; - Se existe a tag
labelcomo o valorAutoria; - Se existe a tag
selectcom o nomeauthor; - Se existem as tags
optionsendo seus valores os nomes das pessoas usuárias cadastradas no banco; - Se existe a tag
labelcomo o valorCriado em; - Se existe a tag
inputdo tipodatecom o nomecreated_at; - Se existe a tag
labelcomo o valorURL da Imagem; - Se existe a tag
inputdo tipofilecom o nomeimage; - Se existem as tags
labelsendo seus valores os nomes das categorias cadastradas no banco; - Se existem as tags
inputdo tipocheckbox; - Se existe a tag botão do tipo
submitcom o valorSalvar; - Se o formulário tem o estado inicial vazio;
- Se é possível cadastrar uma nova notícia;
- Se após o cadastro de uma nova categoria, há o redirecionamento para a página principal;
locais: news_rest/serializers/category_serializer.py e news_rest/views/category_view.py
✍️ Detalhes do requisito
- Adicione a rota
api/nas urls do projeto; - Vincule o
routerusado para construção da api com a rotaapi/do projeto; - Registre no
routera rotascategoriescom oviewsetdeCategory; - Crie um
serializerque receba a modelCategorye tenha os camposidename; - Crie uma view que receba todas as categorias cadastradas no banco de dados e o
serializercriado anteriormente; - Crie uma rota para a view criada com o nome de
categories;
🤖 O que será verificado pelo avaliador
- Se existem os campos
idenamenoserializerdeCategory; - Se os campos
idenameapresentam os valores corretos; - Se existe uma rota nomeada
api/categories; - Se a rota
api/categoriesretorna todas as categorias cadastradas no banco de dados; - Se é possível cadastrar uma nova categoria através da rota
api/categories; - Se é possível retornar a categoria criada através da rota
api/categories
locais: news_rest/serializers/user_serializer.py e news_rest/views/user_view.py
✍️ Detalhes do requisito
- Adicione a rota
api/nas urls do projeto; - Vincule o
routerusado para construção da api com a rotaapi/do projeto; - Registre no
routera rotasuserscom oviewsetdeUser; - Crie um
serializerque receba a modelUsere tenha os camposid,name,emailerole; - Crie uma view que receba todas as pessoas usuárias cadastradas no banco de dados e o
serializercriado anteriormente; - Crie uma rota para a view criada com o nome de
users;
🤖 O que será verificado pelo avaliador
- Se existem os campos
id,name,emailerolenoserializerdeUser; - Se os campos
id,name,emaileroleapresentam os valores corretos; - Se o campo
passwordnão é retornado noserializerdeUser; - Se existe uma rota nomeada
api/users; - Se a rota
api/usersretorna todosuserscadastrados no banco de dados; - Se é possível cadastrar um objeto
useratravés da rotaapi/users; - Se é possível retornar o objeto
usercriado através da rotaapi/users;
locais: news_rest/serializers/news_serializer.py e news_rest/views/news_view.py
✍️ Detalhes do requisito
- Adicione a rota
api/nas urls do projeto; - Vincule o
routerusado para construção da api com a rotaapi/do projeto; - Registre no
routera rotasnewscom oviewsetdeNews; - Crie um
serializerque receba a modelNewse tenha os camposid,title,content,author,created_at,imageecategories; - Crie uma view que receba todas as notícias cadastradas no banco de dados e o
serializercriado anteriormente; - Crie uma rota para a view criada com o nome de
news;
🤖 O que será verificado pelo avaliador
- Se existem os campos
id,title,content,author,created_at,imageecategoriesnoserializerdeNews; - Se os campos
id,title,content,author,created_at,imageecategoriesapresentam os valores corretos; - Se existe uma rota nomeada
api/news; - Se a rota
api/news/retorna todas as notícias cadastradas no banco de dados; - Se é possível cadastrar uma nova notícia através da rota
api/news; - Se é possível retornar o objeto
newscriado através da rotaapi/news;