SlideShare uma empresa Scribd logo
1 de 79
Baixar para ler offline
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'),
]

Mais conteúdo relacionado

Mais procurados

Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasRodrigo Branas
 
On to code review lessons learned at microsoft
On to code review lessons learned at microsoftOn to code review lessons learned at microsoft
On to code review lessons learned at microsoftMichaela Greiler
 
개발자와 기업을 잇는 Developer Relations(full.ver).pdf
개발자와 기업을 잇는 Developer Relations(full.ver).pdf개발자와 기업을 잇는 Developer Relations(full.ver).pdf
개발자와 기업을 잇는 Developer Relations(full.ver).pdf은옥 조
 
Java 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas InterfacesJava 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas InterfacesRegis Magalhães
 
Git e Github para Iniciantes
Git e Github para IniciantesGit e Github para Iniciantes
Git e Github para IniciantesLoiane Groner
 
Open Source Ajax Solution @OSDC.tw 2009
Open Source Ajax  Solution @OSDC.tw 2009Open Source Ajax  Solution @OSDC.tw 2009
Open Source Ajax Solution @OSDC.tw 2009Robbie Cheng
 
Microservices Architecture for e-Commerce
Microservices Architecture for e-CommerceMicroservices Architecture for e-Commerce
Microservices Architecture for e-CommerceDivante
 
Todas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágilTodas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágilElias Nogueira
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com AngularElmano Cavalcanti
 
A quick introduction to Strapi CMS
A quick introduction to Strapi CMSA quick introduction to Strapi CMS
A quick introduction to Strapi CMSAshokkumar T A
 

Mais procurados (20)

Git e GitHub
Git e GitHubGit e GitHub
Git e GitHub
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
 
Apresentação angular js
Apresentação angular jsApresentação angular js
Apresentação angular js
 
On to code review lessons learned at microsoft
On to code review lessons learned at microsoftOn to code review lessons learned at microsoft
On to code review lessons learned at microsoft
 
개발자와 기업을 잇는 Developer Relations(full.ver).pdf
개발자와 기업을 잇는 Developer Relations(full.ver).pdf개발자와 기업을 잇는 Developer Relations(full.ver).pdf
개발자와 기업을 잇는 Developer Relations(full.ver).pdf
 
Flask – Python
Flask – PythonFlask – Python
Flask – Python
 
Java 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas InterfacesJava 10 Classes Abstratas Interfaces
Java 10 Classes Abstratas Interfaces
 
BitBucket presentation
BitBucket presentationBitBucket presentation
BitBucket presentation
 
Git e Github para Iniciantes
Git e Github para IniciantesGit e Github para Iniciantes
Git e Github para Iniciantes
 
What's new in Visual Studio 2022
What's new in Visual Studio 2022What's new in Visual Studio 2022
What's new in Visual Studio 2022
 
JAVA - Orientação a Objetos
JAVA - Orientação a ObjetosJAVA - Orientação a Objetos
JAVA - Orientação a Objetos
 
Open Source Ajax Solution @OSDC.tw 2009
Open Source Ajax  Solution @OSDC.tw 2009Open Source Ajax  Solution @OSDC.tw 2009
Open Source Ajax Solution @OSDC.tw 2009
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
 
Selenium
SeleniumSelenium
Selenium
 
Microservices Architecture for e-Commerce
Microservices Architecture for e-CommerceMicroservices Architecture for e-Commerce
Microservices Architecture for e-Commerce
 
Todas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágilTodas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágil
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
Backend roadmap
Backend roadmapBackend roadmap
Backend roadmap
 
A quick introduction to Strapi CMS
A quick introduction to Strapi CMSA quick introduction to Strapi CMS
A quick introduction to Strapi CMS
 
POO - Aula 1
POO - Aula 1POO - Aula 1
POO - Aula 1
 

Destaque

Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosRodrigo Nossal
 
Tutorial Django + Python
Tutorial Django + PythonTutorial Django + Python
Tutorial Django + PythonMateus Padua
 
Treinamento Básico de Django
Treinamento Básico de DjangoTreinamento Básico de Django
Treinamento Básico de DjangoLeandro Zanuz
 
Searching for Candidates On Google: A Primer
Searching for Candidates On Google: A Primer 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 beginnersDjango class based views for beginners
Django class based views for beginnersSpin Lai
 
Tutorial for using SQL in Microsoft Access
Tutorial for using SQL in Microsoft AccessTutorial for using SQL in Microsoft Access
Tutorial for using SQL in Microsoft Accessmcclellm
 
Django Introduction & Tutorial
Django Introduction & TutorialDjango Introduction & Tutorial
Django Introduction & Tutorial之宇 趙
 
Django 實戰 - 自己的購物網站自己做
Django 實戰 - 自己的購物網站自己做Django 實戰 - 自己的購物網站自己做
Django 實戰 - 自己的購物網站自己做flywindy
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonIgor Sobreira
 
Plano Aula Linux
Plano Aula LinuxPlano Aula Linux
Plano Aula LinuxMarcelo
 
Plano de curso informatica
Plano de curso informaticaPlano de curso informatica
Plano de curso informaticaF Guanambi
 
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...Beat Signer
 

Destaque (19)

Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
 
Tutorial Django + Python
Tutorial Django + PythonTutorial Django + Python
Tutorial Django + Python
 
Treinamento Básico de Django
Treinamento Básico de DjangoTreinamento Básico de Django
Treinamento Básico de Django
 
Searching for Candidates On Google: A Primer
Searching for Candidates On Google: A Primer Searching for Candidates On Google: A Primer
Searching for Candidates On Google: A Primer
 
