Professional Documents
Culture Documents
Girls Tutorial
Tabela de contedos
Introduo
Instalao do Python
Editor de Cdigo
Introduo ao Python
O que Django?
Instalao do Django
Criando um projeto
Modelos do Django
Administrao
10
Implantao!
11
Urls
12
13
Introduo a HTML
14
15
16
Templates
17
18
Estendendo os templates
19
20
Formulrios
21
Domnio
22
23
Translation
This tutorial has been translated from English to Portuguese by a group of awesome
volunteers. Special thanks for help goes out to Willie Lawrence, Vivian Macedo, Cleiton
Lima, danieltex, Leandro Silva Araujo, Adailton do Nascimento, Pablo Palacios, Paulo Alem,
Eric Hideki, Joao Luiz Lorencetti, clemente.jnr, Leonardo Alves dos Santos, joepreludian,
Gabriela Cavalcante da Silve, Rafael Biagioni de Fazio, Fabio C. Barrionuevo da Luz,
ffabiorj, Lucas Magnum, 1pedro, Adjamilton Junior, Leandro Barbosa, Kleber C Pinheiro,
Katyanna Moura, Annanda Sousa, Flavio Barros, Marcel Ribeiro Dantas, Adam Victor
Nazareth Brandizzi, Bernardo Fontes, Antonio Luis, Raony Guimares Correo do Carmo
Lisboa Cardenas, Camilla Achutti and Carla Suarez. Wow! <3 <3
Introduo
Voc j sentiu como se o mundo fosse cada vez mais sobre tecnologia e que de alguma
forma voc tenha ficado pra trs? Voc j imaginou como seria criar um website mas nunca
teve motivao suficiente para comear? Voc j pensou que o mundo do software
complicado demais at para tentar fazer alguma coisa sozinho?
Bem, ns temos boas notcias para voc! Programao no to difcil quanto parece e
ns queremos te mostrar o quo divertido pode ser.
Este tutorial no ir te transformar magicamente em um programador. Se voc quer ser
bom nisso precisa de meses ou at mesmo anos de treino e prtica. Mas ns queremos te
mostrar que a programao ou criao de websites no to complicada quanto parece.
Ns tentaremos explicar os diferentes pedaos to bem quanto pudermos, tal que voc no
se sinta intimidado pela tecnologia.
Ns esperamos conseguir fazer voc amar a tecnologia tanto quanto ns amamos!
Quando voc tiver terminado o tutorial voc ter uma aplicao web simples e funcional:
seu prprio blog. Ns vamos mostrar como coloc-lo online, para que outros vejam seu
trabalho!
Ele se parecer (mais ou menos) com isso:
Se voc seguir o tutorial por conta prpria e no tiver um treinador para ajudar em caso
de qualquer problema, ns temos um chat para voc:
1. Ns
Introduo
Introduo
Fascinante, no? Mas, obviamente, no possvel ter um fio conectado a toda mquina
ligada na internet. Logo, para chegar em uma mquina (por exemplo aquela onde
http://djangogirls.org est salva) ns precisamos passar uma requisio por muitas
mquinas diferentes.
Se parece com isso:
Imagine que quando voc digita http://djangogirls.org voc envia uma carta que diz:
"Querido Django Girls, eu desejo ver o site djangogirls.org. Envie ele pra mim, por favor!"
Sua carta vai para a agncia dos correios mais prxima de voc. Depois vai para outra que
um pouco mais perto do seu destinatrio, depois para outra e outra at que seja entregue
ao seu destino. O nico diferencial que se voc enviar cartas (pacotes de dados) com
freqncia para o mesmo lugar, cada carta pode passar por diferentes agncias de correios
(roteadores), dependendo de como elas so distribudas em cada agncia.
Sim, simples assim. Voc envia mensagens e espera alguma resposta. Claro, ao invs de
papel e caneta voc usa bytes de dados, mas a ideia a mesma!
Ao invs de endereos com o nome da rua, cidade, cdigo postal e nome do pas, ns
usamos endereos IP. Primeiro seu computador pergunta pelo DNS (Domain Name System
- Sistema de Nome de Domnio) para traduzir djangogirls.org para um endereo IP. O
funcionamento dele se parece um pouco com as antigas listas telefnicas onde voc pode
olhar para o nome da pessoa que quer entrar em contato e achar o seu nmero de telefone
e endereo.
Quando voc envia uma carta, ela precisa ter certas caractersticas para ser entregue
corretamente: um endereo, selo, etc. Voc tambm usa uma linguagem que o receptador
compreende, certo? O mesmo acontece com pacotes de dados que voc envia para ver um
site: voc usa um protocolo chamado HTTP (Hypertext Transfer Protocol - Protocolo de
Transferncia de Hipertexto).
Ento, basicamente, quando voc tem um site voc precisa ter um servidor (mquina) onde
ele fica hospedado. O servidor est espera de quaisquer requisies recebidas (cartas
que solicitam ao servidor o envio do seu site) e ele envia de volta seu site (em outra carta).
Como este um tutorial de Django voc vai perguntar o que o Django faz. Quando envia
uma resposta nem sempre voc quer enviar a mesma coisa para todo mundo. muito
melhor se suas cartas so personalizadas, especialmente para a pessoa que acabou de
escrever para voc, certo? O Django ajuda voc a criar essas personalizadas e
interessantes cartas :).
Chega de falar, hora de criar!
10
Windows
V em Iniciar Todos os Programas Acessrios Prompt de comando.
Mac OS X
Applications Utilities Terminal.
Linux
Provavelmente voc vai achar em Applications Accessories Terminal, mas isso
depende do seu sistema operacional. Qualquer coisa s procurar no Google :)
Prompt
Introduo linha de comando
11
Agora voc deve ver uma janela branca ou preta que est espera de seus comandos.
Se voc estiver em Mac ou num Linux, voc provavelmente ver um `` $, como este:
$
Cada comando ser antecedido por este sinal e um espao, mas voc no precisa digit-lo.
Seu computador far isso por voc :)
Apenas uma pequena nota: no seu caso, talvez h algo como C:\Users\ola> ou OlasMacBook Air: ~ ola$ antes do sinal do prompt isto estar 100% correto. Neste tutorial
ou
> whoami
Como voc pode ver, o computador s apresentou seu nome de usurio. Elegante, n?:)
Tente digitar cada comando, no copiar e colar. Voc vai se lembrar mais dessa forma!
O Bsico
12
Cada sistema operacional tem o seu prprio conjunto de instrues para a linha de
comando, ento se certifique que voc est seguindo as instrues do seu sistema
operacional. Vamos tentar, certo?
Pasta atual
Seria legal saber em que pasta estamos agora, certo? Vamos ver. Digite o seguinte
comando seguido de um enter:
$ pwd
/Users/olasitarska
Provavelmente voc vai ver algo parecido na sua mquina. Um vez que voc abre a linha
de comando voc j comea na pasta Home.
Nota: 'pwd' significa 'print working directory'.
Windows:
> dir
Directory of C:\Users\olasitarska
05/08/2014 07:28 PM <DIR> Applications
05/08/2014 07:28 PM <DIR> Desktop
05/08/2014 07:28 PM <DIR> Downloads
05/08/2014 07:28 PM <DIR> Music
...
13
Windows:
> cd Desktop
Windows:
> cd
C:\Users\olasitarska\Desktop
Aqui est!
Dica de profissional: se voc digitar cd D e apertar a tecla tab no seu teclado, a
linha de comando ir preencher automaticamente o resto do nome para que voc
possa navegar rapidamente. Se houver mais de uma pasta que comece com "D",
aperte a tecla tab duas vezes para obter uma lista de opes.
Windows:
> mkdir djangogirls
14
Este comando vai criar uma pasta com o nome djangogirls no nosso desktop. Voc pode
verificar se ele est l, s de olhar na sua rea de trabalho ou executando um comando
ls / dir ! Experimente :)
Dica de profissional: Se voc no quiser digitar o mesmo comando vrias vezes, tente
pressionar seta para cima e seta para baixo no teclado para percorrer comandos
usados recentemente.
Exercite-se!
Um pequeno desafio para voc: na sua mais nova pasta criada djangogirls crie uma outra
pasta chamada teste . Use os comandos cd e mkdir .
Soluo:
$ cd djangogirls
$ mkdir teste
$ ls
teste
Windows:
> cd djangogirls
> mkdir teste
> dir
05/08/2014 07:28 PM <DIR> teste
Parabns! :)
Limpando
No queremos deixar uma baguna, ento vamos remover tudo o que fizemos at agora.
Primeiro precisamos voltar para a pasta Desktop:
$ cd ..
Windows:
15
> cd ..
Fazendo cd para .. ns mudaremos do diretrio atual para o diretrio pai (que significa
o diretrio que contm o diretrio atual).
Veja onde voc est:
$ pwd
/Users/olasitarska/Desktop
Windows:
> cd
C:\Users\olasitarska\Desktop
Windows:
> rmdir /S djangogirls
djangogirls, Tem certeza <S/N>? S
Pronto! Para ter certeza que a pasta foi excluda, vamos checar:
$ ls
Windows:
> dir
Saindo
Por enquanto isso! Agora voc fechar a linha de comando com segurana. Vamos fazer
do jeito hacker, certo?:)
16
$ exit
Windows:
> exit
Legal, n?:)
Sumrio
Aqui vai uma lista de alguns comandos teis:
Comando
(Windows)
Comando (Mac
OS / Linux)
Descrio
Exemplo
exit
exit
Fecha a janela
exit
cd
cd
Muda a pasta
cd test
dir
ls
Lista as pastas e
os arquivos
dir
copy
cp
Copia um arquivo
copy c:\test\test.txt
c:\windows\test.txt
move
mv
Move um arquivo
move c:\test\test.txt
c:\windows\test.txt
mkdir
mkdir
mkdir testdirectory
del
rm
del c:\test\test.txt
Estes so apenas alguns dos poucos comandos que voc pode executar em sua linha de
comando, mas voc no vai usar mais nada do que isto hoje.
Se voc estiver curioso, ss64.com contm uma referncia completa de comandos para
todos os sistemas operacionais.
Pronto?
Vamos mergulhar no Python!
17
Instalao do Python
Este subcaptulo baseado em um tutorial criado por Geek Girls Carrots
(http://django.carrots.pl/)
Django escrito em Python. N precisamos dele para fazer qualquer coisa em Django.
Vamos comear com sua instalao! Ns queremos que voc instale o Python 3.4, ento se
voc tem qualquer verso anterior, voc vai precisar atualiz-la.
Windows
Voc pode baixar o Python para Windows no website
https://www.python.org/downloads/release/python-343/. Depois de fazer o download do
arquivo *.msi, voc precisa execut-lo (dando um duplo-clique nele) e seguir as instrues.
importante lembrar o caminho (a pasta) onde voc instalou o Python. Ela ser til depois!
Cuidado com uma coisa: na segunda tela do assistente de instalao, marcado
"Customize", certifique-se voc rolar para baixo e escolha a opo "Adicionar python.exe
para o caminho", como em
Instalao do Python
18
Linux
muito provvel que voc j tenha o Python instalado e configurado. Para ter certeza se
ele est instalado (e qual a sua verso), abra um terminal e digite o seguinte comando:
$ python3 --version
Python 3.4.2
Se voc no tem o Python instalado ou quer uma verso diferente, voc pode instal-lo da
seguinte maneira:
Ubuntu
Digite o seguinte comando no terminal:
sudo apt-get install python3.4
Fedora
Use o seguinte comando no terminal:
Instalao do Python
19
OS X
Voc precisa acessar o site https://www.python.org/downloads/release/python-342/ e baixar
o instalador do Python:
download do instalador Mac OS X 64-bit/32-bit DMG,
D um duplo-clique para abri-lo,
D um duplo-clique no Python.mpkg para executar o instalador.
Verifique se a instalao foi bem sucedida abrindo o Terminal e digitando o comando
python3 :
$ python3 --version
Python 3.4.2
Se voc tiver qualquer dvida ou se alguma coisa deu errado e voc no sabe o que fazer por favor pergunte ao seu instrutor! s vezes, as coisas no esto indo bem e melhor
pedir ajuda a algum com mais experincia.
Instalao do Python
20
Editor de Cdigo
Voc est prestes a escrever sua primeira linha de cdigo, ento hora de baixar um editor
de cdigo!
Existem muitos editores diferentes e em grande parte se resume a preferncia pessoal. A
maioria dos programadores Python usa as complexas, mas extremamente poderosas IDEs
(Integrated Development Environments, ou em portugus, Ambiente de desenvolvimento
Integrado), tais como PyCharm. Para um iniciante, entretanto, estas IDE's so menos
convenientes; nossas recomendaes so bem mais simples, porm, igualmente
poderosas.
Nossas sugestes esto abaixo, mas sinta-se livre para perguntar ao seu coach quais so
as suas preferncias - assim vai ser mais fcil obter a ajuda deles.
Gedit
Gedit um editor open-source, gratuito, disponvel para todos os sistemas operacionais.
Baixe aqui
Sublime Text 2
Sublime Text 2 um editor muito popular com um perodo de avaliao gratuita. fcil de
instalar e usar, e est disponvel para todos os sistemas operacionais.
Baixe aqui
Atom
Atom um novo editor de cdigo criado pelo GitHub. Ele gratuito, open-source, fcil de
instalar e fcil de usar. Est disponvel para Windows, OSX e Linux.
Baixe aqui
21
Voc deve estar se perguntando porque estamos instalando esse software editor de cdigo
especial ao invs de usar algo como Word ou Bloco de Notas.
Primeiro que cdigo precisa ser texto sem formatao , e o problema com programas
como Word e Textedit que eles na verdade no produzem texto sem formatao, eles
fazem "rich text" (com fontes e formatao), usando formatos personalizados como RTF.
A segunda razo que editores de cdigo so especializados em editar cdigo, ento eles
podem oferecer recursos teis, como realce de cdigo com cores de acordo com o seu
significado, ou automaticamente fechar citaes para voc.
Ns vamos ver isso em ao depois. Em breve voc ter seu editor de cdigo como uma
das suas ferramentas favoritas. :)
Editor de Cdigo
22
Introduo ao Python
Parte deste captulo baseado nos Tutoriais de Geek Girls Carrots
(http://django.carrots.pl/).
Vamos escrever um pouco de cdigo!
Interpretador Python
Para comear a brincar com Python ns precisamos abrir uma linha de comando no seu
computador. Voc j sabe dever como fazer isso -- voc aprendeu isso no captulo
Introduo Linha de Comando.</p> Assim que estiver pronto, siga as instrues abaixo.
Ns queremos abrir o Python num terminal, ento digite python3 e tecle Enter.
$ python3
Python 3.4.2 (...)
Type "copyright", "credits" or "license" for more information.
>>>
Se voc deseja sair do console do Python, apenas digite exit() ou use o atalho Ctrl + Z
no Windows e Ctrl + D no Mac/Linux. Ento voc no vai ver mais o >>> .
Mas agora no queremos sair da linha de comando do Python. Queremos aprender mais
sobre ele. Vamos, ento, fazer algo muito simples. Por exemplo, tente digitar alguma
operao matemtica, como 2 + 3 e aperte Enter.
>>> 2 + 3
5
23
Como voc pode ver, o Python uma tima calculadora. Se voc est se perguntando o
que mais voc pode fazer...
Strings
Que tal o seu nome? Digite seu primeiro nome entre aspas, desse jeito:
>>> "Ola"
'Ola'
Voc acabou de criar sua primeira string! String um sequncia de caracteres que podem
ser processada pelo computador. A string sempre precisa iniciar e terminar com o mesmo
caractere. Este pode ser aspas duplas( ' ) ou simples( " ) - elas dizem ao Python que o
que est dentro delas uma string.
Strings podem ser juntadas. Tente isto:
>>> "Oi " + "Ola"
'Oi Ola'
Se voc precisa colocar uma apstrofe dentro de sua string, existem duas maneiras de
fazer.
Usando aspas duplas:
>>> "Correndo' ladeira abaixo"
"Correndo' ladeira abaixo"
Legal, hein? Para ver seu nome em letras maisculas, basta digitar:
Introduo ao Python
24
>>> "Ola".upper()
'OLA'
Voc acabou de usar a funo upper na sua string! Uma funo (como upper() ) um
conjunto de instrues que o Python realiza em um determinado objeto ( "Ola" ), sempre
que voc chamar por ele.
Se voc quer saber o nmero de letras do seu nome, existe uma funo para isso tambm!
>>> len("Ola")
3
Se perguntando porque algumas vezes voc chama funes com um . no fim de uma
string (como "Ola".upper() ) e algumas vezes voc primeiro chama a funo colocando a
string nos parnteses? Bem, em alguns casos, funes pertencem a objetos, como
upper() , que s pode ser utilizada em strings. Nesse caso, ns chamamos a funo de
mtodo. Outras vezes, funes no pertencem a nada especfico e podem ser usadas em
diferentes tipos de objetos, assim como len() . por isso que ns estamos fornecendo
"Ola" como um parmetro para a funo len .
Sumrio
OK, chega de strings. At agora voc aprendeu sobre:
o prompt - digitar comandos (cdigos) no interpretador Python resulta em respostas
em Python
nmeros e strings - no Python, nmeros so usados para matemtica e strings para
objetos de texto
operadores - como + e *, combinam valores para produzir um novo valor
funes - como upper() e len(), executam aes nos objetos.
Isso o bsico sobre todas as linguagens de programao que voc aprende. Pronto para
algo mais difcil? Apostamos que sim!
Erros
Vamos tentar algo novo. Podemos obter o tamanho de um nmero da mesma forma que
podemos encontrar o tamanho do nosso nome? Digite len(304023) e pressione Enter:
Introduo ao Python
25
>>> len(304023)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
Temos nosso primeiro erro! Ele diz que objetos do tipo "int" (inteiros, apenas nmeros) no
tm nenhum comprimento. Ento o que podemos fazer agora? Talvez possamos escrever
nosso nmero como uma string? Strings tm um comprimento, certo?
>>> len(str(304023))
6
Funcionou! Usamos a funo str dentro da funo len . str () converte tudo para
strings.
A funo str converte as coisas em strings
A funo int converte as coisas em nmeros inteiros
Importante: podemos converter nmeros em texto, mas ns no podemos,
necessariamente, converter texto em nmeros - o que int('hello') quer dizer?
Variveis
Um conceito importante na programao o conceito de variveis. Uma varivel no
nada mais do que um nome para alguma coisa, de tal forma que voc possa us-la mais
tarde. Os programadores usam essas variveis para guardar dados, para fazer seus
cdigos mais legveis e para no ter que se lembrar sempre o que algumas coisas
significam.
Digamos que queremos criar uma nova varivel chamada nome :
>>> name = "Ola"
Yippee! Sua primeira varivel:)! Voc sempre pode mudar o seu valor:
Introduo ao Python
26
Incrvel no? Claro, variveis podem ser qualquer coisa, ento podem ser nmeros
tambm! Tente isso:
>>> a = 4
>>> b = 6
>>> a * b
24
Mas, e se digitarmos o nome errado? Voc consegue adivinhar o que aconteceria? Vamos
tentar!
>>> city = "Tokyo"
>>> ctiy
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'ctiy' is not defined
Um erro! Como voc pode ver, Python tem diferentes tipos de erros e este chamado
NameError. Python dar este erro se voc tentar usar uma varivel que no foi definida
ainda. Se voc encontrar esse erro depois, veja se no seu cdigo se voc no digitou o
nome de uma varivel errado.
Brinque com isso por um tempo e veja o que voc consegue fazer!
A funo print
Tente isso:
>>> name = 'Maria'
>>> name
'Maria'
>>> print(name)
Maria
Introduo ao Python
27
Quando voc apenas digita name , o interpretador Python responde com a representao
como string da varivel 'name', que so as letras M-a-r-i-a, entre aspas simples. Quando
voc diz print(name) , Python vai "imprimir" o contedo da varivel na tela, sem as aspas,
o que mais puro.
Como veremos mais tarde, print() tambm til quando queremos imprimir algo dentro
de funes, ou quando queremos imprimir algo em vrias linhas.
Listas
Alm de strings e inteiros, o Python tem todos os tipos diferentes de objetos. Vamos
apresentar um chamado lista. Listas so exatamente o que voc acha que elas so: elas
so objetos que so listas de outros objetos :)
V em frente e crie uma lista:
>>> []
[]
Sim, esta uma lista vazia. No muito, no ? Vamos criar uma lista dos nmeros da
loteria. Como no queremos ficar repetindo o cdigo todo o tempo vamos criar uma varivel
para ela:
>>> lottery = [3, 42, 12, 19, 30, 59]
Tudo certo, ns temos uma lista! O que podemos fazer com isso? Vamos ver quantos
nmeros de loteria existem nesta lista. Voc tem ideia de qual funo deve usar para isso?
Voc j sabe disso!
>>> len(lottery)
6
Sim! len() pode te dar o nmero de objetos que fazem parte de uma lista. Uma mo na
roda, no? Vamos organizar isso agora:
>>> lottery.sort()
Isso no retorna nada, apenas troca a ordem em que os nmeros aparecem na lista. Vamos
imprimir isso outra vez e ver o que acontece:
Introduo ao Python
28
>>> print(lottery)
[3, 12, 19, 30, 42, 59]
Como voc pode ver, os nmeros na nossa lista esto ordenados do menor para o maior.
Parabns!
Talvez a gente queira inverter essa ordem? Vamos fazer isso!
>>> lottery.reverse()
>>> print(lottery)
[59, 42, 30, 19, 12, 3]
Moleza n? Se voc quiser adicionar alguma coisa sua lista, voc pode fazer isto
digitando o seguinte comando:
>>> lottery.append(199)
>>> print(lottery)
[59, 42, 30, 19, 12, 3, 199]
Se voc quiser mostrar apenas o primeiro nmero voc pode usar indices. Um ndice um
nmero que diz onde um item da lista est. Os computadores gostam de iniciar a contagem
por 0, ento o primeiro objeto tem ndice 0, o prximo tem ndice 1 e por a vai. Tente isso:
>>> print(lottery[0])
59
>>> print(lottery[1])
42
Como voc pode ver, voc pode acessar diferentes objetos na sua lista usando o nome da
lista e o ndice do objeto dentro dos colchetes.
Por diverso extra, tente alguns outros ndices: 6, 7, 1000, -1, -6 ou -1000. Veja se voc
consegue prever o resultado antes de tentar o comando. Os resultados fazem sentido?
Voc pode encontrar uma lista de todos os mtodos disponveis neste captulo na
documentao do Python: https://docs.python.org/3/tutorial/datastructures.html
Dicionrios
Um dicionrio semelhante a uma lista, mas voc pode acessar valores atravs de uma
chave ao invs de um ndice. Uma chave pode ser qualquer string ou nmero. A sintaxe
para definir um dicionrio vazio :
Introduo ao Python
29
>>> {}
{}
Com esse comando, voc acabou de criar uma varivel chamada participant com trs
pares de chave-valor:
A chave nome aponta para o valor 'Ola' (um objeto string ),
pais aponta para 'Polonia' (outra string ),
e numeros_favoritos apontam para [7, 42, 92] (uma list com trs nmeros nela).
Voc pode checar o contedo de chaves individuais com a sintaxe:
>>> print(participant['name'])
Ola
Veja, similar a uma lista. Mas voc no precisa lembrar o ndice - apenas o nome.
O que acontece se pedirmos ao Python o valor de uma chave que no existe? Voc
consegue adivinhar? Vamos tentar e descobrir!
>>> participant['age']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'age'
Olha, outro erro! Esse um KeyError. Python bastante prestativo e te diz que a chave
'age' no existe no nesse dicionrio.
Quando usar um dicionario ou uma lista? Bem, um bom ponto para refletir. Pense em uma
soluo antes de olhar a resposta na prxima linha.
Voc precisa de uma sequncia ordenada de itens? Use uma list.
Voc precisa associar valores com chaves, assim voc pode procur-los eficientemente
(pela chave) mais tarde? Use um dictionary.
Introduo ao Python
30
Dicionrios, como listas, so mutveis, ou seja, que podem ser mudados depois que so
criados. Voc pode adicionar novos pares de chave/valor para o dicionrio aps sua
criao, como:
>>> participant['favorite_language'] = 'Python'
Como as lists, usar o mtodo len() em dicionrios retorna o nmero de pares chave-valor
no dicionario. V em frente e digite o comando:
>>> len(participant)
4
Espero que agora faa sentido at agora. :) Pronta para mais diverso com dicionrios?
Pule na prxima linha para coisas incrveis.
Voc pode usar o comando del para deletar um item no dicionario. Digamos, se voc quer
excluir a entrada correspondente a chave 'favorite_numbers' , basta digitar o seguinte
comando:
>>> del participant['favorite_numbers']
>>> participant
{'country': 'Poland', 'favorite_language': 'Python', 'name': 'Ola'}
Como voc pode ver, o valor da chave 'country' foi alterado de 'Poland' para
'Germany' . :) Emocionante? Hurra! Voc acabou de aprender outra coisa incrvel.
Sumrio
Incrvel! Agora voc sabe muito sobre programao. Nesta ltima parte voc aprendeu
sobre:
erros - agora voc sabe como ler e entender erros que aparecem se o Python no
Introduo ao Python
31
Compare coisas
Grande parte da programao consiste em comparar coisas. O que mais fcil de
comparar? Nmeros, claro. Vamos ver como isso funciona:
>>> 5 > 2
True
>>> 3 < 1
False
>>> 5 > 2 * 2
True
>>> 1 == 1
True
>>> 5 != 2
True
Demos ao Python alguns nmeros para comparar. Como voc pode ver, Python pode
comparar no s nmeros mas tambm resultados de mtodos. Legal, hein?
Voc est se perguntando por que colocamos dois sinais de igual == lado a lado para
comparar se os nmeros so iguais? Ns usamos um nico = para atribuir valores a
variveis. Voc sempre, sempre precisa colocar dois == se quiser verificar se as coisas
so iguais. Tambm possvel afirmar que as coisas so desiguais entre si. Para isso,
usamos o smbolo ! = , conforme mostrado no exemplo acima.
D ao Python mais duas tarefas:
>>> 6 >= 12 / 2
True
>>> 3 <= 2
False
> e < so fceis, mas o que >= e <= significam? Leia eles da seguinte forma:
Introduo ao Python
32
Voc pode dar ao Python quantos nmeros para comparar quanto voc quiser, e ele vai te
dar uma resposta! Espertinho, certo?
and - se voc usar o operador and , ambas as comparaes tero que ser verdadeiras
para que todo o comando seja verdadeiro
or - se voc usar o operador or , apenas uma das comparaes precisa ser
verdadeira para que o comando todo seja verdadeiro
J ouviu a expresso "comparar mas com laranjas"? Vamos tentar o equivalente em
Python:
>>> 1 > 'django'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() > str()
Aqui vemos que assim como na expresso, Python no capaz de comparar um nmero
( int ) e uma string (`str</0)>. Em vez disso, ele mostrou um TypeError e nos disse que os
dois tipos no podem ser comparados juntos.</p>
Booleano
Acidentalmente, voc aprendeu sobre um novo tipo de objeto em Python. chamado de
booleano -- e provavelmente o tipo mais fcil que existe.
Existem apenas dois objetos booleanos: - True (verdadeiro) - False (falso)
Mas para o Python entender isso, voc precisa sempre escrever True (primeira letra
maiscula, com o resto das letras em minsculo). true, TRUE, tRUE no vai funcionar -s True correto. (O mesmo se aplica ao False, claro.)
Booleanos podem ser variveis tambm! Veja:
Introduo ao Python
33
>>> a = True
>>> a
True
Salv-lo!
At agora ns escrevemos todo nosso cdigo em um interpretador python, que nos limita a
uma linha de cdigo em um momento. Programas normais so salvos em arquivos e
executados pelo nosso interpretador de linguagem de programao ou compilador. At
agora j corremos nossos programas de uma linha de cada vez no interpretador Python.
Ns vamos precisar de mais de uma linha de cdigo para as prximas tarefas, ento
precisaremos rapidamente:
Sada do interpretador Python
Abra seu editor de cdigo de sua escolha
Salvar algum cdigo em um novo arquivo de python
Execut-lo!
Para sair do interpretador Python que estamos usando, simplesmente digite o ~ exit() ~
funo:
>>> exit()
$
Introduo ao Python
34
Nota Voc deve observar que uma das coisas mais legais sobre editores de cdigo:
cores! No console do Python, tudo era da mesma cor, mas agora voc deve ver que a
funo de Imprimir uma cor diferente da sequncia de caracteres no seu interior.
Isso chamado de "realce de sintaxe", e uma ajuda muito til quando est
programando. Perceba a cor das coisas e voc vai obter uma dica para quando voc
esquecer de fechar uma seqncia de caracteres, ou fazer um erro de digitao em
um nome de palavra-chave (como def em uma funo, que veremos abaixo). Esta
uma das razes pelas quais que ns usamos um editor de cdigo :)
Obviamente, voc um desenvolvedor python bastante experiente agora, ento sinta-se
livre para escrever um cdigo que voc aprendeu hoje.
Agora temos de salvar o arquivo e d um nome descritivo. Vamos chamar o arquivo
python_intro.py e salve-o em seu desktop. Podemos nomear o arquivo tudo o que
quisermos, o importante aqui ter certeza que o arquivo termina no py, isto diz nosso
computador, que um arquivo executvel de python e Python pode execut-lo.
Com o arquivo salvo, hora de execut-lo! Usando as habilidades que voc aprendeu na
seo de linha de comando, use o terminal altere os diretrios para o desktop.
Em um Mac, o comando ser parecido com isto:
cd /Users/<your_name>/Desktop
No Linux, ser assim (a palavra "Desktop" pode ser traduzido para seu idioma):
cd /home/<your_name>/Desktop
Introduo ao Python
35
$ python3 python_intro.py
Hello, Django girls!
Tudo bem! Voc acabou de seu primeiro programa em python que foi salvo em um arquivo.
Me sinto timo?
Voc pode agora passar para uma ferramenta essencial na programao:
if...elif...else
Muitas coisas no cdigo s podem ser executadas se determinadas condies forem
atendidas. por isso que o Python tem alguma coisa chamada declarao if.
Substitua o cdigo no arquivo python_intro.py para isto:
if 3 > 2:
Python espera que fornecemos mais instrues que sero supostamente executadas caso
a condio 3 > 2 venha a ser verdadeira (ou True nesse caso). Vamos tentar fazer o
Python imprimir "It works!". Altere o seu cdigo no seu arquivo python_intro.py para isto:
if 3 > 2:
print('It works!')
Observe como podemos ter recuado a prxima linha de cdigo por 4 espaos? Precisamos
fazer isso para que Python sabe que cdigo a ser executado se o cdigo resulta em true.
Voc pode fazer um espao, mas quase todos os programadores Python fazem com 4 para
tornar as coisas um olhar puro. Um nico tab tambm vai contar como 4 espaos.
Salv-lo e execute novamente:
$ python3 python_intro.py
It works!
Introduo ao Python
36
E se no?
Nos exemplos anteriores, o cdigo foi executado somente quando as condies eram
verdade. Mas o Python tambm tem instrues elif e else :
if 5 > 2:
print('5 is indeed greater than 2')
else:
print('5 is not greater than 2')
Se 2 for um nmero maior do que 5, ento o segundo comando ser executado. Fcil, n?
Vamos ver como funciona o elif :
name = 'Sonja'
if name == 'Ola':
print('Hey Ola!')
elif name == 'Sonja':
print('Hey Sonja!')
else:
print('Hey anonymous!')
e executado:
$ python3 python_intro.py
Hey Sonja!
Sumrio
Nos ltimos trs exerccios voc aprendeu:
comparar as coisas - em Python, voc pode comparar as coisas usando os
operadores > , >= , == , <= , < e o and , or
Booleano - um tipo de objeto que s tem um dos dois valores: True ou False
Salvando arquivos - armazenamento de cdigo em arquivos assim voc pode
executar programas maiores.
if... elif... else-instrues que permitem que voc execute o cdigo somente se
Introduo ao Python
37
Isso foi fcil! Vamos construir nossa primeira funo com parmetros. Usaremos o exemplo
anterior - uma funo que diz 'hi' para quem o executa - com um name:
def hi(name):
Como voc pode ver, agora demos um parmetro chamado name para nossa funo:
Introduo ao Python
38
def hi(name):
if name == 'Ola':
print('Hi Ola!')
elif name == 'Sonja':
print('Hi Sonja!')
else:
print('Hi anonymous!')
hi()
Como voc pode ver, ns precisamos colocar dois espaos antes da funo print , porque
if precisa saber o que deve acontecer quando a condio for atendida. Vamos ver como
Oops, um erro. Felizmente, Python nos fornece uma mensagem de erro bastante til. Ela
diz que a funo hi() (aquela que declaramos) tem um argumento obrigatrio (chamado
name ) e que ns esquecemos de pass-lo ao chamar a funo. Vamos corrigi-lo na parte
inferior do arquivo:
hi("Ola")
e execute novamente:
$ python3 python_intro.py
Hi Ola!
E se mudarmos o nome?
hi("Sonja")
e execut-lo:
$ python3 python_intro.py
Hi Sonja!
Introduo ao Python
39
Agora, o que acha que vai acontecer se voc escrever outro nome l? (No Ola ou Sonja)
Experiment-lo e ver se voc est certo. Ele deve imprimir isto:
Hi anonymous!
Isto incrvel, no? Dessa maneira voc no precisa se repetir (DRY - don't repeat yourself)
cada vez que for mudar o nome da pessoa que a funo pretende cumprimentar. E
exatamente por isso que precisamos de funes - voc nunca quer repetir seu cdigo!
Vamos fazer algo mais inteligente..--existem mais que dois nomes, e escrever uma
condio para cada um seria difcil, certo?
def hi(name):
print('Hi ' + name + '!')
hi("Rachel")
Laos
J a ltima parte. Foi rpido, no? :)
Como mencionamos, os programadores so preguiosos, no gostam de repetir as
mesmas coisas. Programao fala sobre como automatizar as coisas, ento no queremos
cumprimentar cada pessoa pelo seu nome manualmente, certo? a onde os laos vem a
calhar.
Ainda se lembra das listas? Vamos fazer uma lista de garotas:
girls = ['Rachel', 'Monica', 'Phoebe', 'Ola', 'You']
Queremos cumprimentar todas elas pelos seus nomes. Temos a funo hi para fazer
isso, ento vamos us-la em um loop:
for name in girls:
Introduo ao Python
40
e quando execut-lo:
$ python3 python_intro.py
Hi Rachel!
Next girl
Hi Monica!
Next girl
Hi Phoebe!
Next girl
Hi Ola!
Next girl
Hi You!
Next girl
Como voc pode ver, tudo o que voc vai colocar dentro de uma instruo for com
espao ser repetido para cada elemento da lista girls .
Voc tambm pode usar o for em nmeros usando a funo range :
for i in range(1, 6):
print(i)
range uma funo que cria uma lista de nmeros que se seguem um aps o outro
Introduo ao Python
41
Note que o segundo desses dois nmeros no est includo na lista que o Python mostrou
(em range(1, 6) , conta de 1 a 5, mas o 6 no includo).
Sumrio
isso. Voc totalmente demais! No to fcil, ento voc deve se sentir orgulhoso de
si mesmo. Estamos definitivamente orgulhosos de voc por ter chegado at aqui!
Talvez voc queira brevemente fazer algo mais - espreguiar, andar um pouco, descansar
os olhos - antes de ir para o prximo captulo. :)
Introduo ao Python
42
O que Django?
Django um framework gratuito e de cdigo aberto para a criao de aplicaes web,
escrito em Python. um framework web, ou seja, um conjunto de componentes que ajuda
a desenvolver sites de forma mais rpida e mais fcil.
Veja, quando voc est construindo um site, voc sempre precisa um conjunto similar de
componentes: uma maneira de lidar com a autenticao do usurio (inscrever-se, realizar
login, realizar logout), painel de gerenciamento para o seu site, formulrios, upload de
arquivos, etc.
Felizmente para voc, h muito tempo, outras pessoas notaram varias semelhanas nos
problemas enfrentados pelos desenvolvedores web quando esto criando um novo site,
ento eles uniram-se e criaram os frameworks (Django um deles) que lhe do
componentes prontos, que voc pode usar.
Frameworks existem para salv-lo de ter que reinventar a roda e ajudam a aliviar a
sobrecarga quando voc est construindo um novo site.
O que Django?
43
inteligente - leva uma lista de padres e tenta corresponder a URL. O Django verifica
padres de cima para baixo e se algo correspondido, passa a solicitao para a funo
associada (que chamada view).
Imagine um carteiro com uma carta. Ela est andando pela rua e verifica cada nmero de
casa com a que est na carta. Se ele corresponder, ela coloca a carta l. assim que
funciona o urlresolver!
Todas as coisas interessantes so feitas dentro da view: podemos dar uma olhada no banco
de dados para procurar algumas informaes. Talvez o usurio queira mudar algo nos
dados? Como uma carta dizendo: "Por favor mude a descrio do meu emprego." - a view
checa se voc tem permisso para fazer isso e ento atualiza a descrio do emprego pra
voc, enviando em seguida uma mensagem: "Feito!". Ento a view gera uma resposta e o
Django pode envi-la para o navegador do cliente.
Claro, a descrio acima muito simplificada, mas voc no precisa saber detalhes
tcnicos ainda. Ter uma ideia geral j suficiente.
Ento em vez de mergulhar em muitos detalhes, ns simplesmente vamos comear criando
algo com o Django e aprenderemos toda as partes importantes ao longo do caminho!
O que Django?
44
Instalao do Django
Parte deste captulo baseado nos tutoriais do Geek Girls Carrots
(http://django.carrots.pl/).
Parte deste captulo baseado no django-marcador tutorial licenciado sobre Creative
Commons Attribution-ShareAlike 4.0 International License. O tutorial do djangomarcador protegido por direitos autorais por Markus Zapke-Grndemann et al.
Ambiente virtual
Antes de instalarmos o Django, ns iremos instalar uma ferramenta extremamente til que
ir ajudar a manter seu ambiente de desenvolvimento arrumado em seu computador.
possvel ignorar este passo, mas altamente recomendado no comear com a melhor
configurao, evitando problemas adiante!
Ento, vamos criar um ambiente virtual(tambm chamado um virtualenv). Isso isolar sua
configurao Python/Django em uma base por projeto, significa que quaisquer mudanas
que fizer em um website no afetar quaisquer outras aplicaes que estiver
desenvolvendo a parte. Arrumado, certo?
Tudo o que voc precisa fazer encontrar um diretrio no qual voc deseja criar o
virtualenv ; Seu diretrio Home, por exemplo. No Windows pode parecer como
C:\Usurio\Nome (onde Nome o nome do seu login).
Para este tutorial usaremos um novo diretrio djangogirls do seu diretrio home:
mkdir djangogirls
cd djangogirls
Windows
Para criar um novo virtualenv , voc precisa abrir o console(Ns falamos sobre isso
alguns captulos atrs, lembra-se?) e executar C:\Python34\python -m venv myvenv . Ser
algo parecido com isto:
Instalao do Django
45
Linux e OS X
Criar um virtualenv tanto no Linux como OS X simples como executar python3 -m venv
myvenv . Ser algo parecido com isto:
myvenv o nome da sua virtualenv . Voc pode usar qualquer outro nome, mas
no Windows, ou:
~/djangogirls$ source myvenv/bin/activate
Instalao do Django
46
no OS X e no Linux.
Lembre-se de substituir myvenv com seu nome escolhido do virtualenv !
NOTE: s vezes source(fonte) pode no estar disponvel. Nesses casos, tente fazer
isso em vez disso:
~/djangogirls$ . myvenv/bin/activate
Voc vai saber que tem um virtualenv funcionando quando ver o prompt no seu console
se parecer com:
(myvenv) C:\Usurio\Nome\djangogirls>
ou:
(myvenv) ~/djangogirls$
Instalando o Django
Agora que voc tem a sua virtualenv iniciado, voc pode instalar Django usando pip .
No console, execute pip install django==1.8.5 (Perceba que usamos um duplo sinal de
igual: == ).
(myvenv) ~$ pip install django==1.8.5
Downloading/unpacking django==1.8.5
Installing collected packages: django
Successfully installed django
Cleaning up...
no Windows
Instalao do Django
47
Se voc receber um erro ao chamar o pip na plataforma Windows por favor, verifique
se o caminho do projeto contm espaos, acentos ou caracteres especiais (exemplo,
C:\Users\User Name\djangogirls ). Se sim por favor mova para outro lugar sem
isso! Agora voc est (finalmente) pronto para criar uma aplicao Django!
Instalao do Django
48
Nota Verifique que voc incluiu o ponto ( . ) no final do comando, importante porque
diz o script para instalar o Django em seu diretrio atual.
No console, voc deve executar (Lembre-se de que voc no pode digitar ~/djangogirls$
(myvenv) , OK?):
no Windows:
(myvenv) C:\Users\Name\djangogirls> python myvenv\Scripts\django-admin.py startproject mysite .
Django-admin um script que ir criar os diretrios e arquivos para voc. Agora, voc deve
49
djangogirls
manage.py
mysite
settings.py
urls.py
wsgi.py
__init__.py
manage.py um script que ajuda com a gesto do site. Com isso seremos capazes de
iniciar um servidor de web no nosso computador sem instalar nada, entre outras coisas.
O arquivo settings.py contm a configurao do seu site.
Lembra quando falamos sobre um carteiro verificando onde entregar uma carta? arquivo
urls.py contm uma lista dos padres usados por urlresolver .
Vamos ignorar os outros arquivos por agora - ns no vamos mud-los. A nica coisa a
lembrar no exclu-los por acidente!
Configurando
Vamos fazer algumas alteraes no mysite/settings.py . Abra o arquivo usando o editor de
cdigo que voc instalou anteriormente.
Seria bom ter a hora correta no nosso site. V para a <wikipedia timezones list e copie seu
fuso horrio. (por exemplo. Europa/Berlim )
Em settings.py, localize a linha que contm TIME_ZONE e modifique para escolher seu
prprio fuso horrio:
TIME_ZONE = 'Europe/Berlin'
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Criando um projeto
50
Para criar um banco de dados para o nosso blog, vamos fazer o seguinte no console.
Digite: python manage.py migrate (precisamos estar no diretrio que contm o arquivo
manage.py djangogirls ). Se isso der certo, voc deve ver algo como isto:
E est pronto! Hora de iniciar o servidor web e ver se nosso site est funcionando!
Voc precisa estar no diretrio que contm o arquivo manage.py (o diretrio djangogirls ).
No console, ns podemos iniciar o servidor web executando o python manage.py runserver :
(myvenv) ~/djangogirls$ python manage.py runserver
Agora tudo que voc precisa fazer verificar se seu site est sendo executado - abra seu
navegador (Firefox, Chrome, Safari, Internet Explorer ou o que voc usa) e digite o
endereo:
http://127.0.0.1:8000/
O servidor web vai assumir seu prompt de comando at voc par-lo: para digitar mais
comandos ou abrir uma nova janela do terminal (e no se esquea de ativar seu virtualenv
nele tambm), ou parar o servidor de web, alternando de volta para a janela na qual est
Criando um projeto
51
Criando um projeto
52
Modelos do Django
Agora o que ns queremos criar algo que armazene todos os posts no nosso blog. Mas
para fazer isso precisamos aprender um pouco mais sobre coisas chamadas objetos .
Objetos
Existe um conceito na programao chamado Programao Orientada Objetos (POO) . A
ideia que ao invs de escrever tudo como uma chata sequncia de instrues de
programao podemos modelar as coisas e definir como elas interagem umas com as
outras.
Ento o que um objeto? uma coleo de propriedades e aes. Isto pode parecer
estranho, mas vamos lhe dar um exemplo.
Se queremos modelar um gato ns criaremos um objeto Gato que possui algumas
propriedades, por exemplo cor , idade , humor (bom, mau, sonolento ;)), dono (que
um objeto da classe Pessoa ou, caso seja um gato de rua, essa propriedade vazia).
E ento o Gato tem algumas aes: ronronar , arranhar ou comer (no qual vamos dar
ao gato alguma ComidaDeGato , que poderia ser um objeto separado com propriedades,
como sabor ).
Gato
-------cor
idade
humor
dono
ronronar()
arranhar()
comer(comida_de_gato)
ComidaDeGato
-------sabor
Modelos do Django
53
Que tipo de coisa pode ser feita com uma postagem? Seria legal ter algum mtodo que
publique a postagem, no mesmo?
Ento precisamos de um mtodo chamado publicar .
Como j sabemos o que queremos alcanar, podemos comear a modelagem em Django!
Modelo do Django
Sabendo o que um objeto , ns criaremos um modelo no Django para a postagem do blog.
Um modelo no Django um tipo especial de objeto - ele salvo em um banco de dados .
Um banco de dados uma coleo de dados. O banco de dados um local em que voc
vai salvar dados sobre usurios, suas postagens, etc. Usaremos um banco de dados
chamado SQLite para armazenar as nossas informaes. Este o adaptador de banco de
dados padro Django -- ele vai ser o suficiente para ns neste momento.
Voc pode pensar em um modelo de banco de dados como uma planilha com colunas
(campos) e linhas (dados).
Modelos do Django
54
Voc vai notar que um novo diretrio blog criado e que ele agora contm um nmero de
arquivos. Nossos diretrios e arquivos no nosso projeto devem se parecer com este:
djangogirls
mysite
| __init__.py
| settings.py
| urls.py
| wsgi.py
manage.py
blog
migrations
| __init__.py
__init__.py
admin.py
models.py
tests.py
views.py
Depois de criar um aplicativo tambm precisamos dizer ao Django que deve us-lo.
Fazemos isso no arquivo mysite/settings.py . Precisamos encontrar o INSTALLED_APPS e
adicionar uma linha com 'blog', logo acima do ) . assim que o produto final deve ficar
assim:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
Modelos do Django
55
um nmero? Uma data? Uma relao com outro objeto, por exemplo, um usurio?).
models.CharField - assim como voc define um texto com um nmero limitado de
caracteres.
models.TextField - este para textos longos sem um limite. Ser ideal para um
Modelos do Django
56
Ns no vamos explicar cada pedao de cdigo aqui, pois isso levaria muito tempo. Voc
deve olhar a documentao do DJango se voc quiser saber mais sobre campos do Model
e como definir coisas alm destas descritas acima
(https://docs.djangoproject.com/en/1.8/ref/models/fields/#field-types).
Que tal def publish(self): ? exatamente o nosso mtodo de publish que falvamos
antes. def , significa que se trata de um funo/mtodo. publish o nome do mtodo.
Voc pode alterar, se quiser. A regra que usamos letras minsculas e sublinhados em vez
de espaos em branco (ou seja, se voc quer ter um mtodo que calcula o preo mdio,
voc poderia cham-lo calculate_average_price ).
Mtodos muitas vezes return algo. H um exemplo de que, no mtodo __str__ . Nesse
cenrio, quando chamamos __str__() teremos um texto (string), com um ttulo do Post.
Se algo ainda no est claro sobre modelos, sinta-se livre para pedir o seu treinador!
Sabemos que muito complicado, especialmente quando voc aprender o que so objetos
e funes ao mesmo tempo. Mas espero que ele se parece um pouco menos mgica para
voc agora!
Django prepara um arquivo de migrao que temos de aplicar agora para nosso banco de
dados, tipo python manage.py migrate blog , a sada deve ser:
(myvenv) ~/djangogirls$ python manage.py migrate blog
Operations to perform:
Apply all migrations: blog
Running migrations:
Applying blog.0001_initial... OK
Viva! Nosso modelo de Post est agora em nosso banco de dados, seria um prazer v-lo,
certo? Saltar para o prximo captulo para ver o aspecto do seu Post!
Modelos do Django
57
Administrao
Para adicionar, editar e remover postagens que ns criamos usaremos o Django admin.
Vamos abrir o arquivo blog/admin.py e substituir seu contedo por:
from django.contrib import admin
from .models import Post
admin.site.register(Post)
Como voc pode ver, ns importamos (inclumos) o modelo Post definido no captulo
anterior. Para tornar nosso modelo visvel na pgina de administrao, ns precisamos
registr-lo com: admin.site.register(Post) .
OK, hora de olhar para o nosso modelo de Post. Lembre-se de executar python manage.py
runserver no console para executar o servidor web. V para o navegador e digite o
Para fazer login voc precisa criar um superuser - um usurio que possui controle sobre
tudo do site. Volte para o terminal e digite python manage.py createsuperuser , pressione
enter e digite seu nome de usurio (caixa baixa, sem espao), endereo de e-mail e
Administrao
58
password quando eles forem requisitados. No se preocupe que voc no pode ver a senha
que voc est digitando - assim que deve ser. S digit-la e pressione 'Enter' para
continuar. A sada deve parecer com essa (onde Username e Email devem ser os seus):
(myvenv) ~/djangogirls$ python manage.py createsuperuser
Username: admin
Email address: admin@admin.com
Password:
Password (again):
Superuser created successfully.
Volte para a o navegador e faa login com as credenciais de superuser que voc escolheu,
voc deve visualizar o painel de controle do Django admin.
V para as postagens e experimente um pouco com elas. Adicione cinco ou seis postagens.
No se preocupe com o contedo - voc pode copiar e colar algum texto deste tutorial para
o contedo para economizar tempo :).
Certifique-se que pelo menos duas ou trs postagens (mas no todas) tm a data de
publicao definida. Isso ser til depois.
Administrao
59
Se voc quiser saber mais sobre o Django admin, voc deve conferir a documentao do
Django: https://docs.djangoproject.com/en/1.8/ref/contrib/admin/
Este provavelmente um bom momento para tomar um caf (ou chocolate) ou algo para
comer para repora as energias. Voc criou seu primeiro modelo de Django - voc merece
um pouco de descanso!
Administrao
60
Implantao!
Nota O captulo seguinte pode ser s vezes um pouco difcil de passar. Persista e
termine-o; Implantao uma parte importante do processo de desenvolvimento de
website. Este captulo est localizado no meio do tutorial para que seu tutor possa lhe
ajudar com o processo ligeiramente complexo de colocar seu site online. Isto significa
que voc ainda pode terminar o tutorial por conta prpria se voc continuar em outro
momento.
At agora nosso site s estava disponvel no seu computador, agora voc vai aprender
como publicar ele na internet! A implantao o processo de publicao do seu aplicativo
na Internet de tal forma que as pessoas possam, finalmente, ver seu aplicativo :).
Como voc aprendeu, um website precisa estar localizado num servidor. Existem muitos
provedores, mas iremos utilizar o que tem um processo de deploy relativamente simples:
PythonAnywhere. PythonAnywhere gratuito para aplicaes pequenas que no possuem
muitos visitantes, ento ser suficiente para voc por enquanto.
O outro servio externo que usaremos GitHub, que um servio de hospedagem de
cdigo. Existem outros, mas quase todos os programadores possuem uma conta no GitHub
atualmente e agora voc tambm!
Usaremos o GitHub como um trampolim para transportar nosso cdigo para o
PythinAnywhere.
Git
Git "sistema de controle de verso" usado por muitos programadores - um software que
controla mudanas nos arquivos ao longo do tempo para que voc possa recuperar verses
especficas depois. Um pouco como "controlar mudanas" no Microsoft Word, mas muito
mais poderoso.
Instalando o Git
Windows
Implantao!
61
Voc pode baixar Git em git-scm.com. Voc pode apertar "next next next" em todos os
passos exceto um; no quinto passo chamado "Adjusting your PATH environment", escolha
"Run Git and associated Unix tools from the Windows command-line" (a opo de baixo).
Alm disso, o padro est timo. Checkout estilo Windows, commit Unix-style linhas de
confirmao est bom.
MacOS
Baixar Git git-scm.com e siga as instrues.
Linux
Se ele j no estiver instalado, Git deve estar disponvel atravs de seu gerenciador de
pacotes, ento tente:
sudo apt-get install git
# or
sudo yum install git
$ git init
Initialized empty Git repository in ~/djangogirls/.git/
$ git config user.name "Your Name"
$ git config user.email you@example.com
Inicializar o repositrio git algo que s precisamos fazer uma vez por projeto (e voc no
ter que re-introduzir o nome de usurio e e-mail nunca mais)
Git ir controlar as alteraes para todos os arquivos e pastas neste diretrio, mas existem
alguns arquivos que queremos ignorar. Fazemos isso atravs da criao de um arquivo
chamado .gitignore no diretrio base. Abra seu editor e crie um novo arquivo com o
seguinte contedo:
Implantao!
62
*.pyc
__pycache__
myvenv
db.sqlite3
.DS_Store
Implantao!
63
Nota O nome my-first-blog importante --voc poderia escolher outra coisa, mas
vamos us-lo muitas vezes nas instrues abaixo e voc teria que substitu-lo cada
vez. provavelmente mais fcil ficar com o nome my-first-blog .
Na tela seguinte, voc ser mostrada a clone URL do seu repo. Escolha a verso
"HTTPS",copie, e vamos col-lo no terminal em breve:
Implantao!
64
Digite seu GitHub username e senha, e voc deve ver algo como isto:
Username for 'https://github.com': hjwp
Password for 'https://hjwp@github.com':
Counting objects: 6, done.
Writing objects: 100% (6/6), 200 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/hjwp/my-first-blog.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
Seu cdigo agora est no GitHub. V e confira! Voc saber que est em boa companhia Django, o Django Girls Tutorial e muitos outros grandes projetos de software de fonte aberta
tambm hospedam seu cdigo no GitHub :)
Implantao!
65
www.pythonanywhere.com
Nota: ao escolher seu nome de utilizador aqui, tenha em mente que a URL do seu blog
ter o formulrio yourusername.pythonanywhere.com , ento escolha seu nickname ou o
nome do que o blog.
Isto puxar uma cpia do seu cdigo para PythonAnywhere. Confira digitando:
$ tree my-first-blog
my-first-blog/
blog
__init__.py
admin.py
migrations
0001_initial.py
__init__.py
models.py
tests.py
views.py
manage.py
mysite
__init__.py
settings.py
urls.py
wsgi.py
Implantao!
66
20:20 ~ $ cd my-first-blog
20:20 ~ $ virtualenv --python=python3.4 myvenv
Running virtualenv with interpreter /usr/bin/python3.4
[...]
Installing setuptools, pip...done.
20:20 ~ $ source myvenv/bin/activate
(mvenv)20:20 ~ $ pip install django whitenoise
Collecting django
[...]
Successfully installed django-1.8.5 whitenoise-2.0
Digite "Sim" e vai embora! Voc no adora fazer computadores imprimir pginas e pginas
de texto? Sempre fao pequenos rudos para acompanh-lo. Brp, brp brp...
Implantao!
67
opying '/home/edith/.virtualenvs/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin/
Copying '/home/edith/.virtualenvs/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin
[...]
Copying '/home/edith/.virtualenvs/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin
Copying '/home/edith/.virtualenvs/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin
62 static files copied to '/home/edith/my-first-blog/static'.
Definindo o virtualenv
Implantao!
68
Voc ser levado para a tela de configurao de PythonAnywhere para seu webapp que
onde voc precisar de ir quando quiser fazer alteraes para o aplicativo no servidor.
Na seo "Virtualenv", clique no texto vermelho que diz "Enter the path to a virtualenv" e
digite: /home//my-first-blog/myvenv/
Nota: substitua seu prprio nome de usurio conforme apropriado. Se voc cometer
um erro, PythonAnywhere ir mostrar um pequeno aviso.
Implantao!
69
import os
import sys
path = '/home/<your-username>/my-first-blog' # use your own username here
if path not in sys.path:
sys.path.append(path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(get_wsgi_application())
Nota no se esquea de substituir em seu prprio nome de usurio onde diz <yourusername>
O que esse arquivo faz dizer PythonAnywhere onde mora a nossa aplicao web e qual o
nome do arquivo de configuraes Django. Ele tambm define a ferramenta de arquivos
estticos "whitenoise".
Aperte Save e ento volte para a guia Web.
J terminamos! Aperte o boto grande verde de Reloade voc ser capaz de ir ver os seu
aplicativo. Voc encontrar um link para ele no topo da pgina.
Dicas de debugging
Se voc vir um erro quando voc tenta visitar o seu site, o primeiro lugar para procurar
alguma informao de debugging no seu error log -- voc encontrar um link para isso na
guia web PythonAnywhere. Ver se h mensagens de erro l. As mais recentes esto na
parte inferior. Problemas comuns incluem
esquecer um dos passos que fizemos no console: criando o virtualenv, ativ-lo,
instalando o Django, collectstatic, inicializando o banco de dados
cometer um erro no caminho do virtualenv na guia web -- haver geralmente uma
pequena mensagem de erro vermelho l, se h um problema
cometer um erro no arquivo de configurao WSGI..--voc usou o caminho para a
pasta do my-first-blog certinho?
O treinador est aqui para ajudar!
Implantao!
70
A pgina padro para seu site deve dizer "Bem-vindo ao Django", como acontece no seu
PC local. Tente adicionar /admin/ para o final da URL, e voc ser levado ao site admin.
Fazer login com o nome de usurio e senha, e voc ver que voc pode adicionar novas
mensagens no servidor.
D em voc mesma um enorme tapinha nas costas - implantaes de servidor so uma das
partes mais difceis do desenvolvimento web, e muitas vezes leva as pessoas vrios dias
antes de fazer funcionar. Mas voc tem seu site publicado, na internet, assim!
Implantao!
71
Urls
Estamos prestes a construir nossa primeira Web page - uma pgina inicial para o seu blog!
Mas primeiro, vamos aprender um pouco mais sobre Django urls.
Cada pgina na Internet precisa de sua prpria URL. Desta forma seu aplicativo sabe o que
deve mostrar a um usurio que abre uma URL. Em Django, ns usamos algo chamado
URLconf (configurao de URL), que um conjunto de padres que Django vai tentar
Como voc pode ver, o Django j colocou alguma coisa l pra ns.
Urls
72
As linhas que comeam com # so comentrios - isso significa que essas linhas no
sero executadas pelo Python. Muito til, no?
A URL do admin, que voc visitou no captulo anterior j est aqui:
url(r'^admin/', include(admin.site.urls)),
Isso significa que para cada URL que comea com admin / o Django ir encontrar um
correspondente modo de exibio. Neste caso ns estamos incluindo um monte de admin
URLs para que isso no fique tudo embalado neste pequeno arquivo..-- mais legvel e
mais limpo.
Regex
Voc quer saber como o Django coincide com URLs para views? Bem, esta parte
complicada. o Django usa o regex -- expresses regulares. Regex tem muito (muito!) de
normas que formam um padro de pesquisa. Como regexes so um tpico avanado, ns
veremos em detalhes como elas funcionam.
Se voc ainda quiser entender como criamos os padres, aqui est um exemplo do
processo - s precisamos um subconjunto limitado de regras para expressar o padro que
procuramos, ou seja:
^ para o incio do texto
$ para o final do texto
\d para um dgito
+ para indicar que o item anterior deve ser repetido pelo menos uma vez
() para capturar parte do padro
Escrever views separadas para todos os nmeros de post seria muito chato. Com
expresses regulares podemos criar um padro que ir coincidir com a url e extrair o
nmero para ns: ^ post/(\d+) / $ . Vamos aos poucos ver o que estamos fazendo aqui:
^ post / est dizendo ao Django para pegar tudo que tenha post / no incio da url
(logo aps o ^ )
(\d+) significa que haver um nmero (um ou mais dgitos) e que queremos o nmero
capturado e extrado
/ diz para o Django que deve seguir outro /
Urls
73
$ indica o final da URL significando que apenas sequncias terminando com o / iro
corresponder a esse padro
blog.urls
Crie um novo arquivo vazio blog/urls.py . Tudo bem! Adicione estas duas primeiras linhas:
from django.conf.urls import include, url
from . import views
74
urlpatterns = [
url(r'^$', views.post_list),
]
Como voc pode ver, estamos agora atribuindo uma view chamada post_list para ^ $
URL. Essa expresso regular corresponder a ^ (um comeo) seguido por $ (fim) ento somente uma seqncia vazia ir corresponder. E isso correto, porque em
resolvedores de Django url, ' http://127.0.0.1:8000 /' no uma parte da URL. Este padro
ir mostrar o Django que views.post_list o lugar certo para ir, se algum entra em seu
site no endereo 'http://127.0.0.1:8000 /'.
Tudo certo? Abra http://127.0.0.1:8000 no seu navegador pra ver o resultado.
No tem mais "It Works!' mais ein? No se preocupe, s uma pgina de erro, nada a
temer! Elas so na verdade muito teis:
Voc pode ler que no h no attribute 'post_list'. O post_list te lembra alguma coisa? Isto
como chamamos o nosso view! Isso significa que est tudo no lugar, s no criamos
nossa view ainda. No se preocupe, ns chegaremos l.
Se voc quer saber mais sobre Django URLconfs, veja a documentao oficial:
https://docs.djangoproject.com/en/1.8/topics/http/urls/
Urls
75
blog/views.py
OK, vamos abrir o arquivo e ver o que tem nele:
from django.shortcuts import render
# Create your views here.
Como voc pode ver, ns criamos um mtodo ( def ) chamado post_list que aceita o
pedido e retornar um mtodo render ser processado (para montar) nosso modelo
blog/post_list.html .
76
Esta fcil: TemplateDoesNotExist. Vamos corrigir este bug e criar um modelo no prximo
captulo!
Aprenda mais sobre as views do Django lendo a documentao oficial:
https://docs.djangoproject.com/en/1.8/topics/http/views/
77
Introduo a HTML
Voc pode se perguntar: e o que um template?
Um template um arquivo que ns podemos reutilizar para apresentar diferentes
informaes de uma forma consistente. Por exemplo, voc poderia usar um template para
te ajudar a escrever uma carta, pois, embora cada carta possua uma mensagem e um
destino diferente, todas tero sempre o mesmo formato.
O formato do template do Django descrito em uma linguagem chamada HTML (esse o
mesm HTML que mencionamos no primeiro captulo Como a Internet funciona).
O que HTML?
HTML um simples cdigo que interpretado pelo seu navegador web - como o Chrome, o
Firefox ou o Safari - para exibir uma pgina da web para o usurio.
HTML significa "HyperText Markup Language". HiperText significa que um tipo de texto
que suporta hiperlinks entre pginas. Marcao nada mais que marcar um documento
com cdigos que dizem para algum (nesse caso, o navegador web) como a pgina dever
ser interpretada. Cdigo em HTML feito com tags, cada uma comeando com < e
terminando com > . Essas tags marcam os elementos.
Introduo a HTML
78
Acabaram-se os erros! Parabns :) Entretanto, nosso site no mostra nada a no ser uma
pgina em branco. Isso porque o nosso template est vazio. Ento precisamos consertar
isso.
Adicione a seguinte linha dentro do template:
<html>
<p>Hi there!</p>
<p>It works!</p>
</html>
Introduo a HTML
79
um website se encontra entre a tag de incio <html> e entre a tag de fim </html>
<p> a tag que denomina pargrafos; </p> determina o fim de cada pargrafo
Viu como o navegador entendeu que "Ola's blog" o ttulo da pgina? Ele interpretou
<title>Ola's blog</title> e colocou o texto na barra de ttulo do seu navegador (e
Introduo a HTML
80
Provavelmente voc j deve ter notado que cada tag de abertura casa com uma tag de
fechamento, com uma / , e que os elementos esto aninhados (ex.: voc no pode fechar
um tag em particular antes que todas as outras tags que estiverem dentro dela j estejam
fechadas).
como colocar coisas dentro de caixas. Voc tem uma grande caixa, <html></html> ;
dentro dela h <body></body> , sendo que esta ainda contm caixas menors: <p></p> .
Voc precisa seguir essas regras de fechamento de tags, e de aninhamento de elementos se voc no fizer isso, o navegador poder no estar apto para interpretar seu cdigo de
maneira correta e sua pgina ser exibida de maneira incorreta.
essa!
<div></div> define uma seo da pgina
Introduo a HTML
81
<html>
<head>
<title>Django Girls blog</title>
</head>
<body>
<div>
<h1><a href="">Django Girls Blog</a></h1>
</div>
<div>
<p>published: 14.06.2014, 12:14</p>
<h2><a href="">My first post</a></h2>
<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec i
</div>
<div>
<p>published: 14.06.2014, 12:14</p>
<h2><a href="">My second post</a></h2>
<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec i
</div>
</body>
</html>
Introduo a HTML
82
Yaaay! Mas, at agora, nosso template mostra exatamante sempre a mesma informao sendo que, anteriormente, ns falvamos sobre templates como uma maneira para exibir
informaes diferentes em um mesmo formato.
O que ns realmente queremos fazer exibir postagens reais que foram adicionadas no
Django admin - e isso o que faremos em seguida.
Verifique se voc est no diretrio djangogirls e vamos dizer ao git para incluir todas as
mudanas dentro deste diretrio:
$ git add -A .
Introduo a HTML
83
Estamos quase l! Agora hora de dizer a ele para salvar essa modificao em seu
histrico. Ns daremos a ele uma "mensagem de commit" onde ns descrevemos as
modificaes que fizemos. Voc pode escrever o que voc quiser agora, mas ser mais til
se voc escrever alguma coisa mais descritiva, algo para voc poder se lembrar das coisas
que voc fez futuramente.
$ git commit -m "Changed the HTML for the site."
Certifique-se que voc usou aspas duplas para delimitar a mensagem do commit.
Quando fizermos isso, ns fazemos upload (envio) das nossas mudanas para o
PythonAnywhere:
git push
Eveja seu cdigo sendo baixado. Se voc deseja verificar se j chegou, pode ir para a Files
tab e ver seu cdigo no PythonAnywhere.
Finalmente, pule para a Web tab e aperte Reload em seu aplicativo web.
Introduo a HTML
84
Sua atualizao deve estar live! V em frente e atualize seu site no navegador. As
alteraes devem ser visveis :)
Introduo a HTML
85
O que um QuerySet?
Um QuerySet (conjunto de pesquisa), no fundo, uma lista de objetos de um dado modelo.
Um QuerySet permite que voc leia os dados do banco, filtre e ordene o mesmo.
mais fcil aprender por exemplos. Vamos tentar?
O Shell do Django
Abra o terminal e digite:
(myvenv) ~/djangogirls$ python manage.py shell
Agora voc est no console interativo do Django. Ele como o prompt do Python s que
com umas mgicas a mais :). Voc pode usar todos os comandos do Python aqui tambm,
claro.
Todos os objetos
Antes, vamos tentar mostrar todas as nossas postagens. Podemos fazer isso com o
seguinte comando:
>>> Post.objects.all()
Traceback (most recent call last):
File "<console>", line 1, in <module>
NameError: name 'Post' is not defined
86
Oops! Um erro apareceu. Ele nos diz que no existe algo chamado Post. verdade -- ns
esquecemos de import-lo primeiro!
>>> from blog.models import Post
uma lista dos posts que criamos anteriormente! Criamos esses posts usando a interface
de administrao do Django. No entanto, agora queremos criar novas mensagens utilizando
o python, ento como que fazemos isso?
Criando um objeto
assim que voc cria um objeto Post no banco de dados:
>>> Post.objects.create(author=me, title='Sample title', text='Test')
Mas aqui temos um ingrediente que faltava: me . Precisamos passar uma instncia de
User modelo como autor. Como fazer isso?
o superusurio que criamos anteriormente! Vamos obter uma instncia de usurio agora:
me = User.objects.get(username='ola')
Como voc pode ver, ns agora usamos um get a User with a username igual a 'ola'.
Claro, voc tem que adaptar a seu nome de usurio.
Agora finalmente podemos criar nossa primeira postagem:
87
Filtrar objetos
Uma grande parte de QuerySets a habilidade de filtr-los. Digamos que queremos
encontrar todos as postagens escritas pelo usurio ola. Ns usaremos o filter em vez de
all em Post.objects.all() . Entre parnteses indicamos que as condies precisam ser
atendidas por um postagem de blog para acabar em nosso queryset. Em nosso caso
author que igual a me . A maneira de escrever isso no Django : author=me . Agora o
Ou talvez ns queremos ver todos os posts que contenham a palavra 'title' no campo de
title ?
>>> Post.objects.filter(title__contains='title')
[<Post: Sample title>, <Post: 4th title of post>]
88
Infelizmente, nenhum dos nossos posts esto publicados ainda. Ns podemos mudar isso!
Primeiro obtenha uma instncia de um post que queremos publicar:
>>> post = Post.objects.get(id=1)
Agora tente obter a lista de posts publicados novamente (pressione a seta para cima boto
3 vezes e tecle Enter):
>>> Post.objects.filter(published_date__lte=timezone.now())
[<Post: Sample title>]
Ordenando objetos
Um QuerySet tambm nos permite ordenar a lista de objetos. Vamos tentar ordenar as
postagens pelo campo created_date :
>>> Post.objects.order_by('created_date')
[<Post: Sample title>, <Post: Post number 2>, <Post: My 3rd post!>, <Post: 4th title of post>]
Legal! Voc j est pronto para a prxima parte! Para fechar o terminal digite:
>>> exit()
$
89
Django Querysets
Ns temos diferentes peas aqui: o model Post est definido em models.py , ns temos
post_list no views.py e o template adicionado. Mas como ns faremos de fato para
fazer com que as nossas postagens apaream no nosso template em HTML? Porque isso
que ns queremos: pegar algum contedo (models salvos no banco de dados) e exibi-lo de
uma maneira bacana no nosso template, certo?
E isso exatamente o que as views devem fazer: conectar models e templates. Na nossa
view post_list view ns vamos precisar pegar os models que queremos exibir e pass-los
para o template. Ento, basicamente, em uma view ns decidimos o que (um model) ser
exibido no template.
Certo, e como ns faremos isso?
Precisamos abrir o nosso blog/views.py . At agora a view post_list se parece com isso:
from django.shortcuts import render
def post_list(request):
return render(request, 'blog/post_list.html', {})
Lembra quando falamos sobre a incluso de cdigo escrito em arquivos diferentes? Agora
o momento em que temos de incluir o model que temos escrito em models.py . Vamos
adicionar esta linha from .models import Post como este:
from django.shortcuts import render
from .models import Post
O ponto depois de from significa o diretrio atual ou o aplicativo atual. Como views.py e
models.py esto no mesmo diretrio podemos simplesmente usar . e o nome do arquivo
QuerySet
90
Note que criamos uma varivel para nosso o QuerySet: posts . Trate isto como o nome do
nosso QuerySet. De agora em diante ns podemos nos referir a ele por este nome.
A ltima parte que falta passar o QuerySet posts para o template (veremos como exibi-lo
em um prximo captulo).
Na funo render j temos o parmetro request (tudo o que recebemos do usurio
atravs da Internet) e um arquivo de template 'blog/post_list.html' . O ltimo parmetro,
que se parece com isso: {} um lugar em que podemos acrescentar algumas coisas para
que o template use. Precisamos nome-los (ficaremos com 'posts' por enquanto :)). Deve
ficar assim: {'posts': posts} . Observe que a parte antes de : est entre aspas '' .
Ento finalmente nosso arquivo blog/views.py deve se parecer com isto:
from django.shortcuts import render
from django.utils import timezone
from .models import Post
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date'
return render(request, 'blog/post_list.html', {'posts': posts})
91
Se quiser ler mais sobre QuerySets no Django voc deve dar uma olhada aqui:
https://docs.djangoproject.com/en/1.8/ref/models/querysets/
92
Templates
Hora de exibir algum dado! Django nos d tags de templates embutidas bastante teis
para isso.
Templates
93
Isto significa que o Django a entende como uma lista de objetos. Lembre-se de introduo
ao Python como podemos exibir listas? Sim, com os loops! Em um template Django,
fazemos isso da seguinte maneira:
{% for post in posts %}
{{ post }}
{% endfor %}
Funciona! Mas ns queremos que eles sejam exibidos como os posts estticos, como os
que criamos anteriormente no captulo de Introduo a HTML. Ns podemos misturar
HTML com tags de template. O contedo da tag body ficar assim:
<div>
<h1><a href="/">Django Girls Blog</a></h1>
</div>
{% for post in posts %}
<div>
<p>published: {{ post.published_date }}</p>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaks }}</p>
</div>
{% endfor %}
Tudo que voc pe enrte {% for %} e {% endfor %} ser repetido para cada objeto na
lista. Atualize sua pgina:
Templates
94
Voc notou que dessa vez ns usamos uma notao um pouco diferente {{ post.title }}
ou {{ post.text }} ? Ns estamos acessando os dados em cada um dos campos que
definimos no model do Post . Alm disso, |linebreaks est passando o texto do post por
um filtro, convertendo quebras de linha em pargrafos.
Em seguida, faa login em PythonAnywhere e v para seu Bash console (ou comece
um novo) e execute:
` $ cd my-first-blog $ git pull
Templates
95
Finalmente, pule para a Web tab e aperte Reload em seu aplicativo web. Sua
atualizao deve estar live!
Parabns! Agora v em frente e tente adicionar um novo post em seu Django admin
(Lembre-se de adicionar published_date!), em seguida, atualize a pgina para ver se o post
aparece por l.
Funciona como mgica? Estamos orgulhosos! Afaste-se do seu computador um pouco,
voc ganhou uma pausa. :)
Templates
96
O que CSS?
Do ingls "Cascading Style Sheets", CSS uma linguagem usada para descrever o aspecto
e a formatao de um website escrito numa linguagem de marcao (como HTML). Imagine
ele como sendo um tipo de "maquiagem" para nosso site ;).
Mas ns no queremos iniciar do zero de novo, certo? Ns tentaremos, mais uma vez, usar
algo que foi feito e disponibilizado de graa por programadores na internet. Voc sabe,
reinventar a roda no nada divertido.
Instalar Bootstrap
Para instalar o Bootstrap, voc precisa adicionar ao seu cabealho (na tag <head> dentro
do seu arquivo .html )( blog/templates/blog/post_list.html ):
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css"
Isso no adiciona nenhum arquivo ao seu projeto. O cdigo apenas aponta para arquivos
que existem na internet. Apenas siga em frente, abra seu site e atualize a pgina. Aqui ele
est!
97
J parecendo melhor!
98
h1 a um seletor de CSS. Isso significa que ns estamos aplicando nossos estilos para
definem grupos de elementos, e ids apontam para elementos especficos. Por exemplo, a
seguinte tag pode ser identificada por CSS usando a tag de nome a , a classe
link_externo ou a identificao de link_para_a_pagina_wiki :
99
Estamos apenas carregando arquivos estticos aqui :). Depois, entre o <head> e/</head> ,
depois dos links para os arquivos de CSS do Bootstrap (o navegador l os arquivos na
ordem que eles so dados, ento o cdigo em nosso arquivo pode substituir o cdigo em
arquivos de inicializao), adicione esta linha:
<link rel="stylesheet" href="{% static 'css/blog.css' %}">
100
Bom trabalho! Talvez a gente tambm queira dar um pouco de ar ao nosso site e aumentar
a margem do lado esquerdo? Vamos tentar!
body {
padding-left: 15px;
}
Adicione isto ao seu arquivo CSS, salve e veja como ele funciona!
Talvez a gente possa customizar a fonte no nosso cabealho? Cole na seo <head> do
arquivo blog/templates/blog/post_list.html o seguinte:
<link href="http://fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext" rel="stylesheet"
101
Incrvel!
Como mencionado acima, CSS usa o conceito de classes, que basicamente permite que
voc nomeie parte do cdigo HTML e aplique estilos apenas esta parte, sem afetar as
outras. super til se voc tiver duas divs, mas eles esto fazendo algo muito diferente
(como o seu cabealho e seu post), ento voc no quer que eles fiquem parecidos.
V em frente e o nomeie algumas partes do cdigo HTML. Adicione uma classe chamada
de page-header para o div que contm o cabealho, assim:
<div class="page-header">
<h1><a href="/">Django Girls Blog</a></h1>
</div>
E agora, adicione uma classe post em sua div que contm um post de blog.
102
<div class="post">
<p>published: {{ post.published_date }}</p>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaks }}</p>
</div>
103
.page-header {
background-color: #ff9400;
margin-top: 0;
padding: 20px 20px 20px 40px;
}
.page-header h1, .page-header h1 a, .page-header h1 a:visited, .page-header h1 a:active {
color: #ffffff;
font-size: 36pt;
text-decoration: none;
}
.content {
margin-left: 40px;
}
h1, h2, h3, h4 {
font-family: 'Lobster', cursive;
}
.date {
float: right;
color: #828282;
}
.save {
float: right;
}
.post-form textarea, .post-form input {
width: 100%;
}
.top-menu, .top-menu:hover, .top-menu:visited {
color: #ffffff;
float: right;
font-size: 26pt;
margin-right: 20px;
}
.post {
margin-bottom: 70px;
}
.post h1 a, .post h1 a:visited {
color: #000000;
}
Ento envolva o cdigo HTML que exibe as mensagens com declaraes de classes.
Substitua isto:
104
105
De qualquer forma, recomendamos que faa esse curso on-line Codeacademy HTML &
CSS Course como dever de casa ps-workshop para aprender tudo o que voc precisa
saber sobre como tornar seus sites mais bonitos com CSS.
Pronto para o prximo captulo?! :)
106
Estendendo os templates
Outra coisa boa que o Django tem pra voc o template extending. O que isso significa?
Isso significa que voc pode usar as mesmas partes do seu HTML em diferentes pginas
do seu site.
Dessa forma voc no precisa ficar se repetindo em cada arquivo quando quiser usar a
mesma informao/layout. E se voc quiser mudar alguma coisa no precisa fazer isso em
todo template, s uma vez!
Abra-o e copie tudo que est no arquivo post_list.html para base.html , desse jeito:
Estendendo os templates
107
{% load staticfiles %}
<html>
<head>
<title>Django Girls blog</title>
Ento em base.html , substitua todo seu <body> (tudo entre <body> e </body> ) com
isso:
<body>
<div class="page-header">
<h1><a href="/">Django Girls Blog</a></h1>
</div>
<div class="content container">
<div class="row">
<div class="col-md-8">
{% block content %}
{% endblock %}
</div>
</div>
</div>
</body>
Estendendo os templates
108
Basicamente ns substituimos tudo entre {% for post in posts %}{% endfor %} por:
{% block content %}
{% endblock %}
O que isso significa? Voc acabou de criar um block (bloco), que uma tag de template
que te permite inserir HTML neste bloco em outros templates que estendem base.html .
Ns vamos te mostrar como fazer isso j j.
Salve e abra o arquivo blog/templates/blog/post_list.html novamente. Apague
exatamente tudo que no estiver dentro da tag body e apague tambm <div class="pageheader"></div> , de forma que o arquivo fique da seguinte maneira:
Estendendo os templates
109
Estendendo os templates
110
{% extends 'blog/base.html' %}
{% block content %}
{% for post in posts %}
<div class="post">
<div class="date">
{{ post.published_date }}
</div>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaks }}</p>
</div>
{% endfor %}
{% endblock content %}
Queremos ter um link para uma pgina de detalhe no ttulo do post. Vamos transformar <
h1 >< href = "" >{{ post.title }} < /a >< / h1 > em um link:
111
Preste ateno: blog o nome da sua aplicao (o diretrio blog ), views vem do nome
do arquivo views.py e, a ltima parte - post_detail - o nome da view.
Agora quando formos para: http://127.0.0.1:8000/ teremos um erro (como esperado, j que
no temos uma URL ou uma view para post_detail ). Vai se parecer com isso:
URL: http://127.0.0.1:8000/post/1/
Queremos criar uma URL para guiar o Django para a view chamada post_detail , que ir
mostrar um post completo do blog. Adicione a linha url(r'^post/(?P<pk>[0-9]+)/$',
views.post_detail), ao arquivo blog/urls.py . Deve ficar assim:
Parece assustador, mas no se preocupe - vamos explicar ele para voc: - comea com ^
de novo... "o incio" - post / significa apenas que aps o comeo, da URL deve ter a
palavra post e /. At aqui, tudo bem. - (?P<pk>[0-9]+) - essa parte mais complicada. Isso
significa que o Django vai levar tudo que voc colocar aqui e transferir para uma view como
uma varivel chamada pk . [0-9] tambm nos diz que s pode ser um nmero, no uma
letra (tudo entre 0 e 9). + significa que precisa existir um ou mais dgitos. Ento algo como
http://127.0.0.1:8000/post// no vlido, mas http://127.0.0.1:8000/post/1234567890/
112
nos projetos feitos em Django. Mas voc pode dar o nome que quiser s variveis (lembrese: minsculo e _ ao invs de espaos em branco!). Por exemplo em vez de (?P<pk>[09]+) podemos ter uma varivel post_id , ento esta parte ficaria como: (?P<post_id>[09]+) .
Razovel! Vamos atualizar a pgina: http://127.0.0.1:8000 / Boom! Ainda outro erro! Como
esperado!
post_detail view
Desta vez a nossa view recebe um parmetro extra pk . Nossa view precisa peg-la,
certo? Ento vamos definir nossa funo como def post_detail (request, pk): . Observe
que precisamos usar exatamente o mesmo nome que especificamos em urls ( pk ). Omitir
essa varivel errado e resultar em um erro!
Agora queremos receber apenas um post do blog. Para isso podemos usar querysets como
este:
Post.objects.get(pk=pk)
Mas este cdigo tem um problema. Se no houver nenhum Post com a chave primria
( pk ) fornecida teremos um erro horroroso!
113
No queremos isso! Mas, claro, o Django vem com algo que vai lidar com isso para ns:
get_object_or_404 . Caso no haja nenhum Post com o dado pk exibir uma pgina
muito mais agradvel (chamada Page Not Found 404 - pgina no encontrada).
A boa notcia que voc realmente pode criar sua prpria pgina de Page not found e
torn-lo to bonita quanto voc quiser. Mas isso no super importante agora, ento ns
vamos ignor-la.
Ok, hora de adicionar uma view ao nosso arquivo views.py !
Devemos abrir blog/views.py e adicionar o seguinte cdigo:
from django.shortcuts import render, get_object_or_404
114
Funcionou! Mas o que acontece quando voc clica em um link no ttulo do post do blog?
Ah no! Outro erro! Mas ns j sabemos como lidar com isso, n? Precisamos adicionar um
template!
Vamos criar um arquivo em blog/templates/blog chamado post_detail.html .
Ser algo parecido com isto:
115
{% extends 'blog/base.html' %}
{% block content %}
<div class="post">
{% if post.published_date %}
<div class="date">
{{ post.published_date }}
</div>
{% endif %}
<h1>{{ post.title }}</h1>
<p>{{ post.text|linebreaks }}</p>
</div>
{% endblock %}
Mais uma vez estamos estendendo base.html . No bloco de content queremos exibir o
published_date (data de publicao) do post (se houver), ttulo e texto. Mas devemos
discutir algumas coisas importantes, certo?
{% if ... %} ... {% endif %} uma tag de template que podemos usar quando queremos
Yay! Funciona!
116
117
Formulrios
Por ltimo queremos uma forma legal de adicionar e editar as postagens do nosso blog. A
ferramenta de administrao do Django legal, mas ela um pouco difcil de customizar e
de deixar mais bonita. Se usarmos formulrios teremos controle absoluto sobre nossa
interface - podemos fazer qualquer coisa que imaginarmos!
Uma coisa legal do Django que ns podemos tanto criar um formulrio do zero como
podemos criar um ModelForm que salva o resultado do formulrio para um determinado
modelo.
Isso exatamente o que ns queremos fazer: criaremos um formulrio para o nosso
modelo Post .
Assim como toda parte importante do Django, forms tem seu prprio arquivo: forms.py .
Precisamos criar um arquivo com este nome dentro da pasta blog .
blog
forms.py
ao Django que este formulrio um ModelForm (assim o Django pode fazer a mgica pra
gente) - o forms.ModelForm o responsvel por isso.
Segundo, ns temos a classe Meta onde dizemos ao Django qual modelo deveria ser
usado para criar este formulrio ( model = Post ).
Formulrios
118
Formulrios
119
{% load staticfiles %}
<html>
<head>
<title>Django Girls blog</title>
URL
Vamos abrir o arquivo blog/urls.py e escrever:
url(r'^post/new/$', views.post_new, name='post_new'),
Formulrios
120
post_new view
Hora de abrir o arquivo blog/views.py e adicionar as linhas seguintes com o resto das
linhas from :
from .forms import PostForm
e nossa view:
def post_new(request):
form = PostForm()
return render(request, 'blog/post_edit.html', {'form': form})
Para criar um novo formulario Post , ns devemos chamar PostForm() e pass-lo para o
template. Ns iremos voltar para esta view, mas por agora vamos criar rapidamente um
template para o formulrio.
Template(modelos)
Precisamos criar um arquivo post_edit.html na pasta blog/templates/blog . Pra fazer o
formulrio funcionar precisamos de muitas coisas:
Temos que exibir o formulrio. Podemos fazer isso simplesmente com um ``.
A linha acima precisa estar dentro de uma tag HTML form: <form method="POST">...
</form>
Formulrios
121
Formulrios
122
Mas, espere um minuto! Quando voc digita alguma coisa nos campos title e text e
tenta salvar o que acontece?
Nada! Estamos novamente na mesma pgina e nosso texto sumiu... E nenhum post foi
adicionado. Ento o que deu errado?
A resposta : nada. Precisamos trabalhar um pouco mais na nossa view.
Salvando o formulrio
Abra blog/views.py mais uma vez. Atualmente tudo que temos na viso post_new :
def post_new(request):
form = PostForm()
return render(request, 'blog/post_edit.html', {'form': form})
Quando ns enviamos o formulrio, somos trazidos de volta para a mesma viso, mas
desta vez temos mais alguns dados no request , mais especificamente em request.POST
(o nome no tem nada com "post" de blog , tem a ver com o fato de que estamos
"postando" dados). Voc se lembra que no arquivo HTML nossa definio de <form> tem a
Formulrios
123
valor vlido para method GET , mas ns no temos tempo para explicar qual a
diferena).
Ento na nossa view ns temos duas situaes separadas para lidar. A primeira quanto
acessamos a pgina pela primeira vez e queremos um formulrio em branco. E a segunda,
quando ns temos que voltar para a view com todos os dados do formulrio que ns
digitamos. Desse modo, precisamos adicionar uma condio (usaremos if para isso).
if request.method == "POST":
[...]
else:
form = PostForm()
Formulrios
124
Adicione-o logo no incio do seu arquivo. E agora podemos dizer: v para a pgina
post_detail para um recm-criado post.
blog.views.post_detail o nome da view que queremos ir. Lembre-se que essa view
exige uma varivel pk ? Para passar isso nas views usamos pk=post.pk , onde post o
recm-criado blog post.
Ok, ns falamos muito, mas provavelmente queremos ver o que toda a view ir parecer
agora, certo?
def post_new(request):
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect('blog.views.post_detail', pk=post.pk)
else:
form = PostForm()
return render(request, 'blog/post_edit.html', {'form': form})
Validao de formulrios
Agora, ns lhe mostraremos como os frmularios so legais. O post do blog precisa ter os
campos title e text . Em nosso modelo Post no dissemos (em oposio a
published_date ) que esses campos no so necessrios, ento Django, por padro,
Formulrios
125
Django est tomando conta de validar se todos os campos de nosso formulrio esto
corretos. No incrvel?
Como recentemente usamos a interface de administrao do Django o sistema
entende que estamos logados. Existem algumas situaes que poderiam levar a
sermos deslogados do sistema (fechar o navegador, reiniciar banco de dados etc.). Se
voc perceber que erros esto aparecendo ao criar um post que referencia um usurio
que no est logado, v para a pgina admin http://127.0.0.1:8000 e logue novamente.
Isso vai resolver o problema temporariamente. H um ajuste permanente esperando
por voc em lio de casa: adicionar segurana no seu site!, captulo aps o tutorial
principal.
Formulrios
126
Editando o formulrio
Agora sabemos como adicionar um novo formulrio. Mas e se quisermos editar um j
existente? muito semelhante ao que fizemos. Vamos criar algumas coisas importantes
rapidamente (se voc no entender alguma coisa - voc deve perguntar a seu professor ou
veja os captulos anteriores, j cobrimos todas essas etapas anteriormente).
Abra blog/templates/blog/post_detail.html e adicione a linha:
<a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphicon-p
<a class="btn btn-default" href="{% url 'post_edit' pk=post.pk %}"><span class="glyphicon glyphic
</div>
<h1>{{ post.title }}</h1>
<p>{{ post.text|linebreaks }}</p>
{% endblock %}
Formulrios
127
Isso quase exatamente igual a nossa view de post_new , certo? Mas no totalmente.
Primeira coisa: passamos um parmetro extra da url pk . Em seguida: pegamos o modelo
Post que queremos editar com get_object_or_404 (Post, pk=pk) e ento, quando criamos
um formulrio passamos este post como uma instncia , tanto quando salvamos o
formulrio:
form = PostForm(request.POST, instance=post)
como quando ns apenas abrimos um formulrio com este post para editar:
form = PostForm(instance=post)
Ok, vamos testar se funciona! Vamos para a pgina post_detail . Deve haver um boto
editar no canto superior direito:
Formulrios
128
Quando voc clicar nele voc ver o formulrio com a nossa postagem:
Formulrios
129
Se voc precisar de mais informaes sobre formulrios do Django voc deve ler a
documentao: https://docs.djangoproject.com/en/1.8/topics/forms/
Formulrios
130
Domnio
PythonAnywhere te deu um domnio gratuito, mas talvez voc no queira ter ".
pythonanywhere.com" no final da URL do seu blog. Talvez voc queira seu blog apenas
"www.infinite-kitten-pictures.org" ou "www.3d-printed-steam-engine-parts.com" ou
"www.antique-buttons.com" ou "www.mutant-unicornz.net", ou seja o que vai ser.
Aqui vamos falar um pouco sobre onde obter um domnio e como lig-lo a seu aplicativo da
web em PythonAnywhere. No entanto, voc deve saber que a maioria dos domnios custam
dinheiro e PythonAnywere tambm cobra uma taxa mensal para usar seu prprio nome de
domnio -- no muito dinheiro, no total, mas isso provavelmente algo que voc s quer
fazer se voc est realmente comprometido!
Domnio
131
Pode levar alguns minutos para o seu domnio comear a trabalhar, ento seja paciente!
Domnio
132
Domnio
133
134