Minicurso de Django 1.10 com a criação de um projeto completo em Django e conteúdos sobre:
Introdução a Python, Autenticação de usuários Django, Relacionamentos de classes do Django. Templates, etc.
2. Introdução ao Python
1. Sintaxe
2. Variáveis
3. Loops
4. Funções
5. Orientação a objetos
2 Tópicos abordados
Django e Projeto de Microblog
1. Criação de projetos
2. Criação de aplicações
3. Criação de classes
4. Relacionamento entre classes
5. Criação de urls
6. Criação de views
7. Criação de templates
3. 3
POR QUÊ USAR O DJANGO?
● Desenvolvimento ágil
● Orientado a objetos
● Fácil gerenciamento de Banco de dados
● Possui painel administrativo com diversas funções
● Possui uma comunidade colaborativa muito ativa
O que é Django? Por quê usar?
SITES QUE USAM DJANGO
Conjunto de ferramentas em Python para
agilizar o desenvolvimento web.
4. 4 Simplicidade do Python
public class OlaMundo {
public static void main(String[] args) {
System.out.println("Olá mundo");
}
}
print ('Olá Mundo!')
Java Python
5. 5 Sintaxe
if <condição>:
<bloco de código>
<bloco de código>
elif <condição>:
<bloco de código>
else:
<bloco de código>
if (condição) {
<bloco de código>;
}
else if (condição) {
<bloco de código>;
}
else {
<bloco de código>;
}
6. 6 Variáveis
numero = 123
decimal = 10.5
palavra = “Olá Mundo!”
booleano = True
● É uma posição na memória que
armazena um valor
● Não é preciso declarar o tipo
● É o conteúdo da variável
determina o seu tipo
7. 7 Condições
if numero == 0:
print(‘O número é zero’)
elif numero % 2 == 0:
print('Par')
else:
print('Impar')
if Se o número for igual a zero, informar que o
número é igual a zero.
elif Senão se o número tiver resto igual a zero, o
número é par.
else Caso contrário, o número é ímpar.
8. 8 Operadores
Aritiméticos Comparação Lógicos
Igual==
Diferente!=
Maior que>
Menor que<
Maior ou igual>=
Menor ou igual<=
Soma+
Subtração-
Multiplicação*
Divisão/
Eand
Ouor
Emin
Éis
Nãonot
if x <= 3 and x > 0:
x += 1
9. 9 Funções
def soma(x, y):
return x + y
def parametro_opcional(nome=None):
print(nome)
resultado = soma(2,5)
● Função é um bloco de código que
realiza uma tarefa específica.
● Evita repetição:
○ Podemos criar uma única
função e chamar ela diversas
vezes no código.
● É definida por “def”;
● Uma função pode:
○ Receber parametros
○ Retornar valores
10. São conjuntos ordenados de
valores, onde cada valor é
identificado por um índice.
O índice é o número relativo à
posição do dado que queremos
acessar:
10 Listas
# Declaração
lista_vazia = list()
numeros = [2, 1, 3, 5, 4];
palavras = ["abc", "b", "cachorro"]
lista_mista = ['gato', 'bola', 1997, 2000];
# Acesso
print (palavras[2]) # cachorro
2 1 3 5 4
[1] [2] [3] [4] [5]
11. ● Listas utilizam inteiros como
índices.
● Dicionários utilizam qualquer tipo
de dados como índice.
○ dicionario[“indice”]
● Um dicionário vazio é declarado
com o uso de dict( ) ou { }.
11 Dicionários
# Declaração
dict_vazio = dict()
pessoa = {'nome': 'Maria', 'idade': 7}
# Acesso
print (pessoa['nome'])
CHAVE VALOR
12. 12 Estruturas de repetição
x = 0
while x < 10:
print (x)
x += 1 # Aumenta de 1 em 1
nomes = ['João', 'Maria', 'Bruno']
for nome in nomes:
print(nome)
# Imprime de 0,...9
for x in range(10):
print(x)
For While
13. Estratégia que visa facilitar a
utilização de conceitos da vida real
na programação, utilizando classes
para descrever estes conceitos e
objetos para representá-los.
Não existe uma variável do tipo “pessoa”. Como
representamos pessoas no código?
13 Orientação a Objetos com Python
Python
14. 14 Orientação a objetos com Python
maria = Pessoa()
maria.nome = 'Maria'
maria.idade = 20
maria.falar_nome()
class Pessoa(object):
nome = "" # características
idade = 0 # características
def falar_nome(self): # comportamento
print (self.nome)
Classe Objeto
15. As classes são as instruções de como
deve ser um objeto.
● atributos da classe definem suas
características
● métodos definem o
comportamento da classe.
15 Classes
class Jedi(object):
sabreDeLuz = "Verde"
def sacarSabreDeLuz(self):
print ("Pssshhew")
ATRIBUTO
MÉTODO
16. Um objeto é uma entidade criada de
acordo com a classe, possuindo as
informações que desejarmos, podendo
ser replicado sempre que necessário.
16 Objetos
obiWan = Jedi()
obiWan.corDoSabre = “Azul”
yoda = Jedi()
yoda.corDoSabre = “Verde”
obiWan.sacarSabreDeLuz()
yoda.sacarSabreDeLuz()
17. 17 Herança
class Cao(object):
def latir(self):
print ("Au!")
class Poodle(Cao):
corDoPelo = ""
class Viralata(Cao):
pedigree = False
CÃO
Classe genérica que serve como base
18. Uma classe possui como atributo um objeto de outra classe
18 Agregação
class Aluno(object):
turma = None
class Turma(object):
nome = '201B'
turma = Turma()
aluno = Aluno()
aluno.turma = turma
19. Escreva um programa.py que contem uma classe Pessoa com as seguintes informações:
nome, ano de nascimento, endereço. Além disso, deve conter um método para obter idade
(idade = ano_nascimento - ano_atual).
Em seguida, crie uma classe funcionário que herda a classe pessoa e acrescenta as seguintes
informações: salario e cargo. Por fim, construa um funcionário abaixo:
19 Exercício de Python
Nome Ano
nascimento
Endereço Salario
João Silva 1985 Santa Maria R$ 3.000
21. NO WINDOWS
1. Vá até o site oficial do Python: www.python.org
2. Baixe o installer da versão 2.7 de acordo com seu SO
(64 ou 32 bits)
3. Abra o Prompt de Comando e digite:
21
NO LINUX
1. Abra o console e digite:
pip install django
sudo apt-get install python-pip
sudo pip install django
Instalando o Django
22. Microblog onde os usuários
podem publicar pequenos
textos, seguir pessoas e
curtir textos de outras
pessoas.
22 Projeto Microblog
Diagrama de Classes Casos de Uso
Projeto: https://github.com/guilegarcia/Microblog
23. Um projeto Django é feito por diversas
aplicações (apps).
Devido a natureza modular do Django,
um app pode ser transferido de um
projeto a outro.
23 Estrutura do Projeto
Microblog
Autor
Posts
PROJETO
APPs
24. Páginas: (possuem entrada no urls.py, views.py e um template HTML )
● Timeline
● Quem seguir
● Criar autor
● Criar post
● Login
Links: (possuem entrada somente no urls.py e views.py)
● Sair
● Excluir conta
● Seguir usuário
● Unfollow
● Curtir post
24 Conteúdo do Projeto
25. Vamos criar o nosso projeto chamado
Microblog, digitando no console:
25 Criando o projeto
django-admin startproject Microblog
26. 26 Estrutura do projeto
__init__.py
settings.py (configurações do projeto)
urls.py (geralmente importa as urls das aplicações)
wsgi.py
Microblog
Microblog
27. Vamos criar a aplicação “posts” do nosso
projeto Microblog.
27 Criando a aplicação “posts”
python manage.py startapp posts
29. Crie as aplicações utilizando o terminal e
as adicione em INSTALLED_APPS no
/Microblog/settings.py
29 Criando as aplicações
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'posts',
)
30. 30 Arquitetura do Django
(
(r’^contato/$’,
‘blog.contato’),
(r’^posts/$’,
‘blog.posts’),
)
urls.py
{% extends ‘base.html’%}
{% block content %}
{% for p in posts %}
<h1>{{p.title}}</h1>
<p>{{p.content}}</p>
{% endfor %}
{% endblock %}
posts.html
def posts(request):
p=Post.objects.all()
return render(request,
‘posts.html’.
{‘posts’:p}
)
views.py
class Post(Model):
title=CharField(max_lenght=50)
content=TextField()
date=Datefield()
cat=ForeignKey(Category)
autor=CharField(max_lenght=50)
class Category(Model):
name=CharField()
models.py
Cliente
Request
Response
31. ● São classes que define os dados que
serão trabalhados na aplicação.
● Cada classe é uma tabela no banco
de dados
● Classes importam de models.Model
● Possui diferentes tipos de atributos
Nosso projeto tem duas Classes: Autor e Post
31 Modelos /app/models.py
from django.db import models
class Pessoa(models.Model):
nome =
models.CharField(max_length=30)
endereco = models.TextField()
email = models.EmailField()
33. 1. Herança
2. Many-to-one (Muitos para um)
3. Many-to-many (Muitos para Muitos)
4. One-to-one (Um para um)
33 Relacionamentos entre classes Django
34. 34 Relacionamentos entre classes - Herança
from django.db import models
class Pessoa(models.Model):
nome = models.CharField(max_length=2)
class Funcionario(Pessoa):
pass
class Professor(Pessoa):
pass
35. 35 Relacionamento - Many-to-one(ForeignKey)
class Banda(models.Model):
pass
class Musico(models.Model):
banda = models.ForeignKey(Banda)
36. 36 Relacionamentos entre classes - Many-to-many
class Autor(models.Model):
nome = models.CharField(max_length=30)
data_nascimento = models.DateField()
class Artigo(models.Model):
titulo = models.CharField(max_length=100)
autores = models.ManyToManyField(Autor)
37. 37 Relacionamentos entre classes - One-to-one (é um)
class Local(models.Model):
nome = models.CharField(max_length=50)
endereco = models.CharField(max_length=80)
class Restaurante(models.Model):
local = models.OneToOneField(Local,primary_key=True,)
serve_pizza = models.BooleanField(default=False)
38. 38 Criando a classe “Post”
from django.db import models
from autores.models import Autor
class Post(models.Model):
texto = models.TextField(max_length=140) #max_lenght define o máximo de caracteres do
campo
likes = models.IntegerField(default=0)
autor = models.ForeignKey(Autor, null=True, blank=True)
data_hora = models.DateTimeField(auto_now_add=True) #auto_now_add adiciona a hora atual
/posts/models.py
39. ● Utilizaremos o usuário padrão para
criar Autor
● Django fornece um usuário padrão
que pode ser utilizado na aplicação.
● A classe User será utilizada na
autenticação dos usuários
● É possível estender o User e
acrescentar informações
(AbstractUser)
39 Usuário padrão do Django
Referência: https://docs.djangoproject.com/pt-br/1.10/ref/contrib/auth/#user-model
40. Crie a aplicação “autores” e a classe “Autor” contendo o campo:
● biografia (models.TextField)
● Lembre-se de add a nova aplicação em settings.py/INSTALLED_APPS
40 Exercício - Aplicação e classe para autores
41. 41 Criando a classe “Autor”
from django.db import models
from django.contrib.auth.models import AbstractUser
class Autor(AbstractUser): # Herda do usuário comum do Django
seguindo = models.ManyToManyField('self', null=True, blank=True)
biografia = models.TextField(blank=True, null=True)
/autores/models.py
42. 42 Adicionar Autor no Settings.py
# Usuário padrão
AUTH_USER_MODEL = 'autores.Autor'
Adicionar o Autor como usuário padrão
do Django em:
/Microblog/Microblog/settings.py
43. 43 Atualizando o Banco de Dados
# Verifica quais atualizações são necessárias
python manage.py makemigrations
# Aplica as atualizações no banco de dados
python manage.py migrate
Após modificações no models.py deve se utilizar os comandos abaixo no terminal,
fazendo com que o Django atualize o Banco de Dados.
45. Criar uma url e uma views.py na aplicação “posts”
45 Criar a primeira views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Olá mundo")
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
46. Uma URL pode apontar para uma função ou classe. A urls.py da parte principal do
projeto geralmente inclui as urls das aplicações.
46 Mapeamento de URLs
from django.conf.urls import url
from models.views import criar_autor
urlpatterns = [
url(r'^criar-autor/$', criar_autor, name='criar_autor'),
]
• Nome da requisição no navegador.
Ex: www.site.com/criar-autor/
• O r na frente da url significa que a expressão
deve ser tratada como somente texto.
• A requisição deve executar a função
determinada aqui.
• Nome utilizado para este caminho de URL
quando chamado através de variável.
Ex: {% url ‘criar_autor’ %}
47. ● Para exibir as informações na web é
preciso do HTML.
● O HTML é estático, não é possível
criar variáveis, listar objetos, etc.
● Para isso o Django disponibiliza a
linguagem de templates.
47 HTML <!DOCTYPE HTML>
<html lang="pt-br">
<head>
<title>TÍTULO</title>
</head>
<body>
<header>
<nav>
<ul>
<li>Menu</li>
</ul>
</nav>
</header>
<footer>
<p>RODAPÉ</p>
</footer>
</body>
</html>
48. O templates do Django adicionar algumas
funcionalidades ao HTML estático da
aplicação.
Exemplo:
● Exibir variáveis;
● Imprimir listas (for)
● Criar condições (if, else)
48 Templates Django
49. Uma variável emite um valor a partir do
contexto, que é um objeto dicionário que
mapeia chaves para valores.
{“chave”:”valor”}
{{ variáveis }}
49 Templates Django - Variáveis
<!DOCTYPE html>
<html>
<body>
<p>Meu nome é {{ nome }} e minha idade
{{ idade }}.</p>
</body>
</html>
50. As tags fornecem lógica no processo de
renderização das páginas HTML.
Tags são definidas por {% tag %}
50 Templates Django - Tags
<!DOCTYPE html>
<html>
<body>
{% if numero > 0 %}
<p>Positivo</p>
{% else %}
<p>Negativo</p>
{% endif %}
</body>
</html>
51. 51 Templates Django - Lista de Tags
https://docs.djangoproject.com/pt-br/1.10/ref/templates/builtins/#ref-templates-builtins-tags
<!DOCTYPE html>
<html>
<body>
{% for autor in lista_autores %}
<p>{{ autor.nome }}</p>
{% empty %}
<p>Não há autores.</p>
{% endfor %}
</body>
</html>
{% for %} imprime os itens de uma lista
{% url 'nome_da_url' %} imprime a url
{% now 'd/m/Y H:i' %} imprime a data e
hora atual
52. Servem para transformar os valores de
variáveis e tags dentro do html.
Usa-se uma barra: | filtro
{{ variavel | filtro }}
52 Templates Django - Filtros
53. 53 Templates Django - Lista de Filtros
<!DOCTYPE html>
<html>
<body>
{{ minha_data|date:"d-m-Y" }} {# 15/11/2016 #}
{{ variavel|default_if_none:"Em Branco" }}
{{ variavel|title }} {# Título Com Maiúscula #}
{{ variavel_lista|first }} {# Primeiro item da lista #}
</body>
</html>
https://docs.djangoproject.com/pt-br/1.10/ref/templates/builtins/#ref-templates-builtins-filters
55. Salve as pastas /css/, /js/ e /fonts/ na
pasta:
/Microblog/static/
55 Importar arquivos CSS e JS para o projeto
# Static files (CSS, JavaScript, Images)
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static/'),
)
https://github.com/guilegarcia/Microblog/tree/mast
er/static
56. Salve a pasta /templates/ na pasta:
/Microblog/
Adicione dentro de [] em ‘DIRS’:
os.path.join(BASE_DIR, 'templates')
56 Importar arquivos .html do projeto
TEMPLATES = [
'DIRS': [os.path.join(BASE_DIR, 'templates')]
]
https://github.com/guilegarcia/Microblog/tree/mast
er/templates
57. Servem para o envio de informações do
cliente para o servidor. Usados em
cadastros, logins, pesquisas, etc.
57 Formulários
Login
Senha
ENTRAR
*******************
usuario
58. ● Django da pronto os métodos login()
e logout()
○ Precisamos criar as urls e o HTML.
● @login_required
● request.user
58 Autenticação do usuário
61. 61 Settings.py
# Autentificacao do usuario
LOGIN_URL = "/login/"
LOGOUT_URL = "/sair/"
LOGIN_REDIRECT_URL = "/index/"
É preciso adicionar o usuário padrão (que
será utilizado para autenticação) e as urls
para login em /projeto/settings.py
62. Para obter o usuário logado no sistema
usa-se o request.user
Ao chamar a função login(request,
user), definida no método logar(), o
usuário é inserido na sessão. Para obter
o usuário que está na sessão usa-se o
request.user
62 Obter usuário logado
from django.contrib.auth.decorators import
login_required
from django.shortcuts import render
@login_required
def autor(request):
autor = request.user
return render(request, 'autor.html', {'autor':
autor})
63. Usa-se o @login_required para garantir
que apenas os usuários logados
acessem um determinado controller
(views.py).
Caso o usuário não esteja logado, o
Django irá redirecionar para a página de
login especificada em settings.py.
63 @login_required
from django.contrib.auth.decorators import
login_required
from django.shortcuts import render
@login_required
def autores(request):
autores = Autor.objects.all()
return render(request, 'autores.html',
{'autores': autores})
64. 1. Crie um arquivo urls.py na pasta
das aplicações posts e autores
2. Importe as urls das aplicações
posts e autores na urls.py
64 Importando as URLs das aplicações
urlpatterns = [
url(r'^autores/', include('autores.urls')), # /autores/**
url(r'^posts/', include('posts.urls')), # /posts/**
]
65. 65 Consultas no banco de dados
# Busca todos autores
autores = Autor.objects.all()
# Busca um autor
autor = Autor.objects.get(id=1)
# Autores que se chamam “João”
autores_nome = Autor.objects.filter(first_name='João')
# Todos os posts ordenados por data e hora de criação
posts_ordenados = Post.objects.all().order_by('data_hora')
66. Crie uma função para listar os autores. Passos:
1. Criar função “autores” em /autores/views.py
a. Buscar todos autores no banco de dados
b. Enviar esse autor para o template “autores.html” usando render()
2. Criar a /autores/urls.py r'^$' para a função
3. Listar os autores no /templates/autores.html usando {% for
%}
66 Exercício: Listar autores
67. 67 Listar autores
from django.conf.urls import url
from autores import views
urlpatterns = [
url(r'^$', views.autores, name='autores'),
]
from autores.models import Autor
from django.shortcuts import render
def autores(request):
autores = Autor.objects.all()
return render(request, 'autores.html',
{'autores': autores})
68. 68 Timeline (listar posts)
from django.conf.urls import url
from posts.views import index
urlpatterns = [
url(r'^index/$', index, name='index'),
]
from django.shortcuts import redirect
from .models import Post
from django.db.models import Q
from django.contrib.auth.decorators import login_required
@login_required
def index(request):
autor = request.user
if autor.seguindo: # None não funciona no filter
# Q = OR (sql) __in (verifica uma lista)
posts =
Post.objects.filter(Q(autor__in=autor.seguindo.all()
) | Q(autor=autor))
# .all() busca todos itens que estão seguindo
else:
posts = None
return render(request, 'index.html', {'posts':
posts})
69. 69 Acessar autor
from django.conf.urls import url
from autores import views
urlpatterns = [
url(r'^(?P<id>d+)/$', views.autor,
name='autor'),
]
from django.shortcuts import render,
get_object_or_404
from autores.models import Autor
def autor(request, id=None):
autor = get_object_or_404(Autor, id=id)
posts = Post.objects.filter(autor=autor)
return render(request, 'autor.html',
{'autor': autor, 'posts': posts})
70. 70 Excluir autor
from django.conf.urls import url
from autores import views
urlpatterns = [
url(r'^excluir/(?P<id>d+)/$',
views.excluir_autor, name='excluir_autor'),
]
from django.shortcuts import render,
get_object_or_404
from autores.models import Autor
def excluir_autor(request, id=None):
"""
Recebe o id do Autor e exclui
"""
autor = get_object_or_404(Autor, id=id)
autor.delete()
return redirect('index')
71. 71 Seguir autor
from django.conf.urls import url
from autores import views
urlpatterns = [
url(r'^seguir/(?P<id>d+)/$',
views.seguir, name='seguir_autor'),
]
from django.shortcuts import redirect
from autores.models import Autor
def seguir(request, id=None):
"""
Recebe o id do usuário que irá seguir
"""
autor_seguir = Autor.objects.get(id=id)
autor = request.user
autor.seguindo.add(autor_seguir) # .add
adiciona na lista de seguindo
autor.save()
return redirect('autores')
72. 72 Unfollow autor
from django.conf.urls import url
from autores import views
urlpatterns = [
url(r'^unfollow/(?P<id>d+)/$',
views.unfollow, name='unfollow'),
]
from django.shortcuts import redirect
from autores.models import Autor
def unfollow(request, id=None):
"""
Recebe o id do usuário que irá seguir
"""
autor_unfollow = Autor.objects.get(id=id)
autor = request.user
autor.seguindo.remove(autor_unfollow) #
.remove remove da lista de seguindo
autor.save()
return redirect('autores')
73. 73 Curtir post
from django.conf.urls import url
from autores import views
urlpatterns = [
url(r'^curtir/(?P<id>d+)/$',
views.curtir, name='curtir_post'),
]
from django.shortcuts import render, get_object_or_404
from .models import Post
@login_required
def curtir(request, id=None):
post = get_object_or_404(Post, id=id)
post.likes += 1
post.save()
# request.META.get('HTTP_REFERER') mostra
de onde veio a requisição (index ou autor)
return
redirect(request.META.get('HTTP_REFERER'))
74. É uma alternativa para implementar
Views como classes ao em vez de
funções. O Django disponibiliza diversas
classes prontas que podem ser adaptadas.
Exemplos:
● CreateView
● UpdateView
74 Forms do Django - Class-based views
75. 75 Resultado - CreateView Autor
from django.conf.urls import url
from autores.views import AutorCreate
urlpatterns = [
url(r'^criar-autor/$', CriarAutor.as_view(),
name='criar_autor'),
]
76. 76 Resultado - CreateView Autor
from django.views.generic.edit import CreateView
from autores.models import Autor
class CriarAutor(CreateView):
model = Autor
fields = ['first_name', 'last_name', 'email', 'username', 'password']
template_name = 'criar-autor.html'
success_url = '.'
def form_valid(self, form):
usuario = form.save(commit=False)
usuario.set_password(form.cleaned_data['password'])
usuario.save()
return super(CriarAutor, self).form_valid(form)
77. Crie:
1. URL para o CriarPost (CreateView) em /posts/urls.py
2. Crie a classe CriarPost(CreateView) para criar os posts em /posts/views.py.
a. Em fields adicione apenas ‘texto’ e ‘autor’
Obs: É preciso criar o arquivo urls.py
77 Exercício - Criar Post
78. 78 Resultado - CreateView Post
from django.views.generic.edit import CreateView
class CriarPost(CreateView):
model = Post
fields = ['texto', 'autor']
template_name = 'criar-post.html'
success_url = '.'
79. 79 Resultado - CreateView Post
from django.conf.urls import url
from .views import CriarPost
urlpatterns = [
url(r'^criar/$', CriarPost.as_view(), name='criar_autor'),
]