Django Girls Tutorial
Django Girls TutorialDjango Girls Tutorial
Django Girls Tutorial
 
Django_fukuoka
Django_fukuokaDjango_fukuoka
Django_fukuoka
 
Django class based views for beginners
Django class based views for beginnersDjango class based views for beginners
Django class based views for beginners
 
Django ORM
Django ORMDjango ORM
Django ORM
 
Tutorial for using SQL in Microsoft Access
Tutorial for using SQL in Microsoft AccessTutorial for using SQL in Microsoft Access
Tutorial for using SQL in Microsoft Access
 
Django Introduction & Tutorial
Django Introduction & TutorialDjango Introduction & Tutorial
Django Introduction & Tutorial
 
Django 實戰 - 自己的購物網站自己做
Django 實戰 - 自己的購物網站自己做Django 實戰 - 自己的購物網站自己做
Django 實戰 - 自己的購物網站自己做
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
 
Plano Aula Linux
Plano Aula LinuxPlano Aula Linux
Plano Aula Linux
 
Plano de aula de informática pronto
Plano de aula de informática prontoPlano de aula de informática pronto
Plano de aula de informática pronto
 
Plano de curso informatica
Plano de curso informaticaPlano de curso informatica
Plano de curso informatica
 
Plano de Aula 2.6 de Informática
Plano de Aula 2.6 de InformáticaPlano de Aula 2.6 de Informática
Plano de Aula 2.6 de Informática
 
Curso de Python e Django
Curso de Python e DjangoCurso de Python e Django
Curso de Python e Django
 
Introdução ao Django
Introdução ao DjangoIntrodução ao Django
Introdução ao Django
 
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
 

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

Programação Web com PHP 7.x
Programação Web com PHP 7.xProgramação Web com PHP 7.x
Programação Web com PHP 7.xNorton Guimarães
 
Introducao ao python - Luciana Mota
Introducao ao python - Luciana MotaIntroducao ao python - Luciana Mota
Introducao ao python - Luciana Motalucianacmota
 
Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Thyago Maia
 
Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Thyago Maia
 
Curso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP BásicoCurso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP BásicoNorton Guimarães
 
Implementação de Aplicações Móveis e Jogos com Python - Aula 2
Implementação de Aplicações Móveis e Jogos com Python - Aula 2Implementação de Aplicações Móveis e Jogos com Python - Aula 2
Implementação de Aplicações Móveis e Jogos com Python - Aula 2Flávio Ribeiro
 
Programando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonProgramando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonAlvaro Oliveira
 
Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Rafael Sales Pavarina
 
PyMongo = Python + MongoDB
PyMongo = Python + MongoDBPyMongo = Python + MongoDB
PyMongo = Python + MongoDBBrunno Gomes
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de djangorosenclever
 
Minicurso-Python-01.pptx
Minicurso-Python-01.pptxMinicurso-Python-01.pptx
Minicurso-Python-01.pptxPapirusDig
 
Por que você deveria aprender python?
Por que você deveria aprender python?Por que você deveria aprender python?
Por que você deveria aprender python?Felipe Volpone
 
Java - Visão geral e Exercícios
Java - Visão geral e ExercíciosJava - Visão geral e Exercícios
Java - Visão geral e ExercíciosArthur Emanuel
 
Desenvolvendo com mongodb
Desenvolvendo com mongodbDesenvolvendo com mongodb
Desenvolvendo com mongodbThiago Avelino
 

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

Programação Web com PHP 7.x
Programação Web com PHP 7.xProgramação Web com PHP 7.x
Programação Web com PHP 7.x
 
Introducao ao python - Luciana Mota
Introducao ao python - Luciana MotaIntroducao ao python - Luciana Mota
Introducao ao python - Luciana Mota
 
Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
 
Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3
 
Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1
 
Curso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP BásicoCurso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP Básico
 
Implementação de Aplicações Móveis e Jogos com Python - Aula 2
Implementação de Aplicações Móveis e Jogos com Python - Aula 2Implementação de Aplicações Móveis e Jogos com Python - Aula 2
Implementação de Aplicações Móveis e Jogos com Python - Aula 2
 
Programando para web com python - Introdução a Python
Programando para web com python - Introdução a PythonProgramando para web com python - Introdução a Python
Programando para web com python - Introdução a Python
 
Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018
 
PyMongo = Python + MongoDB
PyMongo = Python + MongoDBPyMongo = Python + MongoDB
PyMongo = Python + MongoDB
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Python2.5.ppt
Python2.5.pptPython2.5.ppt
Python2.5.ppt
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de django
 
Minicurso-Python-01.pptx
Minicurso-Python-01.pptxMinicurso-Python-01.pptx
Minicurso-Python-01.pptx
 
Python e MongoDB - Ensol
Python e MongoDB - EnsolPython e MongoDB - Ensol
Python e MongoDB - Ensol
 
Por que você deveria aprender python?
Por que você deveria aprender python?Por que você deveria aprender python?
Por que você deveria aprender python?
 
Java - Visão geral e Exercícios
Java - Visão geral e ExercíciosJava - Visão geral e Exercícios
Java - Visão geral e Exercícios
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Desenvolvendo com mongodb
Desenvolvendo com mongodbDesenvolvendo com mongodb
Desenvolvendo com mongodb
 
Python 06
Python 06Python 06
Python 06
 

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

  • 1. DESENVOLVIMENTO WEB COM Vinicius Coelho vncs.coelho@gmail.com Guilherme Garcia guilesgarcia@gmail.com
  • 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'), ]