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
Category
deve herdar osmodels
do Django; - A classe
Category
deve ter uma propriedade chamadaname
; - A propriedade
name
deve ser um campo de caracteres com um tamanho máximo de 200 caracteres; - A propriedade
name
não deve aceitar informações vazias ou maiores que 200 caracteres; - O método
__str__
da classeCategory
deve retornar a propriedadename
da categoria criada;
🤖 O que será verificado pelo avaliador
- Se a classe
Category
existe; - Se a classe
Category
possui a propriedadename
; - Se é possível criar uma nova categoria;
- Se o método
__str__
retorna o nome da categoria criada; - Se
name
possui 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
User
deve herdar osmodels
do Django; - A classe
User
deve ter as propriedades chamadaname
,email
,password
erole
; - As propriedades
name
,password
erole
devem ser campos de caracteres com um tamanho máximo de 200 caracteres; - A propriedade
email
deve ser um campo do tipoemail
com 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
,password
erole
não devem aceitar informações vazias ou maiores que 200 caracteres; - O método
__str__
da classeUser
deve retornar a propriedadename
da pessoa usuária criada;
🤖 O que será verificado pelo avaliador
- Se a classe
User
existe; - Se a classe
User
possui as propriedadesname
,email
,password
erole
; - 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
,password
erole
possuem uma propriedade demax_length
; - Se
name
,password
erole
sã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
News
deve herdar os models do Django; - A classe
News
deve ter as propriedades chamadatitle
,content
,author
,created_at
,image
ecategories
; - 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_at
ecategories
não devem aceitar informações vazias; - A propriedade
image
pode aceitar informações vazias; - A propriedade
title
não deve aceitar informações maiores que 200 caracteres; - A propriedade
created_at
não deve aceita datas fora do padrãoAAAA-MM-DD
; - A propriedade
img
deve ter um campoupload_to
que deve ser igual ao diretório'img/'
; - A propriedade
categories
deve aceitar 1 ou mais categorias e deve se relacionar como muitos para muitos; - O método
__str__
da classeNews
deve retornar a propriedadetitle
da notícia criada;
🤖 O que será verificado pelo avaliador
-
Se a classe
News
existe; -
Se é possível criar uma nova notícia;
-
Se a classe
News
possui as propriedadestitle
,content
,author
,created_at
,image
ecategories
; -
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
title
possui uma propriedade demax_length
; -
Se
content
nã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 campostitle
oucontent
.
-
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 seeds
O 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
urls
denews
nasurls
do projeto; - O template da página inicial deve ser renderizado na rota
http://127.0.0.1:8000/
; - O template deve ter uma tag
link
importando o arquivo csscss/style.css
que 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
header
com a classeheader
; - O template da página inicial deve ter uma lista não ordenada com a classe
header-links
dentro do cabeçalho; - O template da página inicial deve ter na lista não ordenada um link
a
com referência para ahome-page
e 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
h2
com a classenews-title
e os títulos das notícias como valores; - O template da página inicial deve ter tags
span
com a classenews-date
e 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.html
está sendo renderizado na urlhome-page
; - Se existe uma importação do arquivo
static/css/style.css
como umstylesheet
; - Se existe um link para a
home-page
escritoHome
; - Se existe o título
Página Inicial
; - Se existe um cabeçalho
header
com a classeheader
; - Se existe uma lista não ordenada com a classe
header-links
; - Se as notícias possuem um título
h2
com a classenews-title
; - Se as notícias possuem uma tag
span
com a classenews-date
para 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
header
com 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
a
com referência para ahome-page
e 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
p
com classenews-content
; - Cada categoria da notícia em uma tag
span
com classenews-categories
; - A pessoa autora da notícia em uma tag
span
com 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.html
para 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.html
está sendo renderizado na urlnews-details-page
; - Se existe o título
Página de Detalhes da Notícia
; - Se existe um cabeçalho
header
com a classeheader
; - Se existe uma lista não ordenada com a classe
header-links
; - Se a notícia possui um título em tag
h1
e com a classenews-title
; - Se a notícia possui um conteúdo em tag
p
e com a classenews-content
; - Se a notícia possui suas categorias em tags
span
e com a classenews-categories
; - Se a notícia possui uma pessoa autora em tag
span
e 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
header
com 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
a
com referência para ahome-page
e com o textoHome
; - O template do formulário de uma nova categoria deve ter no cabeçalho um outro link
a
com referência para acategories-form
e com o textoCadastrar Categorias
; - O template do formulário de uma nova categoria deve ter uma tag de formulário com a propriedade
method
do tipopost
e a propriedadeaction
com a url para/categories
; - O template do formulário de uma nova categoria deve carregar o token de segurança
CSRF
em seu interior usando a tag de template adequada; - O template do formulário de uma nova categoria deve ter uma
label
que como o valorNome
; - O template do formulário de uma nova categoria deve ter um
input
com as algumas especificações:- A propriedade
type
do tipotext
; - A propriedade
name
com o valorname
; - A propriedade
maxlength
com 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
submit
com 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.html
está sendo renderizado na urlcategories-form
; - Se existe o título
Formulário para Nova Categoria
; - Se existe um cabeçalho
header
com a classeheader
; - Se existe uma lista não ordenada com a classe
header-links
; - Se existe um link para a
categories-form
escritoCadastrar Categorias
; - Se existe a tag de formulário com as propriedades
method
eaction
; - Se existe a tag
label
; - Se existe a tag
input
com as propriedadestype
,name
,maxlength
erequired
; - 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
header
com 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
a
com referência para ahome-page
e com o textoHome
; - O template do formulário de uma nova notícia deve ter no cabeçalho um segundo link
a
com referência para acategories-form
e com o textoCadastrar Categorias
; - O template do formulário de uma nova notícia deve ter no cabeçalho um terceiro link
a
com referência para anews-form
e 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
method
do tipopost
, a propriedadeaction
com a url para/news/
e a propriedadeenctype
com valormultipart/form-data
; - O template do formulário de uma nova notícia deve carregar o token de segurança
CSRF
em seu interior usando a tag de template adequada; - O template do formulário de uma nova notícia deve ter as seguintes tag:
- Uma
label
como o valorTítulo
; - Um
input
do tipotext
com o nometitle
; - Uma
label
como o valorConteúdo
; - Um
textarea
com o nomecontent
; - Uma
label
como o valorAutoria
; - Um
select
com o nomeauthor
; - Múltiplos
option
sendo seus valores os nomes das pessoas usuárias cadastradas no banco; - Uma
label
como o valorCriado em
; - Um
input
do tipodate
com o nomecreated_at
; - Uma
label
como o valorURL da Imagem
; - Um
input
do tipofile
com o nomeimage
; - Múltiplas
label
sendo seus valores os nomes das categorias cadastradas no banco; - Múltiplos
input
do tipocheckbox
com o nomecategories
, cada input ligado a umalabel
de categoria; - Um botão do tipo
submit
com 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.html
está sendo renderizado na urlnews-form
; - Se existe o título
Formulário para Nova Notícia
; - Se existe um cabeçalho
header
com a classeheader
; - Se existe uma lista não ordenada com a classe
header-links
; -
- Se existe um link para a
home-page
escritoHome
;
- Se existe um link para a
- Se existe um link para a
categories-form
escritoCadastrar Categorias
; - Se existe um link para a
news-form
escritoCadastrar Notícias
; - Se existe a tag de formulário com as propriedades
method
eaction
; - Se existe a tag
label
; - Se existe a tag
input
com as propriedadestype
,name
,maxlength
erequired
; - Se existe a tag
label
como o valorTítulo
; - Se existe a tag
input
do tipotext
com o nometitle
; - Se existe a tag
label
como o valorConteúdo
; - Se existe a tag
textarea
com o nomecontent
; - Se existe a tag
label
como o valorAutoria
; - Se existe a tag
select
com o nomeauthor
; - Se existem as tags
option
sendo seus valores os nomes das pessoas usuárias cadastradas no banco; - Se existe a tag
label
como o valorCriado em
; - Se existe a tag
input
do tipodate
com o nomecreated_at
; - Se existe a tag
label
como o valorURL da Imagem
; - Se existe a tag
input
do tipofile
com o nomeimage
; - Se existem as tags
label
sendo seus valores os nomes das categorias cadastradas no banco; - Se existem as tags
input
do tipocheckbox
; - Se existe a tag botão do tipo
submit
com 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
router
usado para construção da api com a rotaapi/
do projeto; - Registre no
router
a rotascategories
com oviewset
deCategory
; - Crie um
serializer
que receba a modelCategory
e tenha os camposid
ename
; - Crie uma view que receba todas as categorias cadastradas no banco de dados e o
serializer
criado anteriormente; - Crie uma rota para a view criada com o nome de
categories
;
🤖 O que será verificado pelo avaliador
- Se existem os campos
id
ename
noserializer
deCategory
; - Se os campos
id
ename
apresentam os valores corretos; - Se existe uma rota nomeada
api/categories
; - Se a rota
api/categories
retorna 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
router
usado para construção da api com a rotaapi/
do projeto; - Registre no
router
a rotasusers
com oviewset
deUser
; - Crie um
serializer
que receba a modelUser
e tenha os camposid
,name
,email
erole
; - Crie uma view que receba todas as pessoas usuárias cadastradas no banco de dados e o
serializer
criado 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
,email
erole
noserializer
deUser
; - Se os campos
id
,name
,email
erole
apresentam os valores corretos; - Se o campo
password
não é retornado noserializer
deUser
; - Se existe uma rota nomeada
api/users
; - Se a rota
api/users
retorna todosusers
cadastrados no banco de dados; - Se é possível cadastrar um objeto
user
através da rotaapi/users
; - Se é possível retornar o objeto
user
criado 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
router
usado para construção da api com a rotaapi/
do projeto; - Registre no
router
a rotasnews
com oviewset
deNews
; - Crie um
serializer
que receba a modelNews
e tenha os camposid
,title
,content
,author
,created_at
,image
ecategories
; - Crie uma view que receba todas as notícias cadastradas no banco de dados e o
serializer
criado 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
,image
ecategories
noserializer
deNews
; - Se os campos
id
,title
,content
,author
,created_at
,image
ecategories
apresentam 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
news
criado através da rotaapi/news
;