SlideShare uma empresa Scribd logo
DESENVOLVIMENTO WEB COM
Vinicius Coelho
vncs.coelho@gmail.com
Guilherme Garcia
guilesgarcia@gmail.com
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
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 Simplicidade do Python
public class OlaMundo {
public static void main(String[] args) {
System.out.println("Olá mundo");
}
}
print ('Olá Mundo!')
Java Python
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 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 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 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 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
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]
● 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 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
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 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
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
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 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
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
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
20 Resultado exercício
funcionario = Funcionario()
funcionario.nome = 'João Silva'
funcionario.ano_nascimento = 1985
funcionario.endereco = 'Santa Maria'
funcionario.salario = 3000
print(funcionario.obter_idade())
#coding:utf-8
class Pessoa(object):
nome = “”
endereco = “”
ano_nascimento = 0
def obter_idade(self):
return 2016 - self.ano_nascimento
class Funcionario(Pessoa):
cargo = ''''
salario = 0
Classe Objeto
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
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
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
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
Vamos criar o nosso projeto chamado
Microblog, digitando no console:
25 Criando o projeto
django-admin startproject Microblog
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
Vamos criar a aplicação “posts” do nosso
projeto Microblog.
27 Criando a aplicação “posts”
python manage.py startapp posts
28 Estrutura da aplicação
__init__.py
admin.py
models.py
tests.py
migrations
posts
urls.py (precisa criar)
views.py
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 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
● 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()
boolean = models.BooleanField()
string = models.CharField()
data = models.DateTimeField()
email = models.EmailField()
arquivo = models.FileField()
numero_real = models.FloatField()
numero_inteiro = models.IntegerField()
32 Atributos das classes no Django
imagem = models.ImageField()
endereco_de_ip = models.IPAddressField()
Inteiro_positivo = models.PositiveIntegerField()
texto = models.TextField()
url = models.URLField()
outra_classe = models.ForeignKey()
muitos_para_muitos = models.ManyToManyField()
Atributos importados do modulo: from django.db import models
https://docs.djangoproject.com/en/1.10/ref/models/fields/
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 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 Relacionamento - Many-to-one(ForeignKey)
class Banda(models.Model):
pass
class Musico(models.Model):
banda = models.ForeignKey(Banda)
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 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 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
● 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
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 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 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 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.
44 Arquitetura do Django
HTMLPY
PY
views.py
template.htmlmodels.py
PY
urls.py
NAVEGADOR
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'),
]
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’ %}
● 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>
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
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>
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 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
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 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
54 Herdando templates
<!DOCTYPE html>
<html>
{% block “titulo” %}
{% endblock %}
<body>
{% block “conteudo” %}
--Aqui vai o HTML customizado
{% endblock %}
</body>
</html>
{% extends “base.html” %}
{% block “titulo” %}
<h1>Título da página</h1>
{% endblock %}
{% block “conteudo” %}
<p>Corpo da página<p/>
{% endblock %}
filho.htmlbase.html
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
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
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
● 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
59 Autenticação do usuário - urls
from django.contrib.auth import views
urlpatterns = [
# Login autentificacao
url(r'^$', views.login, {'template_name': 'login.html'},
name='login'),
url(r'^logout/$', views.logout, {'next_page': '/'},
name='logout'),
]
60 Forms do Django - HTML e tags
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form action="{% url 'login' %}" method="post"> {% csrf_token %}
<label for="your_name">Usuário: </label>
<input id="your_name" type="text" name="username" >
<label for="your_name">Senha: </label>
<input id="your_name" type="password" name="password" >
<input type="submit" value="Logar">
</form>
</body>
</html>
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
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})
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})
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 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')
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 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 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 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 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 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 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 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'))
É 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 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 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)
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 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 Resultado - CreateView Post
from django.conf.urls import url
from .views import CriarPost
urlpatterns = [
url(r'^criar/$', CriarPost.as_view(), name='criar_autor'),
]
Anúncio

Recomendados

Desenvolvimento de aplicações para dispositivos móveis
Desenvolvimento de aplicações para dispositivos móveis
Marcelo Quinta
 
Programação Orientação a Objetos - Herança
Programação Orientação a Objetos - Herança
Daniel Brandão
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a Objetos
Daniel Brandão
 
Aula 1 - Introdução a POO
Aula 1 - Introdução a POO
Daniel Brandão
 
Kill the mutants - A better way to test your tests
Kill the mutants - A better way to test your tests
Roy van Rijn
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutos
phelypploch
 
08 modificadores static
08 modificadores static
Artur Todeschini
 
Exercícios PL/SQL
Exercícios PL/SQL
fernandomandarini
 
POO - 11 - Prática de Herança
POO - 11 - Prática de Herança
Ludimila Monjardim Casagrande
 
JMeter Load Testing | Load Testing Using JMmeter | JMeter Tutorial For Beginn...
JMeter Load Testing | Load Testing Using JMmeter | JMeter Tutorial For Beginn...
Simplilearn
 
Aula 2 - Comandos DDL DML DQL E DCL
Aula 2 - Comandos DDL DML DQL E DCL
César Augusto Pessôa
 
Java básico - Módulo 04: Estruturas de controle
Java básico - Módulo 04: Estruturas de controle
Professor Samuel Ribeiro
 
Apostila de Fundamentos Java
Apostila de Fundamentos Java
Marcio Marinho
 
Web Design Responsivo
Web Design Responsivo
Eduardo Mendes
 
Aula 01 - UML e Padrões de Projeto
Aula 01 - UML e Padrões de Projeto
Vinícius de Paula
 
Aula02 - JavaScript
Aula02 - JavaScript
Jorge Ávila Miranda
 
Aula javascript
Aula javascript
Gabriel Moura
 
Formulário HTML
Formulário HTML
Evandro Manara Miletto
 
Exercícios de relacionamento 2012
Exercícios de relacionamento 2012
Vitor Leal Diniz
 
POO - 16 - Polimorfismo
POO - 16 - Polimorfismo
Ludimila Monjardim Casagrande
 
Psi m14
Psi m14
Luis Ferreira
 
Programação Orientada á Objeto - Paradigmas e Implementação
Programação Orientada á Objeto - Paradigmas e Implementação
Evandro Júnior
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Helder da Rocha
 
POO - 19 - Elementos Estáticos
POO - 19 - Elementos Estáticos
Ludimila Monjardim Casagrande
 
Qualidade de Software
Qualidade de Software
Tiago Antônio da Silva
 
Análise e Modelagem de Software
Análise e Modelagem de Software
Marcelo Yamaguti
 
DevOps - Cultura e Filosofia
DevOps - Cultura e Filosofia
Jônatan Gouveia
 
1.Introdução Banco de Dados
1.Introdução Banco de Dados
vini_campos
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
Rodrigo Nossal
 
Tutorial Django + Python
Tutorial Django + Python
Mateus Padua
 

Mais conteúdo relacionado

Mais procurados (20)

POO - 11 - Prática de Herança
POO - 11 - Prática de Herança
Ludimila Monjardim Casagrande
 
JMeter Load Testing | Load Testing Using JMmeter | JMeter Tutorial For Beginn...
JMeter Load Testing | Load Testing Using JMmeter | JMeter Tutorial For Beginn...
Simplilearn
 
Aula 2 - Comandos DDL DML DQL E DCL
Aula 2 - Comandos DDL DML DQL E DCL
César Augusto Pessôa
 
Java básico - Módulo 04: Estruturas de controle
Java básico - Módulo 04: Estruturas de controle
Professor Samuel Ribeiro
 
Apostila de Fundamentos Java
Apostila de Fundamentos Java
Marcio Marinho
 
Web Design Responsivo
Web Design Responsivo
Eduardo Mendes
 
Aula 01 - UML e Padrões de Projeto
Aula 01 - UML e Padrões de Projeto
Vinícius de Paula
 
Aula02 - JavaScript
Aula02 - JavaScript
Jorge Ávila Miranda
 
Aula javascript
Aula javascript
Gabriel Moura
 
Formulário HTML
Formulário HTML
Evandro Manara Miletto
 
Exercícios de relacionamento 2012
Exercícios de relacionamento 2012
Vitor Leal Diniz
 
POO - 16 - Polimorfismo
POO - 16 - Polimorfismo
Ludimila Monjardim Casagrande
 
Psi m14
Psi m14
Luis Ferreira
 
Programação Orientada á Objeto - Paradigmas e Implementação
Programação Orientada á Objeto - Paradigmas e Implementação
Evandro Júnior
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Helder da Rocha
 
POO - 19 - Elementos Estáticos
POO - 19 - Elementos Estáticos
Ludimila Monjardim Casagrande
 
Qualidade de Software
Qualidade de Software
Tiago Antônio da Silva
 
Análise e Modelagem de Software
Análise e Modelagem de Software
Marcelo Yamaguti
 
DevOps - Cultura e Filosofia
DevOps - Cultura e Filosofia
Jônatan Gouveia
 
1.Introdução Banco de Dados
1.Introdução Banco de Dados
vini_campos
 
JMeter Load Testing | Load Testing Using JMmeter | JMeter Tutorial For Beginn...
JMeter Load Testing | Load Testing Using JMmeter | JMeter Tutorial For Beginn...
Simplilearn
 
Java básico - Módulo 04: Estruturas de controle
Java básico - Módulo 04: Estruturas de controle
Professor Samuel Ribeiro
 
Apostila de Fundamentos Java
Apostila de Fundamentos Java
Marcio Marinho
 
Aula 01 - UML e Padrões de Projeto
Aula 01 - UML e Padrões de Projeto
Vinícius de Paula
 
Exercícios de relacionamento 2012
Exercícios de relacionamento 2012
Vitor Leal Diniz
 
Programação Orientada á Objeto - Paradigmas e Implementação
Programação Orientada á Objeto - Paradigmas e Implementação
Evandro Júnior
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Helder da Rocha
 
Análise e Modelagem de Software
Análise e Modelagem de Software
Marcelo Yamaguti
 
DevOps - Cultura e Filosofia
DevOps - Cultura e Filosofia
Jônatan Gouveia
 
1.Introdução Banco de Dados
1.Introdução Banco de Dados
vini_campos
 

Destaque (19)

Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
Rodrigo Nossal
 
Tutorial Django + Python
Tutorial Django + Python
Mateus Padua
 
Treinamento Básico de Django
Treinamento Básico de Django
Leandro Zanuz
 
Searching for Candidates On Google: A Primer
Searching for Candidates On Google: A Primer
Amitai Givertz
 
Django Girls Tutorial
Django Girls Tutorial
Kishimi Ibrahim Ishaq
 
Django_fukuoka
Django_fukuoka
ShuyaMotouchi1
 
Django class based views for beginners
Django class based views for beginners
Spin Lai
 
Django ORM
Django ORM
Junsu Kim
 
Tutorial for using SQL in Microsoft Access
Tutorial for using SQL in Microsoft Access
mcclellm
 
Django Introduction & Tutorial
Django Introduction & Tutorial
之宇 趙
 
Django 實戰 - 自己的購物網站自己做
Django 實戰 - 自己的購物網站自己做
flywindy
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
Igor Sobreira
 
Plano Aula Linux
Plano Aula Linux
Marcelo
 
Plano de aula de informática pronto
Plano de aula de informática pronto
Mariá Pohlmann da Silveira
 
Plano de curso informatica
Plano de curso informatica
F Guanambi
 
Plano de Aula 2.6 de Informática
Plano de Aula 2.6 de Informática
Nancy De A. S. Fusiger
 
Curso de Python e Django
Curso de Python e Django
Osvaldo Santana Neto
 
Introdução ao Django
Introdução ao Django
Marcel Caraciolo
 
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Beat Signer
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
Rodrigo Nossal
 
Tutorial Django + Python
Tutorial Django + Python
Mateus Padua
 
Treinamento Básico de Django
Treinamento Básico de Django
Leandro Zanuz
 
Searching for Candidates On Google: A Primer
Searching for Candidates On Google: A Primer
Amitai Givertz
 
Django class based views for beginners
Django class based views for beginners
Spin Lai
 
Tutorial for using SQL in Microsoft Access
Tutorial for using SQL in Microsoft Access
mcclellm
 
Django Introduction & Tutorial
Django Introduction & Tutorial
之宇 趙
 
Django 實戰 - 自己的購物網站自己做
Django 實戰 - 自己的購物網站自己做
flywindy
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
Igor Sobreira
 
Plano Aula Linux
Plano Aula Linux
Marcelo
 
Plano de curso informatica
Plano de curso informatica
F Guanambi
 
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Beat Signer
 
Anúncio

Semelhante a Minicurso de Django - Desenvolvimento ágil web com Django e Python (20)

Palestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas Aplicações
Marcos Thomaz
 
Trabalho sobre a linguagem Python
Trabalho sobre a linguagem Python
Ricardo Zalla
 
Programando para web com python - Introdução a Python
Programando para web com python - Introdução a Python
Alvaro Oliveira
 
Introdução ao framework Django
Introdução ao framework Django
Eduardo Palma
 
Curso python
Curso python
Tiago
 
Desenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2py
Gilson Filho
 
Python2.5.ppt
Python2.5.ppt
wildcat9335
 
Python Emsl2009
Python Emsl2009
Julio Cesar Eiras Melanda
 
Introdução à Linguagem de programação Python
Introdução à Linguagem de programação Python
dmmartins
 
Curso de Python (Básico) - Português
Curso de Python (Básico) - Português
Helio Colombe
 
Linguagem de Programação Python
Linguagem de Programação Python
Junior Sobrenome
 
Cherrypy - um framework para desenvolvimento rápido de aplicações web
Cherrypy - um framework para desenvolvimento rápido de aplicações web
Alvaro Oliveira
 
Entendendo Framework Web com Python
Entendendo Framework Web com Python
PythOnRio
 
Entendendo Frameworks web com Python
Entendendo Frameworks web com Python
Luiz Aldabalde
 
Extreme Experience 2018 | Python para quem sabe Delphi
Extreme Experience 2018 | Python para quem sabe Delphi
Mario Guedes
 
Python
Python
Tiago
 
Postgresql + Python = Power!
Postgresql + Python = Power!
Juliano Atanazio
 
Livro para desenvolvedores de Python
Livro para desenvolvedores de Python
Alberto Jorge Sardo Monteiro
 
Desbravando a web com python - Matheus Lima
Desbravando a web com python - Matheus Lima
Matheus Dos Santos Lima
 
Aula 01 python
Aula 01 python
Tiago
 
Palestra Apresentando Python e Suas Aplicações
Palestra Apresentando Python e Suas Aplicações
Marcos Thomaz
 
Trabalho sobre a linguagem Python
Trabalho sobre a linguagem Python
Ricardo Zalla
 
Programando para web com python - Introdução a Python
Programando para web com python - Introdução a Python
Alvaro Oliveira
 
Introdução ao framework Django
Introdução ao framework Django
Eduardo Palma
 
Curso python
Curso python
Tiago
 
Desenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2py
Gilson Filho
 
Introdução à Linguagem de programação Python
Introdução à Linguagem de programação Python
dmmartins
 
Curso de Python (Básico) - Português
Curso de Python (Básico) - Português
Helio Colombe
 
Linguagem de Programação Python
Linguagem de Programação Python
Junior Sobrenome
 
Cherrypy - um framework para desenvolvimento rápido de aplicações web
Cherrypy - um framework para desenvolvimento rápido de aplicações web
Alvaro Oliveira
 
Entendendo Framework Web com Python
Entendendo Framework Web com Python
PythOnRio
 
Entendendo Frameworks web com Python
Entendendo Frameworks web com Python
Luiz Aldabalde
 
Extreme Experience 2018 | Python para quem sabe Delphi
Extreme Experience 2018 | Python para quem sabe Delphi
Mario Guedes
 
Python
Python
Tiago
 
Postgresql + Python = Power!
Postgresql + Python = Power!
Juliano Atanazio
 
Desbravando a web com python - Matheus Lima
Desbravando a web com python - Matheus Lima
Matheus Dos Santos Lima
 
Aula 01 python
Aula 01 python
Tiago
 
Anúncio

Minicurso de Django - Desenvolvimento ágil web com Django e Python

  • 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
  • 20. 20 Resultado exercício funcionario = Funcionario() funcionario.nome = 'João Silva' funcionario.ano_nascimento = 1985 funcionario.endereco = 'Santa Maria' funcionario.salario = 3000 print(funcionario.obter_idade()) #coding:utf-8 class Pessoa(object): nome = “” endereco = “” ano_nascimento = 0 def obter_idade(self): return 2016 - self.ano_nascimento class Funcionario(Pessoa): cargo = '''' salario = 0 Classe Objeto
  • 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
  • 28. 28 Estrutura da aplicação __init__.py admin.py models.py tests.py migrations posts urls.py (precisa criar) views.py
  • 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()
  • 32. boolean = models.BooleanField() string = models.CharField() data = models.DateTimeField() email = models.EmailField() arquivo = models.FileField() numero_real = models.FloatField() numero_inteiro = models.IntegerField() 32 Atributos das classes no Django imagem = models.ImageField() endereco_de_ip = models.IPAddressField() Inteiro_positivo = models.PositiveIntegerField() texto = models.TextField() url = models.URLField() outra_classe = models.ForeignKey() muitos_para_muitos = models.ManyToManyField() Atributos importados do modulo: from django.db import models https://docs.djangoproject.com/en/1.10/ref/models/fields/
  • 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.
  • 44. 44 Arquitetura do Django HTMLPY PY views.py template.htmlmodels.py PY urls.py NAVEGADOR
  • 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
  • 54. 54 Herdando templates <!DOCTYPE html> <html> {% block “titulo” %} {% endblock %} <body> {% block “conteudo” %} --Aqui vai o HTML customizado {% endblock %} </body> </html> {% extends “base.html” %} {% block “titulo” %} <h1>Título da página</h1> {% endblock %} {% block “conteudo” %} <p>Corpo da página<p/> {% endblock %} filho.htmlbase.html
  • 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
  • 59. 59 Autenticação do usuário - urls from django.contrib.auth import views urlpatterns = [ # Login autentificacao url(r'^$', views.login, {'template_name': 'login.html'}, name='login'), url(r'^logout/$', views.logout, {'next_page': '/'}, name='logout'), ]
  • 60. 60 Forms do Django - HTML e tags <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <form action="{% url 'login' %}" method="post"> {% csrf_token %} <label for="your_name">Usuário: </label> <input id="your_name" type="text" name="username" > <label for="your_name">Senha: </label> <input id="your_name" type="password" name="password" > <input type="submit" value="Logar"> </form> </body> </html>
  • 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'), ]