Transcript
Page 1: Minicurso de Django - Desenvolvimento ágil web com Django e Python

DESENVOLVIMENTO WEB COM

Vinicius [email protected]

Guilherme [email protected]

Page 2: Minicurso de Django - Desenvolvimento ágil web com Django e Python

Introdução ao Python

1. Sintaxe2. Variáveis3. Loops4. Funções5. Orientação a objetos

2 Tópicos abordadosDjango e Projeto de Microblog

1. Criação de projetos2. Criação de aplicações3. Criação de classes4. Relacionamento entre classes5. Criação de urls6. Criação de views7. Criação de templates

Page 3: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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.

Page 4: Minicurso de Django - Desenvolvimento ágil web com Django e Python

4 Simplicidade do Python

public class OlaMundo { public static void main(String[] args) { System.out.println("Olá mundo"); }}

print ('Olá Mundo!')

Java Python

Page 5: Minicurso de Django - Desenvolvimento ágil web com Django e 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>;

}

Page 6: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 7: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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.

Page 8: Minicurso de Django - Desenvolvimento ágil web com Django e Python

8 OperadoresAritimé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

Page 9: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 10: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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çãolista_vazia = list()

numeros = [2, 1, 3, 5, 4];

palavras = ["abc", "b", "cachorro"]

lista_mista = ['gato', 'bola', 1997, 2000];

# Acessoprint (palavras[2]) # cachorro

2 1 3 5 4[1] [2] [3] [4] [5]

Page 11: Minicurso de Django - Desenvolvimento ágil web com Django e Python

● 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

Page 12: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 13: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 14: Minicurso de Django - Desenvolvimento ágil web com Django e 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

Page 15: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 16: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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()

Page 17: Minicurso de Django - Desenvolvimento ágil web com Django e Python

17 Herança

class Cao(object):def latir(self):

print ("Au!")

class Poodle(Cao):corDoPelo = ""

class Viralata(Cao):pedigree = False

CÃOClasse genérica que serve como base

Page 18: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 19: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 20: Minicurso de Django - Desenvolvimento ágil web com Django e Python

20 Resultado exercício

funcionario = Funcionario()funcionario.nome = 'João Silva'funcionario.ano_nascimento = 1985funcionario.endereco = 'Santa Maria'funcionario.salario = 3000

print(funcionario.obter_idade())

#coding:utf-8class Pessoa(object):

nome = “” endereco = “” ano_nascimento = 0

def obter_idade(self): return 2016 - self.ano_nascimento

class Funcionario(Pessoa): cargo = '''' salario = 0

Classe Objeto

Page 21: Minicurso de Django - Desenvolvimento ágil web com Django e Python

NO WINDOWS

1. Vá até o site oficial do Python: www.python.org2. 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

Page 22: Minicurso de Django - Desenvolvimento ágil web com Django e Python

Microblog onde os usuários podem publicar pequenos textos, seguir pessoas e curtir textos de outras pessoas.

22 Projeto MicroblogDiagrama de Classes Casos de Uso

Projeto: https://github.com/guilegarcia/Microblog

Page 23: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 24: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 25: Minicurso de Django - Desenvolvimento ágil web com Django e Python

Vamos criar o nosso projeto chamado Microblog, digitando no console:

25 Criando o projeto

django-admin startproject Microblog

Page 26: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 27: Minicurso de Django - Desenvolvimento ágil web com Django e Python

Vamos criar a aplicação “posts” do nosso projeto Microblog.

27 Criando a aplicação “posts”

python manage.py startapp posts

Page 28: Minicurso de Django - Desenvolvimento ágil web com Django e Python

28 Estrutura da aplicação

__init__.py

admin.py

models.py

tests.py

migrations

posts

urls.py (precisa criar)

views.py

Page 29: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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',)

Page 30: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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.pyclass 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

Page 31: Minicurso de Django - Desenvolvimento ágil web com Django e Python

● 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()

Page 32: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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/

Page 33: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 34: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 35: Minicurso de Django - Desenvolvimento ágil web com Django e Python

35 Relacionamento - Many-to-one(ForeignKey)

class Banda(models.Model): pass

class Musico(models.Model):banda = models.ForeignKey(Banda)

Page 36: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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)

Page 37: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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)

Page 38: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 39: Minicurso de Django - Desenvolvimento ágil web com Django e Python

● 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

Page 40: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 41: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 42: Minicurso de Django - Desenvolvimento ágil web com Django e Python

42 Adicionar Autor no Settings.py

# Usuário padrãoAUTH_USER_MODEL = 'autores.Autor'

Adicionar o Autor como usuário padrão do Django em:

/Microblog/Microblog/settings.py

Page 43: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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.

Page 44: Minicurso de Django - Desenvolvimento ágil web com Django e Python

44 Arquitetura do Django

HTMLPY

PY

views.py

template.htmlmodels.py

PY

urls.py

NAVEGADOR

Page 45: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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'),]

Page 46: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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 urlfrom 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’ %}

Page 47: Minicurso de Django - Desenvolvimento ágil web com Django e Python

● 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>

Page 48: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 49: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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>

Page 50: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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>

Page 51: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 52: Minicurso de Django - Desenvolvimento ágil web com Django e Python

Servem para transformar os valores de variáveis e tags dentro do html.

Usa-se uma barra: | filtro

{{ variavel | filtro }}

52 Templates Django - Filtros

Page 53: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 54: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 55: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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/master/static

Page 56: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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/master/templates

Page 57: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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

Page 58: Minicurso de Django - Desenvolvimento ágil web com Django e Python

● 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

Page 59: Minicurso de Django - Desenvolvimento ágil web com Django e Python

59 Autenticação do usuário - urls

from django.contrib.auth import views

urlpatterns = [

# Login autentificacaourl(r'^$', views.login, {'template_name': 'login.html'}, name='login'),url(r'^logout/$', views.logout, {'next_page': '/'}, name='logout'),

]

Page 60: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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>

Page 61: Minicurso de Django - Desenvolvimento ágil web com Django e Python

61 Settings.py

# Autentificacao do usuarioLOGIN_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

Page 62: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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_requiredfrom django.shortcuts import render

@login_requireddef autor(request):

autor = request.userreturn render(request, 'autor.html', {'autor':

autor})

Page 63: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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_requiredfrom django.shortcuts import render

@login_requireddef autores(request):

autores = Autor.objects.all()return render(request, 'autores.html',

{'autores': autores})

Page 64: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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/**

]

Page 65: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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')

Page 66: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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 dadosb. 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

Page 67: Minicurso de Django - Desenvolvimento ágil web com Django e Python

67 Listar autores

from django.conf.urls import urlfrom autores import views

urlpatterns = [ url(r'^$', views.autores, name='autores'),]

from autores.models import Autorfrom django.shortcuts import render

def autores(request): autores = Autor.objects.all() return render(request, 'autores.html',

{'autores': autores})

Page 68: Minicurso de Django - Desenvolvimento ágil web com Django e Python

68 Timeline (listar posts)

from django.conf.urls import urlfrom posts.views import index

urlpatterns = [ url(r'^index/$', index, name='index'),

]

from django.shortcuts import redirectfrom .models import Postfrom django.db.models import Qfrom django.contrib.auth.decorators import login_required

@login_requireddef index(request):

autor = request.userif 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 seguindoelse: posts = Nonereturn render(request, 'index.html', {'posts': posts})

Page 69: Minicurso de Django - Desenvolvimento ágil web com Django e Python

69 Acessar autor

from django.conf.urls import urlfrom autores import views

urlpatterns = [ url(r'^(?P<id>\d+)/$', views.autor, name='autor'),]

from django.shortcuts import render, get_object_or_404from 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})

Page 70: Minicurso de Django - Desenvolvimento ágil web com Django e Python

70 Excluir autor

from django.conf.urls import urlfrom autores import views

urlpatterns = [ url(r'^excluir/(?P<id>\d+)/$', views.excluir_autor, name='excluir_autor'),]

from django.shortcuts import render, get_object_or_404from 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')

Page 71: Minicurso de Django - Desenvolvimento ágil web com Django e Python

71 Seguir autor

from django.conf.urls import urlfrom autores import views

urlpatterns = [ url(r'^seguir/(?P<id>\d+)/$', views.seguir, name='seguir_autor'),]

from django.shortcuts import redirectfrom 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')

Page 72: Minicurso de Django - Desenvolvimento ágil web com Django e Python

72 Unfollow autor

from django.conf.urls import urlfrom autores import views

urlpatterns = [ url(r'^unfollow/(?P<id>\d+)/$', views.unfollow, name='unfollow'),]

from django.shortcuts import redirectfrom 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')

Page 73: Minicurso de Django - Desenvolvimento ágil web com Django e Python

73 Curtir post

from django.conf.urls import urlfrom autores import views

urlpatterns = [ url(r'^curtir/(?P<id>\d+)/$', views.curtir, name='curtir_post'),]

from django.shortcuts import render, get_object_or_404from .models import Post

@login_requireddef curtir(request, id=None):

post = get_object_or_404(Post, id=id)post.likes += 1post.save()

# request.META.get('HTTP_REFERER') mostra de onde veio a requisição (index ou autor)return redirect(request.META.get('HTTP_REFERER'))

Page 74: Minicurso de Django - Desenvolvimento ágil web com Django e Python

É 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

Page 75: Minicurso de Django - Desenvolvimento ágil web com Django e Python

75 Resultado - CreateView Autor

from django.conf.urls import urlfrom autores.views import AutorCreate

urlpatterns = [ url(r'^criar-autor/$', CriarAutor.as_view(), name='criar_autor'),]

Page 76: Minicurso de Django - Desenvolvimento ágil web com Django e Python

76 Resultado - CreateView Autor

from django.views.generic.edit import CreateViewfrom 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)

Page 77: Minicurso de Django - Desenvolvimento ágil web com Django e Python

Crie:

1. URL para o CriarPost (CreateView) em /posts/urls.py2. 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

Page 78: Minicurso de Django - Desenvolvimento ágil web com Django e Python

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 = '.'

Page 79: Minicurso de Django - Desenvolvimento ágil web com Django e Python

79 Resultado - CreateView Post

from django.conf.urls import urlfrom .views import CriarPost

urlpatterns = [ url(r'^criar/$', CriarPost.as_view(), name='criar_autor'),]