Você está na página 1de 84

Introduo ao Python e Django

Jos Guilherme Cardoso Tavares zetavares.rib@gmail.com Fevereiro de 2012


1

Orientao a Objetos
Tenta unificar as idias de algoritmos e estruturas de dados atravs do conceito de objeto Polimorfismo o que permite que dois objetos diferentes possam ser usados de forma semelhante

Abstrao o que permite que um objeto seja utilizado sabendo se sobre ele apenas a sua interface Em OO a abstrao tem mais alcance pois um objeto encapsula tanto dados como algoritmos
Herana o que permite construir objetos que so especializaes de outro objeto

PYTHON

Introduo
Criada por Guido van Rossum em 1991 Nome provem do programa de TV Monty Python and the Flying Circus Sintaxe simples e fcil de ser assimilada Linguagem Orientada a objetos com suporte aos paradigmas estrutural e funcional Identao Python livre.

Eric S. Raymond
http://www.catb.org/~esr/ http://www.linuxjournal.com/article/3882

Bruce Eckel Python fits your mind


http://www.artima.com/intv/aboutme.html http://www.mindviewinc.com

Python - http://python.org/ Listas - http://www.python.org/community/lists/ PythonBrasil - http://pythonbrasil.org.br/ Lista - http://br.groups.yahoo.com/group/python-brasil/


http://pt.wikipedia.org/wiki/Python
4

Palestras Interessantes
Utilizando Python no Ensino Superior - O Caso do Instituto Superior Tupy
por Marco Andr Lopes Mendes http://old.pythonbrasil.org.br/2006/sobre-o-evento/materiais/apresentacoes/utilizando-python-ensino-superior.pdf

Algoritmos Genticos em Python


por Fabiano Weimar dos Santos http://old.pythonbrasil.org.br/2007/sobre-o-evento-folder/materiais/3-sabado/AlgoritmosGeneticosEmPython_FabianoWeimar.pdf

Desenvolvimento e Gerenciamento Avanado de Home Pages no CMF e Plone


por Jean Rodrigo Ferrii http://old.pythonbrasil.org.br/2005/sobre-o-evento/apresentacoes/pcb-2005-jean.pdf

Programao Cientfica em Python


por Jos Alexandre Nalon http://old.pythonbrasil.org.br/2007/sobre-o-evento-folder/materiais/2-sexta/ProgramacaoCientificaComPython_Nalon.pdf

Python WTFAQ
por Osvaldo Santana Neto http://old.pythonbrasil.org.br/2007/sobre-o-evento-folder/materiais/2-sexta/PythonWTFAQ_OsvaldoSantana.pdf

InVesalius - Software de Reconstruo 3D de Imagens Mdicas


Por Tatiana Al-Chueyr Pereira Martins http://old.pythonbrasil.org.br/2007/sobre-o-evento-folder/materiais/2-sexta/InVesalius-SoftwareDeReconstrucao3DdeImagens_TatianaAlChueyrPereiraMartins.pdf

Matando o Java e mostrando o Python


Por Osvaldo Santana Net e Rud Sum Tente de Moura http://rudix.org/~ruda/Matando%20Java%20e%20Mostrando%20o%20Python.pdf 5

THE ZEN OF PYTHON Tim Peters


Bonito melhor que feio. Explcito melhor que implcito. Simples melhor que complexo. Complexo melhor que complicado. Plano melhor que aninhado. Esparso melhor que denso. Legibilidade conta. Casos especiais no so especiais o bastante para se quebrar as regras. Embora a simplicidade supere o purismo. Erros nunca deveriam passar silenciosamente. A menos que explicitamente silenciados. Ao encarar a ambigidade, recuse a tentao de adivinhar. Deveria haver uma e preferencialmente Apenas uma maneira bvia de fazer isto. Embora aquela maneira possa no ser bvia primeira vista se voc no for holands. Agora melhor que nunca. Embora nunca, seja muitas vezes melhor que pra j. Se a implementao difcil de explicar, uma m idia. Se a implementao fcil de explicar, pode ser uma boa idia. Namespaces so uma grande ideia vamos fazer mais deles!
6

Quem usa?

http://aisrp.nasa.gov/projects/e529600e.html

http://us.blizzard.com/pt-br/

http://www.canonical.com/

http://www.esri.com/
7

Exemplos
NetworkX - http://networkx.lanl.gov/

Matplotlib - http://matplotlib.sourceforge.net/

IDEs
Eclipse e Netbeans: Feitos em java, pesados e poderosos.
http://www.eclipse.org/ http://netbeans.org/

Pida: escolher entre um editor de textos do prprio projeto ou o Vi para trabalhar com a edio dos arquivos. Ele trabalha com o Gazpacho que um desenhador de telas.
http://pida.co.uk/

Komodo: Essa IDE ideal para desenvolvedores que trabalham com aplicaoes Web. Ela projetada especialmente para esse tipo de desenvolvimento.
http://www.activestate.com/komodo-ide

Vi e Emacs: universo dos Unix. Esse editor muito difcil de se aprender


http://gnu.org/software/emacs/ http://www.vim.org/

TextMate(OS X): extremamente fcil de usar e poderoso e pode ser personalizado atravs de scripts. http://macromates.com/

http://www.python.org.br/wiki/IdesPython

Caractersticas
Alto nvel: Quando voc escreve programas em Python, no h necessidade de se preocupar com detalhes de
baixo nvel tais como manipular a memria utilizada pelo programa

Interpretada: Internamente, Python converte o cdigo-fonte em um formato intermedirio chamado bytecode, o


traduz para a linguagem nativa do seu computador e ento o executa. Tudo isso, na verdade, torna Python muito mais fcil, uma vez que voc no precisa se preocupar com a compilao do programa, certificar-se que as bibliotecas necessrias esto todas linkeditadas e carregadas etc, etc. Isto tambm torna seus programas em Python muito mais portveis, j que voc pode simplesmente copiar seu programa em Python em outro computador e execut-lo!

Dinmica: "Dinmico" quer dizer que ao uma nova varivel, ou um parmetro de uma funo, no preciso
informar qual o seu tipo, nem mesmo defini-la antes de us-la. Basta atribuir um valor a ela quando necessrio.

Fortemente Tipada: No entanto, internamente todo valor baseado em algum tipo de dado, que por sua vez uma classe. Uma vez que um valor atribudo a uma varivel, ela passa a se comportar da forma que a classe daquele valor foi definida para se comportar. Por isso, ela "forte".

Multi-paradigma: Ele roda em Windows, Linux, MacOS, Unix, Solaris e outros sistemas operacionais

10

Caractersticas
Blocos Python usa espaos em branco e indentao para separar blocos de cdigo, como estruturas de controle e de repetio e na declarao de funes. O aumento da indentao indica o incio de um novo bloco, que termina com a diminuio da indentao.A linha que define a estrutura ou declarao terminada por dois-pontos e simboliza que as linhas com mais um nvel de indentao que seguem fazem parte do seu bloco de cdigo. Por conveno a indentao fixada em 4 espaos.
def imprime_dados(nome, idade, genero): print "Nome:", nome print "Idade:", idade print "Genero sexual:", genero

print 4

11

Bibliotecas
http://docs.python.org/library/

Python em uma pgina http://coffeeghost.net/pybat/python_cheatsheet.png


12

Bibliotecas
Funo dir() listar o contedo de mdulos e qualquer outro tipo de objeto. >>> texto = 'string' >>> dir(texto) ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] >>>

Bibliotecas
Funo help() que permite acessar parte da documentacao ofcial do Python e o PyDoc setas do teclado para ir para baixo/cima e aperte `q' para sair >>> help() help> if The ``if`` statement ******************** The ``if`` statement is used for conditional execution:

if_stmt ::= "if" expression ":" suite ( "elif" expression ":" suite )* ["else" ":" suite]
It selects exactly one of the suites by evaluating the expressions one by one until one is found to be true (see section *Boolean operations* for the definition of true and false); then that suite is executed (and no other part of the ``if`` statement is executed or evaluated). If all expressions are false, the suite of the ``else`` clause, if present, is executed. Related help topics: TRUTHVALUE

Tipos e funes
Tipo de uma varivel: A funo embutida type utilizada para descobrir o tipo de uma varivel >>> inteiro = 3 >>> type(inteiro) <type 'int'> >>> texto = 'string' >>> type(texto) <type 'str'> >>> lista = [] >>> type(lista) <type 'list'> Converses: Python disponibiliza algumas funes para que possamos converter um valor de um tipo em outro >>> conversao = "13" >>> type(conversao) <type 'str'> >>> conversao = int(conversao) >>> type(conversao) <type 'int'> >>> conversao = float(conversao) >>> type(conversao) <type 'float'> >>> conversao = [1,2,4] Tamanho de uma varivel: A funo len retorna o tamanho >>> type(conversao) de uma varivel dependendo do seu tipo <type 'list'> >>> texto = 'string' >>> conversao = tuple(conversao) >>> len(texto) >>> type(conversao) 6 <type 'tuple'> >>> lista = [ 1 ,2 ,3 ,4] >>> conversao = 'True' >>> len(lista) >>> conversao = bool(conversao) 4 >>> type(conversao) >>> dicionario = { "a":1,"k":3} <type 'bool'> >>> len(dicionario) 2

15

Tipos e funes
Operadores Aritmticos H sete operadores aritmticos no Python: 1. + Soma 2. - Subtrao 3. * Multiplicao 4. / Diviso 5. // Diviso truncada 6. % Mdulo 7. ** Exponenciao >>> 3 + 5 8 >>> 6 -1 5 >>> 3 * 9 27 >>> 9 / 3 3 >>> 8 // 3 2 >>> 7 % 5 2 >>> 3 ** 4 81

Operadores compostos de atribuio: 1. += Soma e atribui 2. -= Subtrai e atribui 3. *= Multiplica e atribui 4. /= Divide e atribui 5. //= Divide e atribui somente a parte inteira do resultado 6. %= Divide e atribui resto da diviso 7. **= Eleva nmero e atribui >>> op = 1 >>> op += 10 >>> op 11 >>> op /= 5 >>> op 2 >>> op // 2 1 >>> op += 20 >>> op 22 >>> op -= 4 >>> op 18 >>> op **= 2 >>> op 324 >>> op %= 5 >>> op 4 16

Tipos e funes
Operadores lgicos Estrutura IF: verificar o contedo de uma expresso Alm dos operadores matemticos, Python possui lgica operadores lgicos, que retornam sempre um valor (ou booleana) e direcionar o fluxo do programa booleano, ou seja, True ou False. Estes operadores if expressao: so utilizados com freqncia nas estruturas de comandos controle, e laos de repetio, que veremos mais else: adiante. Os operadores lgicos em Python so: comandos 1. > Maior Com elif: Pode-se inserir quantos elifs necessrios 2. < Menor no if, contanto que o else seja nico e o 3. >= Maior ou igual ltimo. Tal recurso adicional do if se deve ao fato de 4. <= Menor ou igual Python no possuir a estrutura switch, 5. == Igual comum s linguagens derivadas da linguagem C, 6. not como C++, Java, PHP e C#. 7. != if expressao: 8. and comandos 9. or elif: comandos else: comandos

17

Tipos e funes
Estrutura FOR: O lao for adequado para o primeiro caso, quando se sabe quantas vezes ir repetir um bloco de cdigo. Ele exige uma lista. FOR com String: >>> strings = "abcdef" >>> for s in strings: print s a b c d e f FOR com range: >>> for s in range(0,7): print s 0 1 2 3 4 5 6 >>> for s in range(0,10,3): print s 0 3 6 9

FOR com dicionario: >>> dicionario = {'for':'pop' , 'loop':'p'} >>> for k,v in dicionario.items(): print k, v loop p for pop

FOR com lista: >>> lista = ['carro' , 'bola', 'gato'] >>> for l in lista: print l carro bola gato

18

Tipos e funes
Estrutura WHILE: Um while segue, essencialmente a mesma lgica de outras linguagens >>> contador = 3 >>> while contador > 0: print contador contador = contador - 1 Continue Tambm pode ser utilizado tanto no lao for quanto while. O continue faz com que controle passe para o incio do lao. >>> for l in 'abcd: if l == 'b: continue print l a b c d

3 2 1

Break Pode ser utilizado tanto em um lao for quanto while. O comando break, assim como na linguagem C e derivadas, Pass quebra um lao. O pass, na verdade, no um comando de controle de laos, >>> contador = 0 o pass no faz exatamente nada, e utilizado quando >>> while contador < 10: uma expresso sintaticamente necessria, mas o if contador == 4: programa no precisa de nenhuma ao. break else: print contador contador += 1 0 1 2 19 3

Tipos e funes
Nmeros Pode-se digitar uma expresso e o valor resultando ser apresentado aps a avaliao da expresso. A sintaxe da expresso a usual: operadores +, -, * e / funcionam da mesma forma que em outras linguagens tradicionais (por exemplo, Pascal ou C); parnteses podem ser usados para denir agrupamentos. >>> 3+6 9 >>> (50-12*2)/3 8 >>> 7/3 2 >>> 8/-3 -3 >>> 5*9 45 Atribuio feita com =: >>> altura = 9 >>> largura = 15 >>> altura * largura 135 >>> altura , largura = 12 , 45 >>> altura * largura 540 Ha total suporte para ponto-utuante >>> 4 * 3.8 15.2 >>> 4 * 3.8 /2 7.6 >>> 7.0 / 2 3.5 Nmeros complexos tambm so suportados, e nmeros imaginrios so escritos com o suxo j ou J. Nmeros complexos com parte real no nula so escritos como (real+imagj), ou podem ser criados pela chamada de funo complex(real, imag). >>> 1j * 1J (-1+0j) >>> 1j * complex(0,1) (-1+0j) >>> 3 + 1j * 3 (3+3j) >>> (1 + 2j) / ( 1 + 1j) (1.5+0.5j)

20

Strings
Strings so seqncias de caracteres, sejam eles letras, nmeros, espaos, caracteres especiais, e etc., e so imutveis. Strings podem ser delimitadas por aspas simples, duplas ou triplas, sendo que estas devem ser idnticas na abertura e fechamento, ou seja, quando se abre uma string com aspas duplas, deve-se fechar com aspas duplas e podemos inserir aspas-duplas em strings delimitadas por aspas simples e vice-versa. Seqncias de escape \n Nova linha. Move o cursor para o incio da prxima linha \t Tabulao horizontal \r Retorno de carro. Move o cursor para o incio da linha atual \b Backspace. Retrocede o cursor um caractere \a Alerta. Emite um alerta (beep) \\ Barra invertida. Escapa o caractere \ \" Aspas duplas. Escapa o caractere " \' Aspa simples. Escapa o caractere
>>> strings = 'isso e uma string' >>> strings 'isso e uma string' >>> strings = "com aspas duplas" >>> strings 'com aspas duplas' >>> strings = """com aspas triplas""" >>> strings 'com aspas triplas' >>> strings = 'concatenar strings ' + 'e facil' >>> strings 'concatenar strings e facil >>> strings = 'exemplo do uso de slicing' >>> strings[4] 'p >>> strings[1:8] 'xemplo >>> strings[:5] 'exemp' >>> strings[6:] 'o do uso de slicing' >>> strings = '\" com aspas duplas \"' >>> strings '" com aspas duplas "' >>> print 'nova \n linha' nova linha >>> print 'tabulando\t309\ntabela\t19109' tabulando 309 tabela 19109

21

Strings
Formatao: pelo menos 3 maneiras de fazer uma interpolao de strings. Interpolao por posio: O primeiro mtodo um dos mais populares e tem origem na linguagem C.Como vimos, para formatar strings dessa maneira utilizamos o operador % associado de um dos smbolos existentes no Python. %s String (converte objeto utilizando a funo str) %r String (converte objeto utilizando a funo repr) %i ou %d Nmeros inteiros %o Nmeros octais %h Nmeros hexadecimais %f Nmeros reais (ou floats) %e Nmeros reais exponenciais %% Sinal de porcentagem)

>>> numerousp , aluno = 4350544 , 'Renato' >>> final = 'O aluno %s possui nro Usp igual a %s' % (aluno,numerousp) >>> final 'O aluno Renato possui nro Usp igual a 4350544' >>> final = 'O aluno ' + aluno + 'possui nro Usp igual a ' + str(numerousp) >>> final 'O aluno Renatopossui nro Usp igual a 4350544' >>> final = 'numero decimal pi e igual a %.5f' % 3.1458347 >>> final 'numero decimal pi e igual a 3.14583

Por palavra-chave: Ao invs de passarmos os valores atravs de uma tupla para o operador %, utilizamos um dicionrio, onde a chave corresponde ao placeholder na string a ser formatada, e que os smbolos utilizados para formatar strings no primeiro mtodo tambm devem ser utilizados nesse, aps o fechamento dos parnteses.
>>> numerousp , aluno = 4350544 , 'Renato' >>> final = 'O aluno %(aluno)s possui nro Usp igual a %(numerousp)d' % {'aluno': aluno, 'numerousp': numerousp} >>> final 'O aluno Renato possui nro Usp igual a 4350544'

22

Strings
format: Consiste em definir placeholders, que podem ser tanto numricos (por posio) quanto por palavra-chave, entre um par de chaves ( { } ). Diferentemente dos mtodos de formatao anteriores, no precisamos obrigatoriamente inserir o smbolo que corresponde ao tipo do valor que ir substituir cada placeholder na string, os tipos possuem smbolos de formatao default. Para strings: 's' String default para strings Para inteiros: 'd' Nmeros inteiros decimais (base 10) default para inteiros 'b' Nmero inteiro binrio (base 2) 'o' Nmeros inteiros octais (base 8) 'x' Nmeros inteiros hexadecimais (base 16) utilizando letras minsculas para dgitos superiores a 9 (de A a F) 'X' Nmeros inteiros hexadecimais (base 16) utilizando letras maisculas para dgitos superiores a 9 'n' Nmero. O mesmo que 'd', exceto que utiliza as configuraes de localizao para inserir os separadores apropriados de casas decimais 'c' Caracter. Converte o inteiro para o caractere Unicode correspondente antes de imprimir. Para floats e decimais: 'e' Notao exponencial. Imprime o nmero em notao cientfica utilizando a letra e para indicar o expoente 'E' Notao exponencial. O mesmo que e exceto que utiliza a letra E para indicar o expoente 'f' ou 'F' Nmeros reais (ou floats) '%' Porcentagem. Multiplica o nmero por 100 e exibe no formato 'f seguido de um sinal de porcentagem.

>>> strings = 'O aluno {0} possui numerousp de {1}' >>> strings.format(aluno,numerousp) 'O aluno Renato possui numerousp de 4350544' >>> strings = 'O aluno {aluno} possui numerousp de {numerousp}' >>> strings.format(aluno=aluno , numerousp=numerousp) 'O aluno Renato possui numerousp de 4350544'

23

Strings
Funes capitalize(): Retorna uma cpia da string com o primeiro caractere maisculo. upper(): Retorna uma cpia da string com todos os caracteres maisculos. lower(): Retorna uma cpia da string com todos os caracteres minsculos strip(): Retorna uma cpia da string com os espaos em branco antes e depois removidos. startswith(prefixo): Retorna True se uma string comea com o prefixo passado por
>>> strings = ' teste funcoes ' >>> strings.strip() 'teste funcoes >>> strings = 'teste funcoes >>> strings.capitalize() 'Teste funcoes' >>> strings.upper() 'TESTE FUNCOES >>> strings.startswith('teste') True >>> strings.replace('te','dado') 'dadosdado funcoes >>> strings.split(' ') ['teste', 'funcoes'] >>> strings.find('f') 6 >>> strings.find('f',1,5) -1

http://docs.python.org/library/stdtypes.html#string-methods.

24

Listas
Uma lista um conjunto linear de valores indexados por um nmero inteiro, chamado de ndice, que se inicia em 0 (zero). Os elementos contidos em uma lista podem ser de qualquer tipo, at mesmo outras listas e no precisam ser todos do mesmo tipo. Uma lista delimitada por colchetes, e seus elementos separados por vrgulas.Listas constituem o tipo de agregao de dados mais verstil e comum da linguagem Python count(elemento): Retorna quantas ocorrncias de um elemento existe na lista. index(elemento): Retorna primeiro ndice de elemento na lista. Aciona exceo ValueError caso valor no exista append(elemento): Insere elemento no final da lista. insert(index, elemento): Insere elemento no ndice passado por argumento. remove(elemento): Remove primeira ocorrncia do valor especificado por argumento. pop(): Remove elemento da lista e o retorna. O mtodo pop aceita o argumento index, caso um ndice no seja especificado, o ltimo elemento da lista removido. sort(): Ordena a lista. O mtodo sort aceita o parmetro reverse, que possibilita que a ordenao seja crescente ou decrescente. Caso esse argumento no seja especificado a ordenao feita em ordem crescente.

25

Listas
Atribuies Simples >>> lista = [] >>> lista = [1,2] >>> lista = [1,'a',[1,2,3]] >>> lista[0] 1 >>> lista[-1] [1, 2, 3] >>> lista[0] = 'change' >>> lista ['change', 'a', [1, 2, 3]] >>> lista[2] = [2,'o','p',12] >>> lista ['change', 'a', [2, 'o', 'p', 12]] Concatenao de Listas >>> lista = [0]*4 >>> lista [0, 0, 0, 0] >>> lista = lista + [2]*5 >>> lista [0, 0, 0, 0, 2, 2, 2, 2, 2] DEL >>> lista = [1,2,[4,'pop'],4,['i','o','k',3],6] >>> del lista [1] >>> lista [1, [4, 'pop'], 4, ['i', 'o', 'k', 3], 6] >>> del lista [3][0] >>> lista [1, [4, 'pop'], 4, ['o', 'k', 3], 6]

Slices >>> lista [1, [4, 'pop'], 4, ['o', 'k', 3], 6] >>> lista[1:] [[4, 'pop'], 4, ['o', 'k', 3], 6] >>> lista[:1] [1] >>> lista[2:4] [4, ['o', 'k', 3]] >>> lista[2:-1] [4, ['o', 'k', 3]] atribuicao(string/lista) >>> lista[:3] = 'abc' >>> lista ['a', 'b', 'c', ['o', 'k', 3], 6] >>> lista[:2] = [1,3,4,'oi'] >>> lista [1, 3, 4, 'oi', 'c', ['o', 'k', 3], 6] IN Uso 'IN' >>> lista = ['o',1,2,3,'usp'] >>> 'o' in lista True >>> 1 in lista True >>> 5 in lista False >>> 's' in lista[-1] True >>> 'py' in 'python' True

Mtodos >>> lista = [1,2,3,4,3,2,5,6,1,1] >>> lista.append(3) >>> lista [1, 2, 3, 4, 3, 2, 5, 6, 1, 1, 3] >>> lista.count(1) 3 >>> lista.extend([2,3]) >>> lista [1, 2, 3, 4, 3, 2, 5, 6, 1, 1, 3, 2, 3] >>> lista.index(3) 2 >>> lista.insert(2,9) >>> lista [1, 2, 9, 3, 4, 3, 2, 5, 6, 1, 1, 3, 2, 3] >>> lista.pop() 3 >>> lista.pop(4) 4 >>> lista [1, 2, 9, 3, 3, 2, 5, 6, 1, 1, 3, 2] >>> lista.remove(3) >>> lista [1, 2, 9, 3, 2, 5, 6, 1, 1, 3, 2] >>> lista.reverse() >>> lista [2, 3, 1, 1, 6, 5, 2, 3, 9, 2, 1] >>> lista.sort() >>> lista [1, 1, 1, 2, 2, 2, 3, 3, 5, 6, 9] >>> lista.sort(reverse=True) >>> lista [9, 6, 5, 3, 3, 2, 2, 2, 1, 1, 1]

26

Listas
Atribuies Simples >>> lista = [] >>> lista = [1,2] >>> lista = [1,'a',[1,2,3]] >>> lista[0] 1 >>> lista[-1] [1, 2, 3] >>> lista[0] = 'change' >>> lista ['change', 'a', [1, 2, 3]] >>> lista[2] = [2,'o','p',12] >>> lista ['change', 'a', [2, 'o', 'p', 12]] Concatenao de Listas >>> lista = [0]*4 >>> lista [0, 0, 0, 0] >>> lista = lista + [2]*5 >>> lista [0, 0, 0, 0, 2, 2, 2, 2, 2] DEL >>> lista = [1,2,[4,'pop'],4,['i','o','k',3],6] >>> del lista [1] >>> lista [1, [4, 'pop'], 4, ['i', 'o', 'k', 3], 6] >>> del lista [3][0] >>> lista [1, [4, 'pop'], 4, ['o', 'k', 3], 6]

Slices >>> lista [1, [4, 'pop'], 4, ['o', 'k', 3], 6] >>> lista[1:] [[4, 'pop'], 4, ['o', 'k', 3], 6] >>> lista[:1] [1] >>> lista[2:4] [4, ['o', 'k', 3]] >>> lista[2:-1] [4, ['o', 'k', 3]] atribuicao(string/lista) >>> lista[:3] = 'abc' >>> lista ['a', 'b', 'c', ['o', 'k', 3], 6] >>> lista[:2] = [1,3,4,'oi'] >>> lista [1, 3, 4, 'oi', 'c', ['o', 'k', 3], 6] IN Uso 'IN' >>> lista = ['o',1,2,3,'usp'] >>> 'o' in lista True >>> 1 in lista True >>> 5 in lista False >>> 's' in lista[-1] True >>> 'py' in 'python' True

Mtodos >>> lista = [1,2,3,4,3,2,5,6,1,1] >>> lista.append(3) >>> lista [1, 2, 3, 4, 3, 2, 5, 6, 1, 1, 3] >>> lista.count(1) 3 >>> lista.extend([2,3]) >>> lista [1, 2, 3, 4, 3, 2, 5, 6, 1, 1, 3, 2, 3] >>> lista.index(3) 2 >>> lista.insert(2,9) >>> lista [1, 2, 9, 3, 4, 3, 2, 5, 6, 1, 1, 3, 2, 3] >>> lista.pop() 3 >>> lista.pop(4) 4 >>> lista [1, 2, 9, 3, 3, 2, 5, 6, 1, 1, 3, 2] >>> lista.remove(3) >>> lista [1, 2, 9, 3, 2, 5, 6, 1, 1, 3, 2] >>> lista.reverse() >>> lista [2, 3, 1, 1, 6, 5, 2, 3, 9, 2, 1] >>> lista.sort() >>> lista [1, 1, 1, 2, 2, 2, 3, 3, 5, 6, 9] >>> lista.sort(reverse=True) >>> lista [9, 6, 5, 3, 3, 2, 2, 2, 1, 1, 1]

27

Tuplas
Seqncia finita de objetos, anloga as listas porem sao imutveis, tendo seus elementos estaticos. Tuplas possuem dois mtodos idnticos ao das listas: index e count. O restante dos mtodos de listas realiza modificaes nos valores, e como tuplas so imutveis, no suportam tais operaes >>> tupla = (1) >>> tupla 1 >>> tupla = (1,) >>> tupla (1,) >>> tupla = (1,2,5,6,2) >>> tupla (1, 2, 5, 6, 2) >>> tupla[0] 1 >>> tupla[1:3] (2, 5) >>> tupla = ([2,3,4],'p',2) >>> tupla[0].append(1) >>> tupla ([2, 3, 4, 1], 'p', 2)

http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences

28

Tuplas
Seqncia finita de objetos, anloga as listas porem sao imutveis, tendo seus elementos estaticos. Tuplas possuem dois mtodos idnticos ao das listas: index e count. O restante dos mtodos de listas realiza modificaes nos valores, e como tuplas so imutveis, no suportam tais operaes >>> tupla = (1) >>> tupla 1 >>> tupla = (1,) >>> tupla (1,) >>> tupla = (1,2,5,6,2) >>> tupla (1, 2, 5, 6, 2) >>> tupla[0] 1 >>> tupla[1:3] (2, 5) >>> tupla = ([2,3,4],'p',2) >>> tupla[0].append(1) >>> tupla ([2, 3, 4, 1], 'p', 2)

http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences

29

Dicionrios
Um dicionrio uma coleo de elementos onde possvel utilizar como ndice qualquer tipo imutvel, como strings, tuplas e tipos numricos. O termo normalmente utilizado para descrever essa associao entre ndice e elemento key / value ou chave / valor.Dicionriosso definidos entre chaves ( { e } ), as keys separadas dos values por dois pontos ( : ) e os pares de keys e values separados por vrgulas.
keys(): Retorna uma lista das chaves de um dicionrio. values(): Retorna uma lista dos valores de um dicionrio. items(): Retorna uma lista contendo os pares de chaves e valores em formas de tuplas. has_key(chave): Retorna True caso chave exista em um dicionrio e False caso contrrio

30

Dicionrios
>>> dicionario = { 'nome': 'Fabio' , 'idade': 23} >>> dicionario {'idade': 23, 'nome': 'Fabio'} >>> dicionario['telefone'] = '(16) 8271 8228' >>> dicionario {'idade': 23, 'telefone': '(16) 8271 8228', 'nome': 'Fabio'} >>> del dicionario['idade'] >>> dicionario {'telefone': '(16) 8271 8228', 'nome': 'Fabio'} >>> dicionario = dict([(1,'op'),(2,'op2')]) >>> dicionario {1: 'op', 2: 'op2'} >>> dicionario[1] 'op' >>> dicionario = {'python':'bom','pearl':'what','java':'heyy'} >>> dicionario {'python': 'bom', 'pearl': 'what', 'java': 'heyy'} >>> d = dicionario.copy() >>> d {'python': 'bom', 'pearl': 'what', 'java': 'heyy'} >>> d.clear() >>> d {} >>> dicionario {'python': 'bom', 'pearl': 'what', 'java': 'heyy'} >>> dicionario.get('java') 'heyy' >>> dicionario.has_key('python') True >>> dicionario.has_key('ruby') False >>> dicionario.items() [('python', 'bom'), ('pearl', 'what'), ('java', 'heyy')] >>> dicionario.keys() ['python', 'pearl', 'java'] >>> dicionario.values() ['bom', 'what', 'heyy'] >>> dicionario.update({'html':'sorry','css':'wtf'}) >>> dicionario {'python': 'bom', 'pearl': 'what', 'html': 'sorry', 'java': 'heyy', 'css': 'wtf' } >>> dicionario.pop('pearl') 'what' >>> dicionario {'python': 'bom', 'html': 'sorry', 'java': 'heyy', 'css': 'wtf'} >>> dicionario.popitem() ('python', 'bom') >>> dicionario {'html': 'sorry', 'java': 'heyy', 'css': 'wtf'}
31

Dicionrios
>>> dicionario = { 'nome': 'Fabio' , 'idade': 23} >>> dicionario {'idade': 23, 'nome': 'Fabio'} >>> dicionario['telefone'] = '(16) 8271 8228' >>> dicionario {'idade': 23, 'telefone': '(16) 8271 8228', 'nome': 'Fabio'} >>> del dicionario['idade'] >>> dicionario {'telefone': '(16) 8271 8228', 'nome': 'Fabio'} >>> dicionario = dict([(1,'op'),(2,'op2')]) >>> dicionario {1: 'op', 2: 'op2'} >>> dicionario[1] 'op' >>> dicionario = {'python':'bom','pearl':'what','java':'heyy'} >>> dicionario {'python': 'bom', 'pearl': 'what', 'java': 'heyy'} >>> d = dicionario.copy() >>> d {'python': 'bom', 'pearl': 'what', 'java': 'heyy'} >>> d.clear() >>> d {} >>> dicionario {'python': 'bom', 'pearl': 'what', 'java': 'heyy'} >>> dicionario.get('java') 'heyy' >>> dicionario.has_key('python') True >>> dicionario.has_key('ruby') False >>> dicionario.items() [('python', 'bom'), ('pearl', 'what'), ('java', 'heyy')] >>> dicionario.keys() ['python', 'pearl', 'java'] >>> dicionario.values() ['bom', 'what', 'heyy'] >>> dicionario.update({'html':'sorry','css':'wtf'}) >>> dicionario {'python': 'bom', 'pearl': 'what', 'html': 'sorry', 'java': 'heyy', 'css': 'wtf' } >>> dicionario.pop('pearl') 'what' >>> dicionario {'python': 'bom', 'html': 'sorry', 'java': 'heyy', 'css': 'wtf'} >>> dicionario.popitem() ('python', 'bom') >>> dicionario {'html': 'sorry', 'java': 'heyy', 'css': 'wtf'}
32

Definindo Funes
def: o comando def define a criacao de funcoes em python, e os parametros podem ser especificados como param(nome variavel loca que recebera o valor) e param=valor(valor assumido como default em caso de no passado nenhum valor por parametro). def nome (arg, arg, ... arg): comandos >>> def funcao(param): print 'O parametro foi %s' % param >>> funcao('valor de variavel') O parametro foi valor de variavel >>> def funcao(param='default'): print 'O valor da funcao e %s' % param >>> funcao() O valor da funcao e default >>> funcao(1) O valor da funcao e 1 return: retorna um valor de uma funo, caso no exista o comando, retornar None como default. return valor >>> def funcao(): return >>> print funcao() None >>> def funcao(nro): return nro * 5 >>> print funcao(3) 15 >>> def funcao(): return 12,45 >>> a,b = funcao() >>> a 12 >>> b 45

33

Classes e Mtodos
Uma classe pode ser entendida como uma fbrica de objetos, todos com as mesmas caractersticas, sendo o objeto uma instancia da classe.Sendo ela prpria um objeto. Mtodos possuem um self como primeiro argumento pois se refere a uma instncia da classe Varivel var1 definida num classe nome como nome.var1 e mtodo nome.metodo(..) class nome: var1 = valor var2 = valor2 .... varn = valorn def metodo(self, arg...): comandos
>>> class Aluno(object): def __init__(self,nome,matricula,sexo): self.nome = nome self.matricula = matricula self.sexo = sexo def descricao(self): return 'O Aluno %s de matricula %s e sexo %s, esta ativo no sistema' % (self.nome,self.matricula,self.sexo) >>> aluno = Aluno('Pato Donald','30393-op-1','Masculino') >>> aluno.matricula '30393-op-1 >>> aluno.descricao() 'O Aluno Pato Donald de matricula 30393-op-1 e sexo Masculino, esta ativo no sistema' Herana: Para fazer uma classe A herdar de outra B, basta declarar A como: class A(B): .... >>> class Ti(Aluno): def __init__(self,nome,matricula,sexo,pc,qi): super(Ti, self).__init__(nome,matricula,sexo) self.pc = pc self.qi = qi

>>> aluno = Ti('Pato Donald','30393-op1','Masculino','MAC-OS 6GB',150) >>> aluno.descricao() 'O Aluno Pato Donald de matricula 30393-op-1 e sexo Masculino, esta ativo no sistema' >>> aluno.qi 150

34

Excees
Uma exceo um evento que ocorre durante a execuo de um programa e interrompe o fluxo normal das suas instrues e exibe uma mensagem de traceback. Try / Except As instrues try e except permitem o tratamento de excees no Python. Se uma exceo ocorre dentro de um bloco try, ela deve ser manipulada atravs de uma instruo except adequada. try: print 1 / 0 except ZeroDivisionError: print "Erro ao dividir por zero Finally A instruo finally acionada sempre no final de um bloco try / except, caso uma exceo seja acionada ou no. comumente utilizada para liberar recursos, como arquivos, conexes de bancos de dados e de rede try: arquivo = open(r"C:/arquivo.txt", "w") try: arquivo.write("Linha 1\n"); except: print "Erro ao escrever no arquivo! except IOError: print "Erro ao abrir o arquivo! finally: arquivo.close()
35

Mdulos Python
Mdulos nada mais so do que arquivos-fonte que podem ser importados para um programa e so utilizados quando desejamos utilizar atributos (funes, objetos, classes, etc.) j definidos, em nossos programas. Um mdulo executado quando importado, e compilado e armazenado com extenso .pyc ou .pyo quando importado pela primeira vez.A biblioteca padro do Python inclui um nmero muito grande de mdulos j prontos e compilados. Um mdulo pode ser importado dentro de outro mdulo ou dentro do prprio interpretador interativo do Python para se ter acesso ao que foi definido dentro do arquivo. A instruo bsica para manipular mdulos import. O mdulo deve estar no caminho de procura de mdulos do interpretador.
>>> import os >>> print os.getcwd() C:\Python27 O mdulo os define algumas funes internamente. Existe uma segunda forma do comando import que funciona de forma diferente. Ao invs de importar o mdulo inteiro, o que nos obriga a usar as funes prefixadas pelo nome do mdulo, este formato importa um atributo do mdulo, deixando-o acessvel localmente: >>> from os import getcwd >>> print getcwd() C:\Python27
36

DJANGO

37

Filosofias
Django um framework web de alto nvel escrito em Python que estimula o desenvolvimento rpido e limpo
Desenvolvimento rpido: O ponto forte de um framework Web no sculo 21 tornar rpido os aspectos tediosos do desenvolvimento Web. O Django deve permitir um desenvolvimento Web incrivelmente rpido. Dont repeat yourself: Cada conceito distinto e/ou poro de dado deve existir em um, e somente em um, lugar. Redundncia ruim. Normalizao bom. O framework, dentro do possvel, deve deduzir o mximo do menor nmero de informao possvel. Menos cdigo: Aplicaes Django devem utilizar o menor cdigo possvel; elas devem possuir pouco cdigo boilerplate (cdigos repetitivos). O Django deve tirar pleno proveito das capacidades dinmicas do Python, tais como a introspeco. Acoplamento Fraco: As vrias camadas do framework no devem se conhecer a menos que seja absolutamente necessrio. Consistncia: O framework deve ser consistente em todos os nveis. Consistncia aplica-se em tudo, do baixo-nvel (o estilo de cdigo Python utilizado) ao alto-nvel (a experincia de uso do Django).

https://www.djangoproject.com/

38

Quem usa?

http://www.canonical.com/

http://www.washingtonpost.com/

http://www.nationalgeographic.com/

http://disqus.com/

http://nebula.nasa.gov/services/framework/

http://www.djangosites.org

39

Clientes

40

Possibilidade de contato por email

Mdulo administrador para gerencia de contedo

Pgina de Home com descrio pessoal!

Blog aberto para visitantes!

41

Iniciando o Django
Aps a instalao, colocar ';C:\Python27\Lib\site-packages\django\bin' nas variveis de ambiente do Windows Diretorio de Trabalho: aceita qualquer diretrio, porm a organizao ajuda muito. sites/ chef/ E no diretorio chef, crie um diretrio de nome static e execute o primeiro comando Django para a criao da aplicao de nome 'app': django-admin.py startproject app E crie diretrios dentro de app, de nomes templates e media.Resultando, sites/ chef/ app/ __init__.py manage.py settings.py urls.py media/ templates/ static/ No diretrio app, teste a aplicao Django; python manage.py runserver

42

Configuraes Iniciais
Configurando arquivo settings.py: Banco de Dados import os PROJECT_DIR = os.path.dirname(__file__) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(PROJECT_DIR, 'chef.db'), 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', } } Caractersticas do Site TIME_ZONE = 'America/Sao_Paulo LANGUAGE_CODE = 'pt-br' Gerencia de Arquivos Estticos MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media') MEDIA_URL = '/media/' STATIC_ROOT = os.path.join(PROJECT_DIR, 'static') STATIC_URL = '/static/ STATICFILES_DIRS = ( os.path.join(PROJECT_DIR, '../static'), ) Templates TEMPLATE_DIRS = ( os.path.join(PROJECT_DIR, 'templates'), ) Admin INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles, 'django.contrib.admin', ) Configurando urls.py from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), )

43

Iniciando BD e Admin
Admin j est no projeto porm sem as tabelas no banco de dados, e assim no consegue operar. Tentamos a url: 127.0.0.1:8000/admin/ You just installed Django's auth system, which means you don't have any superuse rs defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'gui'): gui E-mail address: gui@wqti.com.br Password: Password (again): Superuser created successfully. Installing custom SQL ... Installing indexes ... No fixtures found. Novamente na url: 127.0.0.1:8000/admin/

Criao do banco de dados configurado em settings.py. $python manage.py syncdb Creating tables ... Creating table auth_permission Creating table auth_group_permissions Creating table auth_group Creating table auth_user_user_permissions Creating table auth_user_groups Creating table auth_user Creating table auth_message Creating table django_content_type Creating table django_session Creating table django_site Creating table django_admin_log

44

Pensando no Projeto
Foram necessrios no projeto, 3 mdulos de aplicaes.
Blog

CORE

Restaurantes

Criando as aplicaes no projeto.Dentro de app python manage.py startapp core python manage.py startapp restaurants python manage.py startapp blogs Dentro de cada aplicao existe uma estrutura criada pelo django. core/ __init__.py models.py tests.py views.py

Para o projeto reconhecer as aplicaes feitas devem ser adicionadas no arquivo settings.py. INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles, 'django.contrib.admin', core', restaurants', blogs', )

45

Models
Explcito melhor que implcito: Os campos no devem assumir certos comportamentos baseado unicamente no nome do campo. Isto exige muito conhecimento do sistema e propenso a erros. Ao invs disso, os comportamentos devem ser baseados em argumentos com palavras-chave (keyword arguments) e, em alguns casos, sobre o tipo do campo.

Incluir toda lgica de domnio relevante: Modelos devem encapsular todo aspecto de um objeto. por este motivo que tanto os dados representados por um modelo e a informao sobre o mesmo (seu nome legvel por humanos, opes como ordenao padro, etc.), so definidos em uma classe de modelo; todas as informaes necessrias para compreender um determinado modelo deve ser armazenado no modelo.
Um modelo a fonte nica e definitiva de dados sobre os seus dados. Ele contm os campos e comportamentos essenciais dos dados que voc est gravando. Geralmente, cada modelo mapeia para uma nica tabela no banco de dados e estende django.db.models.Model e cada atributo do modelo representa uma coluna do banco de dados. Em caso de no especificao de chave primaria o django criara a chave primary_key no padrao. id = models.AutoField(primary_key=True)

http://docs.djangobrasil.org/topics/db/models.html

46

Models
Tipos de campos
AutoField: IntegerField com valor com incremento automtico. BooleanField:Um campo Verdadeiro/Falso.Sendo representado por um checkbox. FileField: Um campo para upload de arquivo. Com um argumento obrigatrio o upload_to. ImageField: Semelhante ao FileField mas verifica se o objeto enviado uma imagem vlida.Requer a Python Imaging Library. IntegerField: Um campo como inteiro. A administrao representa-o como um <input type="text">

CharField: Um campo string, para campos texto de tamanhos TextField: Um campo de texto longo.Representado como pequeno e mdio.Representado como uma <textarea>. um <input type="text"> , o tamanho mximo do campo representado com o max_length obrigatrio. ForeignKey: Uma relao muitos-para-um. Requer um argumento posicional: a classe com a qual o model est DateField: Representada por uma relacionada. Use models.ForeignKey('self') para instncia datetime.date do Python. Representado como um <input type="text"> com um calendrio JavaScript, e um relacionamentos recursivos atalho para today" . DateTimeField: Representada por uma instncia datetime.datetime do Python Representado como um <input type="text"> com um calendrio JavaScript, e um atalho para today". ManyToManyField: Um relacionamento muitos-para-muitos. Requer um argumento posicional: a classe com a qual o model se relaciona. Isso funciona exatamente da mesma forma como um Foreign com todas as opes em relao a relacionamentos.

EmailField: Um CharField que verifica se o valor um e-mail OneToOneField: Um relacionamento um-para-um. Conceitualmente, este similar a um ForeignKey com vlido. unique=True com o lado "reverso" da relao retornar diretamente um nico objeto.

http://docs.djangobrasil.org/topics/db/models.html

47

Models
Opes dos campos
null: True, o Django ir gravar valores vazios como NULL no banco de dados. O padro False. puramente relacionado ao banco de dados. Editable: Se False, o campo no ser editvel na administrao ou por formulrios gerados automaticamente a partir de models. O padro True.

blank: Se True, o campo pode ser vazio. o padro False. relacionado com validao. Se um campo primary_key: True, esse campo ser a chave primria para o modelo. tem blank=True. Choices: Itervel de tupla duplas para usar como escolhas para esse campo.Se fornecido, a administrao do Django ir usar uma caixa de seleo no lugar de um campo de texto padro e ir limitar as escolhas as opes dadas. unique: Se True, esse campo deve ser nico na tabela. Garantido no banco de dados e no formulrio de administrao do Django.

verbose_name: Nome, legvel para humanos, para o campo. Se o nome prolxo no for dado, o Django db_column: Nome da coluna do banco de dados a criar um automaticamente, usando o nome do ser usada com esse campo. Se no for informada, campo, convertendo os underscores em espaos. o Django ir usar o nome do campo. default: O valor padro para o campo.

http://docs.djangobrasil.org/topics/db/models.html

48

Models
Opes disponveis do Meta abstract: Se True, este model ser uma classe abstrata. db_table: nome da tabela que ser usado pelo model no banco de dados ordering: O ordenamento padro de um objeto, para usar quando obtem-se listas de objetos: ordering = ['-order_date'] unique_together: os nomes de campos, que juntos, devem ser nicos, executada a nvel de banco de dados . verbose_name: nome legvel para o objeto, no singular: verbose_name = "pizza" .Se este no for fornecido usar uma verso do nome da classe. verbose_name_plural: O nome no plural para o objeto:verbose_name_plural = "stories" Se este no for fornecido, o Django usar verbose_name + "s".

http://docs.djangobrasil.org/topics/db/models.html

49

Models
blogs/models.py #coding utf-8 from django.db import models from datetime import datetime class Publication(models.Model): title = models.CharField(u'title', max_length=100, unique=True) content = models.TextField(u'conteudo') email_from = models.EmailField(u'email') date = models.DateTimeField(default=datetime.now, blank=True) class Meta: ordering = ('-date',) verbose_name, verbose_name_plural = u'publicacao',u'publicacoes' def __unicode__(self): return u'%s' % (self.title)

core/models.py #coding utf-8 from django.db import models class Email(models.Model): email = models.EmailField(u'email') subject = models.CharField(u'assunto', max_length=100) message = models.TextField(u'mensagem')

http://docs.djangobrasil.org/topics/db/models.html

50

Models
blogs/models.py #coding utf-8 from django.db import models from datetime import datetime class Publication(models.Model): title = models.CharField(u'title', max_length=100, unique=True) content = models.TextField(u'conteudo') email_from = models.EmailField(u'email') date = models.DateTimeField(default=datetime.now, blank=True) class Meta: ordering = ('-date',) verbose_name, verbose_name_plural = u'publicacao',u'publicacoes' def __unicode__(self): return u'%s' % (self.title)

core/models.py #coding utf-8 from django.db import models class Email(models.Model): email = models.EmailField(u'email') subject = models.CharField(u'assunto', max_length=100) message = models.TextField(u'mensagem')

http://docs.djangobrasil.org/topics/db/models.html

51

Restaurants/models.py #coding utf-8 from django.db import models class Restaurant(models.Model): name = models.CharField(u'nome', max_length=100) TYPE_CHOICES = ( ('C', 'Churrascarias'), ('P', 'Pizzarias'), ('Q', 'a quilo'), ('V', 'vegetarianos'), ('J', 'japoneses'), ) restaurant_type = models.CharField(u'tipo de restaurante', max_length=20, choices=TYPE_CHOICES) address = models.CharField(u'endereco', max_length=100) owner = models.ForeignKey('Owner', verbose_name=u'Dono') receipts = models.ManyToManyField('Receipt', verbose_name=u'receitas') phone = models.CharField(u'telefone', max_length=14) class Meta: ordering = ('name',) verbose_name, verbose_name_plural = u'restaurante',u'restaurantes' unique_together = ('name', 'owner') def __unicode__(self): return u'%s' % (self.name) def gettyperestaurant(self): for k,t in self.TYPE_CHOICES: if k == self.restaurant_type: return '%s' % t print 'kokokok'

class Owner(models.Model): name = models.CharField(u'nome do proprietario', max_length=100, unique=True) graduate = models.CharField(u'formacao', max_length=100, null=True) MALE, FEMALE = 'm', 'f' GENDER_C = ( (MALE, u'Masculino'), (FEMALE, u'Feminino'), ) gender = models.CharField( u'sexo do paciente', max_length=10) birthdate = models.DateField(u'data de nascimento',blank=True,null=True,help_text='formato: <em>YYYY-MMDD</em>') class Meta: ordering = ('name',) verbose_name, verbose_name_plural = u'dono', u'donos' def __unicode__(self): return u'%s' % (self.name) class Receipt(models.Model): name = models.CharField(u'nome', max_length=100, unique=True) ingredients = models.TextField(u'ingredientes') preparation = models.TextField(u'modo de preparo') class Meta: ordering = ('name',) verbose_name, verbose_name_plural = u'receitas',u'receitas' def __unicode__(self): return u'%s' % (self.name)

52

Restaurants/models.py #coding utf-8 from django.db import models class Restaurant(models.Model): name = models.CharField(u'nome', max_length=100) TYPE_CHOICES = ( ('C', 'Churrascarias'), ('P', 'Pizzarias'), ('Q', 'a quilo'), ('V', 'vegetarianos'), ('J', 'japoneses'), ) restaurant_type = models.CharField(u'tipo de restaurante', max_length=20, choices=TYPE_CHOICES) address = models.CharField(u'endereco', max_length=100) owner = models.ForeignKey('Owner', verbose_name=u'Dono') receipts = models.ManyToManyField('Receipt', verbose_name=u'receitas') phone = models.CharField(u'telefone', max_length=14) class Meta: ordering = ('name',) verbose_name, verbose_name_plural = u'restaurante',u'restaurantes' unique_together = ('name', 'owner') def __unicode__(self): return u'%s' % (self.name) def gettyperestaurant(self): for k,t in self.TYPE_CHOICES: if k == self.restaurant_type: return '%s' % t print 'kokokok'

class Owner(models.Model): name = models.CharField(u'nome do proprietario', max_length=100, unique=True) graduate = models.CharField(u'formacao', max_length=100, null=True) MALE, FEMALE = 'm', 'f' GENDER_C = ( (MALE, u'Masculino'), (FEMALE, u'Feminino'), ) gender = models.CharField( u'sexo do paciente', max_length=10) birthdate = models.DateField(u'data de nascimento',blank=True,null=True,help_text='formato: <em>YYYY-MMDD</em>') class Meta: ordering = ('name',) verbose_name, verbose_name_plural = u'dono', u'donos' def __unicode__(self): return u'%s' % (self.name) class Receipt(models.Model): name = models.CharField(u'nome', max_length=100, unique=True) ingredients = models.TextField(u'ingredientes') preparation = models.TextField(u'modo de preparo') class Meta: ordering = ('name',) verbose_name, verbose_name_plural = u'receitas',u'receitas' def __unicode__(self): return u'%s' % (self.name)

53

Models
Herana com django, funciona de forma anloga a do python comum.Uso de OneToOneField mais recomendado.

class Place(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=80)


class Restaurant(Place): serves_hot_dogs = models.BooleanField() serves_pizza = models.BooleanField()

http://docs.djangobrasil.org/topics/db/models.html

54

Models
Queries: Uma vez que voc tenha criado seus data_models o Django automaticamente lhe d uma API de abstrao de banco de dados que permite voc criar, receber, atualizar e deletar objetos.
Selecionando 1 nico objeto >>>s = Subscription.objects.get(name__contains="Bas") >>>s.phone u'21--9618--6180 >>>s = get_object_or_404(Subscriptio, pk=1) >>>s.phone u'21--9618--6180 Filtros >>>sc = Subscription.objects.filter(name__startswith="H") >>>sc[0].phone u'21--9618--6180' Field Lookup: 1. exact 2. iexact 3. contains 4. icontains 5. in 6. gt 7. gte 8. lt 9. lte 10. startswith 11. istartswith 12. endswith 13. Iendswith Ordenao #Ascendente Subscription.objects.all().order_by("name") #Descendente Subscription.objects.all().order_by("name") Encadeamento >>>qs = Subscription.objects.all() >>>qs = qs.filter(name__contains="Bas") >>> qs = Subscription.objects.filter(name__contains="Bas").order_by("name") Slicing limita a sua query Subscription.objects.all()[0] Subscription.objects.all()[0:2] Update e Delete Subscription.objects.all().update(name="Outro") Subscription.objects.all().delete()

Update e F() >>>from django.db.models import F >>>p = Produto.objects.get(id=1) >>>p.qtd_estoque = F('qtd_estoque') - 1 >>>p.save()

https://docs.djangoproject.com/en/dev/topics/db/queries/#making-queries

55

Models
Queries: Uma vez que voc tenha criado seus data_models o Django automaticamente lhe d uma API de abstrao de banco de dados que permite voc criar, receber, atualizar e deletar objetos. >>> from restaurants.models import Owner as O >>> dono = O(name='Andre',graduate='Culinaria na china') >>> dono.save() >>> dono.name = 'Flavio Andre' >>> dono.save() >>> dono <Owner: Flavio Andre> >>> O.objects.create(name='flavio diniz',graduate='cefer') <Owner: flavio diniz> >>> O.objects.all() [<Owner: Dr House>, <Owner: Flavio Andre>, <Owner: flavio diniz>] >>> O.objects.filter(name='Flavio Andre') [<Owner: Flavio Andre>] >>> O.objects.filter(name__startswith='Flavio') [<Owner: Flavio Andre>, <Owner: flavio diniz>] >>> O.objects.filter(name__startswith='Flavio').filter(graduate__icontains='cefer') [<Owner: flavio diniz>] >>> O.objects.filter(name__startswith='Flavio').filter(graduate__contains='cefer') [<Owner: flavio diniz>] >>> O.objects.all() [<Owner: Dr House>, <Owner: Flavio Andre>, <Owner: flavio diniz>] >>> O.objects.all()[:2] [<Owner: Dr House>, <Owner: Flavio Andre>] >>> O.objects.filter(name__lte='W') [<Owner: Dr House>, <Owner: Flavio Andre>]

https://docs.djangoproject.com/en/dev/topics/db/queries/#making-queries

56

Models
Queries: Uma vez que voc tenha criado seus data_models o Django automaticamente lhe d uma API de abstrao de banco de dados que permite voc criar, receber, atualizar e deletar objetos. >>> from restaurants.models import Owner as O >>> dono = O(name='Andre',graduate='Culinaria na china') >>> dono.save() >>> dono.name = 'Flavio Andre' >>> dono.save() >>> dono <Owner: Flavio Andre> >>> O.objects.create(name='flavio diniz',graduate='cefer') <Owner: flavio diniz> >>> O.objects.all() [<Owner: Dr House>, <Owner: Flavio Andre>, <Owner: flavio diniz>] >>> O.objects.filter(name='Flavio Andre') [<Owner: Flavio Andre>] >>> O.objects.filter(name__startswith='Flavio') [<Owner: Flavio Andre>, <Owner: flavio diniz>] >>> O.objects.filter(name__startswith='Flavio').filter(graduate__icontains='cefer') [<Owner: flavio diniz>] >>> O.objects.filter(name__startswith='Flavio').filter(graduate__contains='cefer') [<Owner: flavio diniz>] >>> O.objects.all() [<Owner: Dr House>, <Owner: Flavio Andre>, <Owner: flavio diniz>] >>> O.objects.all()[:2] [<Owner: Dr House>, <Owner: Flavio Andre>] >>> O.objects.filter(name__lte='W') [<Owner: Dr House>, <Owner: Flavio Andre>]

https://docs.djangoproject.com/en/dev/topics/db/queries/#making-queries

57

Forms
Maneira mais comum de incluir dados numa aplicao web, derivados de forms. Form possui a capacidade de mostrar um formulrio HTML com widgets gerados automaticamente executando a verificao dos dados submetidos conforme um conjuto de regras de validao. Re-exibi um formulrio no caso de haver erros de validao. Converte dados de formulrios submetidos a tipos relevantes do Python Necessrio a criao de arquivos foms.py em todas as aplicaes do projetos.

https://docs.djangoproject.com/en/dev/topics/forms/

Forms
Tipos de Forms BooleanField: O widget default o CheckboxInput onde um valor vazio considerado False CharField: O widget default o TextInput onde valores vazios so considerados string vazia, e normaliza para unicode.

ChoiceField: O widget default o Select onde valores vazios so considerados string vazia.
DateField: O widget default o TextInput onde valores vazios so considerados None DateTimeField : O widget default o TextInput onde valores vazios so considerados None EmailField: O widget default o TextInput onde valores vazios so considerados string vazia, e normaliza para unicode. FileField : O widget default o FileInput onde valores vazios so considerados None. ImageField: O widget default o FileInput onde valores vazios so considerados None. IntegerField: O widget default o TextInput onde valores vazios so considerados None MultipleChoiceField: O widget default o SelectMultiple onde valores vazios so considerados uma lista vazia.

https://docs.djangoproject.com/en/dev/topics/forms/

Forms
Usando formulrios para validar dados
Form.is_valid() A primeira tarefa de um objeto Form validar dados. Com uma instncia de preenchida de um formulrio, chame o mtodo is_valid() para executar a validao e retornar um booleano designando se ele foi validado.E caso no for validado retorna um dicionrio com os erros. Neste dicionrio, as chaves so nomes de campos, e os valores so listas de strings Unicode representando as mensagens de erro. As mensagens de erro so armazenadas na lista porque um campo pode ter mais de uma mensagem de erro. As rotinas de validao sero chamadas somente uma vez, indiferente de quantas vezes voc acessar errors ou chamar is_valid(). Estes valores so somente mostrados para formulrios vazios, e eles no so usados como valores de recuo se um valor particular no fornecido. Acessando dados "limpos" Cada Field numa classe Form responsvel no somente por validar dados, mas tambm por limp-los, permite dados de um campo particular ser inserido de diversas formas, sempre resultando numa sada consistente. Uma vez que voc tenha criado uma instncia do Form com um conjunto de dados e validado-os, voc pode acessar os dados limpos via atributo cleaned_data do objeto Form Mostrando os formulrios como HTML as_p() Form.as_p() renderiza o formulrio como uma srie de tags <p>, com cada <p> contendo os campos da label e de input. as_ul() Form.as_ul() renderiza o formulrio como uma sria de tags <li>, com cada <li> contendo um campo. Ele no inclui as tags <ul> ou </ul>, ento voc pode especificar quaisquer atributos sobre o<ul>. as_table() Finalmente, Form.as_table() mostra o formulrio como uma <table> HTML.De fato, quando voc executa um print um objeto form, ele chama seu mtodo as_table() por trs das

https://docs.djangoproject.com/en/dev/topics/forms/

Forms
core/forms.py #coding: utf-8 from django import forms

class FormEmail(forms.Form): email = forms.EmailField(help_text='Entre com endereo de email vlido') subject = forms.CharField(initial='Sem Assunto',label='Assunto') message = forms.Field(widget=forms.Textarea,label='Mensagem')

https://docs.djangoproject.com/en/dev/topics/forms/

Forms
core/forms.py #coding: utf-8 from django import forms

class FormEmail(forms.Form): email = forms.EmailField(help_text='Entre com endereo de email vlido') subject = forms.CharField(initial='Sem Assunto',label='Assunto') message = forms.Field(widget=forms.Textarea,label='Mensagem')

core/models.py from django.db import models class Email(models.Model): email = models.EmailField(u'email') subject = models.CharField(u'assunto', max_length=100) message = models.TextField(u'mensagem') https://docs.djangoproject.com/en/dev/topics/forms/

ModelForm
Se voc est construindo uma aplicao baseada em banco de dados, existe uma grande chance de que seus formulrios correspondero com os seus modelos Django. Neste caso, seria redundante definir os tipos de campo no seu formulrio, porque isso j foi feito no seu modelo.

#coding: utf-8 from django import forms from django.forms import ModelForm from datetime import datetime from models import Publication
class FormPublication(ModelForm): date = forms.DateField(initial=datetime.now()) class Meta: model = Publication

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/

63

Admin
Para o admin reconhecer os objetos das aplicaes temos que dizer para o site de administrao que estes objetos possuem uma interface de administrao. Necessrio criar arquivos admin.py em todos os diretrios de aplicao. blogs/admin.py #coding: utf-8 from django.contrib import admin from models import Publication admin.site.register(Publication) core/admin.py #coding: utf-8 from django.contrib import admin from models import Email admin.site.register(Email) restaurants/admin.py #coding: utf-8 from django.contrib import admin from models import Owner from models import Receipt from models import Restaurant admin.site.register(Owner) admin.site.register(Receipt) admin.site.register(Restaurant) Com resultado, com todos os models inclusos no admin. 127.0.0.1:8000/admin/

64

Adicionando registros no admin


Com o admin funcionando fica bem simples adicionar novos registros ao banco de dados. Adicionando registro de dono de restaurante:

Adicionando registro de dono de receitas:

Adicionando registro de restaurante:

65

Views
Simplicidade:Escrever uma view deve ser to simples quanto escrever uma funo Python. Os desenvolvedores no devem ter que instanciar uma classe quando uma funo for suficiente. Use objetos request: Views devem ter acesso ao objeto request um objeto que armazena metadados sobre a requisio corrente. O objeto deve ser passado diretamente para a funo view, ao invs da funo view ter quer acessar o request de uma varivel global. Isto se faz leve, limpo e fcil de testar views passando-a objetos de requisio falsos. Baixo acoplamento: Uma view no deve se preocupar sobre qual sistema de template o desenvolvedor utiliza ou mesmo se ele utiliza algum. Diferenciamento entre GET e POST:GET POST so distintos; os desenvolvedores devem explicitamente usar um ou outro. O framework deve tornar fcil a distino entre os dados GET e POST.

https://docs.djangoproject.com/en/dev/topics/http/views/

66

Views
Uma funo view, ou somente view, simplesmente uma funo Python que recebe uma requisio Web e retorna uma resposta Web. Esta resposta pode ser um contedo HTML de uma pgina, ou um redirecionamento, ou um erro 404, ou um documento XML, ou uma imagem . . . ou qualquer coisa, na verdade. O view em si contm qualquer lgica arbitrria que necessria para retornar uma resposta, como manipulao de dados por exemplo. Exemplo de views mais simples que retorna um HttpResponse: from django.http import HttpResponse def homepage(request): return HttpResponse('Gordon Ramsay!) No projeto utilizaremos a resposta render_to_response com o RequestContext para manter a variveis de ambiente. Na view, restaurants/views.py tambm utlizaremos o get_object_or_404 que busca a incidencia de um objeto no BD. #coding: utf-8 from django.shortcuts import render_to_response from django.template import RequestContext from models import Restaurant from models import Receipt from django.shortcuts import get_object_or_404 def show_restaurants(request): restaurants = Restaurant.objects.all() return render_to_response( 'restaurantes.html', {'restaurants': restaurants }, RequestContext(request) ) def show_restaurant(request, rest_id): restaurant = get_object_or_404(Restaurant, id=rest_id) return render_to_response( 'restaurante.html', {'restaurant': restaurant }, RequestContext(request) ) def show_receipt(request, rest_id): receipt = get_object_or_404(Receipt, id=rest_id) return render_to_response( 'receipt.html', {'receipt': receipt }, RequestContext(request) )
67

https://docs.djangoproject.com/en/dev/topics/http/shortcut/

Views
Blogs/views.py from django.shortcuts import render_to_response from django.shortcuts import redirect from django.shortcuts import get_object_or_404 from django.template import RequestContext from forms import FormPublication from models import Publication return render_to_response( 'publicacao.html', {'form': form }, RequestContext(request) ) core/vies.py from django.template import RequestContext from django.shortcuts import render_to_response from django.core.mail import send_mail from forms import FormEmail def homepage(request): return render_to_response('home.html',{}, RequestContext(request)) def contact(request): if request.method == 'POST': form = FormEmail(request.POST) if form.is_valid(): email = form(commit=False) send_mail( email.subject, email.message, email.email, ['zetavares.rib@gmail.com'], fail_silently=False) form = FormEmail() else: form = FormEmail() return render_to_response( 'email.html',{'form': form, }, RequestContext(request) )

def blogs(request): publications = Publication.objects.all() if request.method == 'POST': form = FormPublication(request.POST) if form.is_valid(): form.save() form = FormPublication() publications = Publication.objects.all() else: form = FormPublication() return render_to_response( 'blog.html', {'form': form, 'publications': publications, }, RequestContext(request))
def publication(request, pub_id): pub = get_object_or_404(Publication, id=pub_id) if request.method == 'POST': form = FormPublication(request.POST, instance=pub) if form.is_valid(): form.save() return redirect('blogs') else: form = FormPublication(instance=pub)

68

Views
Blogs/views.py from django.shortcuts import render_to_response from django.shortcuts import redirect from django.shortcuts import get_object_or_404 from django.template import RequestContext from forms import FormPublication from models import Publication return render_to_response( 'publicacao.html', {'form': form }, RequestContext(request) ) core/views.py from django.template import RequestContext from django.shortcuts import render_to_response from django.core.mail import send_mail from forms import FormEmail def homepage(request): return render_to_response('home.html',{}, RequestContext(request)) def contact(request): if request.method == 'POST': form = FormEmail(request.POST) if form.is_valid(): email = form(commit=False) send_mail( email.subject, email.message, email.email, ['zetavares.rib@gmail.com'], fail_silently=False) form = FormEmail() else: form = FormEmail() return render_to_response( 'email.html',{'form': form, }, RequestContext(request) )

def blogs(request): publications = Publication.objects.all() if request.method == 'POST': form = FormPublication(request.POST) if form.is_valid(): form.save() form = FormPublication() publications = Publication.objects.all() else: form = FormPublication() return render_to_response( 'blog.html', {'form': form, 'publications': publications, }, RequestContext(request))
def publication(request, pub_id): pub = get_object_or_404(Publication, id=pub_id) if request.method == 'POST': form = FormPublication(request.POST, instance=pub) if form.is_valid(): form.save() return redirect(blogs) else: form = FormPublication(instance=pub)

69

Templates
Separar a lgica da apresentao: Ns vemos um sistema de template como uma ferramenta que controla a apresentao e a lgica relacionada apresentao e s. O sistema de template no deve suportar funcionalidades que vo alm de seu objetivo bsico. Desencorajar redundncias: A maioria dos Web sites dinmicos utilizam algum tipo de design comum um cabealho comum, rodap, barra de navegao, etc. O sistema de template do Django deve ser fcil para armazenar estes elementos em um nico lugar, eliminando cdigo duplicado. Ser dissociado do HTML: O sistema de template no deve ser projetado para gerar somente sada HTML. Ele deve ser igualmente bom para gerao de outros formatos baseados em texto, ou s texto plano. Presume competncia do designer: O sistema de template no deve ser projetado de modo que templaes necessariamente sejam exibidos amigavelmente nos editores WYSIWYG, como o Dreamweaver. Isso to grave, que passa a ser uma limitao e no permitiria a sintaxe ser to legal como ela . O Django espera que os autores de templates estejam confortveis editando HTML diretamente. No invente uma linguagem de programao: O objetivo no inventar uma linguagem de programao. O objetivo oferecer somente funcionalidades suficientes, como lgica condicional e laos (looping), que so essenciais para contruir representaes relacionadas com decises. Proteo e segurana: O sistema de template, out of the box, deve proibir a incluso de cdigos maliciosos como comandos que apagam registros no banco de dados. Esta outra razo para que o sistema de template no permita cdigo Python arbitrrio. Extensibilidade: O sistema de template deve reconhecer que autores avanados de templates podem querer extender sua tecnologia. Est a filosofia por trs das tags e filtros de template personalizados.

70

Templates
O template um arquivo texto simples. Ele pode gerar um arquivo baseado em texto formatado (HTML, XML, CSV, etc.).O template contem variveis, quando o template avaliado essas variveis so substitudas por valores, e tags que controlam a lgica do template. Variveis: representadas {{ variavel }}. Quando um template encontra essa varivel ele a avalia e substitui por um valor. Use um ponto (.) para acessar os atributos.Se voc usar uma varivel que no existe, o sistema do template vai inserir um valor da configurao TEMPLATE_STRING_IF_INVALID com isso ele seta '' (string vazia) por padro. Filtros: Voc pode modificar as variveis para serem mostradas usando filtros.Filtros se parecem com isso: {{ nome|lower }}. Isso mostra o valor da varivel {{ nome }} depois de ter sido filtrado pelo filtro lower, isso converte o texto para minsculas. Use o pipe (|) para aplicar os filtros.Os filtros podem ser "encadeados". A sada de um filtro aplicada ao prximo. {{ texto|escape|linebreaks }} escape comum para textos, e o linebreaks converte as quebras de linhas em <p> tags.Alguns filtros tm argumentos. Um filtro de argumento parece com isso: {{ bio|truncatewords:30 }}. Isso mostra as primeiras 30 palavras da varivel bio.Os argumentos de filtros que contem espaos devem ser quoted, por exemplo, para inserir em uma lista espaos e virgulas use {{ lista|join:", " }} Tags: Tags se parecem com isso: {% tag %}. Tags so mais complexas do que variveis: Alguns criam texto na sada, outros aplicam loops ou lgica, e carregam informaes externas dentro de templates usadas por variveis anteriormente.Algumas tags requerem que se comece e termine a tag ( ex.: {% tag %} ... contedo da tag ... {% endtag %}).

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs

71

Templates
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Site do Chef Ramsay</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <div id="header"> <table> <tr> <td> <img src="{{ STATIC_URL }}img/fundo2.png"> </td> <td> Template base.html o template pai do <span class="hometext">Chef Gordon Ramsay</span> </td> projeto e sendo todos os templates do </tr> projetos originados dele pela marcao: </table> </div> {% block content %} <div id="menu"> {% endblock %} <a href='/'>Home</a> <a href='/blog/'>Blog</a> <a href='{% url show_restaurants %}'>Restaurantes</a> <a href='/contato/'>Contato</a> </div> <div id="content"> {% block content %} {% endblock %} </div> </body> 72 </html>

Templates
Templates Filhos: A tag {% extends %} a chave. Ela diz para o template se "estender" ao outro template. Quando o sistema de template avalia esse template, primeiro ele localiza a base, no caso, "base.html.O template substitui as tags {% block %} no base.html pelo seu contedo. core/templates/home.html {%extends "base.html" %} {% block content %} <div> Descricao site home... </div> {% endblock %} Arquivo de template mostrando dados de um objeto do projeto. Restaurants/templates/receipt.html {%extends "base.html" %} {% block content %} <div class="titulo">Receita {{ receipt.name }}</div> <div class="subtitle">Ingredientes</div> <div class="texto">{{ receipt.ingredients }}</div> <div class="subtitle">Modo de Preparo</div> <div class="texto">{{ receipt.preparation }}</div> <div> <button type="submit" onClick="javascript:history.back(-1);" >Voltar</button> </div> {% endblock %}
73

Templates
A tag url monta a url dinamicamente e pode ser utilizada como um link.E um loop for tambm pode ser utilizado no template. Restaurants/templates/restaurante.html
{%extends "base.html" %} {% block content %} <div class="titulo">Restaurante {{ restaurant.name }}</div> <div class="texto">Tipo: {{ restaurant.gettyperestaurant }}</div> <div class="texto">Endereo: {{ restaurant.address }}</div> <div class="texto">Telefone: {{ restaurant.phone }}</div> <div class="subtitle">Proprietrio</div> <div class="texto">Nome: {{ restaurant.owner.name }}</div> <div class="texto">Formao: {{ restaurant.owner.graduate }}</div> {% ifequal restaurant.owner.gender 'm' %} <div class="texto">Sexo: Masculino</div> {% else %} <div class="texto">Sexo: Feminino</div> {% endifequal %} <div class="texto"> Data Nascimento: {{ restaurant.owner.birthdate|date:"d \d\e F \d\e Y" }}</div> <div class="subtitle">Cardpio</div> <div class="texto"> {% filter force_escape|lower %} TOtal De {{restaurant.receipts.all|length}} receiTAs CadasTRAdas {% endfilter %} </div> <div> <ul> {% for r in restaurant.receipts.all %} <li><a class="link" href='{% url show_receipt rest_id=r.id %}'>{{ forloop.counter }}. {{ r.name }}</a></li> {% endfor %} </ul> </div> <div> <button type="submit" onClick="javascript:history.back(-1);" >Voltar</button> </div> {% endblock %}

74

Templates
Restaurants/templates/restaurantes.html {%extends "base.html" %} {%block content%} <div class="titulo">Restaurantes Cadastrados</div> <div> <ul> {% for rest in restaurants %} <li> <a class="link" href='{% url show_restaurant rest_id=rest.id %} >{{forloop.counter}}. {{rest.name}}</a> </li> {% empty %} <li>No Existem Restaurantes cadastrados!</li> {% endfor %} </ul> </div> {%endblock%} Um Form no template django pode ser apresentado de diversas maneiras, utilizando marcadores que organizam a disposio no template.Podendo utilizar o form, o fomr.as_p ou at o form.as_table Core/templates/email.html {%extends "base.html" %} {% block content %} <div class="titulo">Contato</div> <form action="" method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} <button type="submit">Enviar</button> {% endblock %}

75

Templates
Core/templates/publicacao.html {%extends "base.html" %} {%extends "base.html" %} {% block content %} <div class="titulo">Publicao</div> <form action="" method="post" enctype="multipart/form-data"> {% csrf_token %} <div> {{ form.title.label_tag }} {{ form.title }} {% if form.title.errors %} {{ form.title.errors }} {% endif %} </div> <div> {{ form.content.label_tag }} {{ form.content }} {% if form.content.errors %} {{ form.content.errors }} {% endif %} </div> <div> {{ form.email.label_tag }} {{ form.email }} {% if form.email.errors %} {{ form.email.errors }} {% endif %} </div> <div> {{ form.date.label_tag }} {{ form.date }} {% if form.date.errors %} {{ form.date.errors }} {% endif %} </div> <button type="submit">Salvar</button> {% endblock %}

76

Templates
blogs/templates/blog.html {%extends "base.html" %} {% block content %} <div class="titulo">Blog</div> <div> {% for pub in publications %} <ul> <li>Ttulo: {{ pub.title }}</li> <li>Contedo: {{ pub.content }}</li> <li>Email: {{ pub.email_from }}</li> <li>Publicado em: {{ pub.date|timesince }}</li> <li><a class="link" href='{% url publication pub_id=pub.id %}'>Editar</a></li> </ul> </div> {% endfor %} <hr /> <div class="titulo">Deixe seu comentrio</div> <form action="" method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} <div> <button type="submit">Enviar</button> </div> {% endblock %} {{ form.date.errors }} {% endif %} </div> <button type="submit">Salvar</button> {% endblock %} 77

URLS
Baixo acoplamento:URLs nas aplicaes Django no devem ser acopladas a cdigos Python subjacentes. Subordinando URLs a nomes de funes do Python uma coisa ruim e feia de se fazer. Sendo assim, o sistema de URL do Django deve permitir que URLs para uma mesma aplicao sejam diferentes em diferentes contextos.

Flexibilidade infinita: URLs devem ser to flexiveis quanto possvel. Qualquer URL concebvel deve ser permitida.
Encorajar as melhores prticas:O framework deve tornar fcil (ou mesmo mais fcil) o design de URLs bonitas do que feias.Extenses de arquivos nas URLs das pginas devem ser evitadas. URLs definitivas: Tcnicamente, foo.com/bar e foo.com/bar/ so URLs diferentes, e robs de motores de busca (e alguns analisadores de trfego na Web) iro trat-las como pginas distintas. O Django deve fazer um esforo para normalizar as URLs, a fim de que os robs de motores de busca no se confundam. Um esquema de URLs limpo e elegante um detalhe importante numa aplicao Web de qualidade. O Django permite que voc defina as URLs da maneira que quiser, sem limitaes impostas pelo framework. Uso de patterns(prefix, pattern_description, ...), onde as urls so representadas por uma tupla de tamanho 2 ou pela funo url(regex, view, kwargs=None, name=None, prefix=''), Voc pode utilizar a funo url() no lugar de uma tupla, como um argumento para patterns(). Isso conveniente se voc quer especificar um nome sem utilizar o dicionrio de argumentos opcionais adicionais.

https://docs.djangoproject.com/en/dev/topics/http/urls/

78

URLS
app/urls.py from django.conf.urls.defaults import patterns from django.conf.urls.defaults import include from django.conf.urls.defaults import url from django.contrib import admin from core.views import homepage from core.views import contact from blogs.views import blogs from blogs.views import publication admin.autodiscover() restaurants/urls.py from django.conf.urls.defaults import * import views urlpatterns = patterns('', url(r'^$', views.show_restaurants, name='show_restaurants'), url(r'^/(?P<rest_id>\d+)/$', views.show_restaurant, name='show_restaurant'), url(r'^receita/(?P<rest_id>\d+)/$', views.show_receipt, name='show_receipt'), )

urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), (r'^$', homepage), url(r'^contato/$', contact, name='contact'), url(r'^blog/$', 'blogs.views.blogs'), url(r'^blog/(?P<pub_id>\d+)/$', publication, name='publication'), (r'^restaurantes/', include('restaurants.urls')), )

https://docs.djangoproject.com/en/dev/topics/http/urls/

79

URLS
app/urls.py from django.conf.urls.defaults import patterns from django.conf.urls.defaults import include from django.conf.urls.defaults import url from django.contrib import admin from core.views import homepage from core.views import contact from blogs.views import blogs from blogs.views import publication admin.autodiscover() restaurants/urls.py from django.conf.urls.defaults import * import views urlpatterns = patterns('', url(r'^$', views.show_restaurants, name='show_restaurants'), url(r'^/(?P<rest_id>\d+)/$', views.show_restaurant, name='show_restaurant'), url(r'^receita/(?P<rest_id>\d+)/$', views.show_receipt, name='show_receipt'), )

urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), (r'^$', homepage), url(r'^contato/$', contact, name='contact'), url(r'^blog/$', 'blogs.views.blogs'), url(r'^blog/(?P<pub_id>\d+)/$', publication, name='publication'), (r'^restaurantes/', include('restaurants.urls')), )

https://docs.djangoproject.com/en/dev/topics/http/urls/

80

CSS melhora o visual da aplicao, podendo utilizar as facilidades do django, arquivos css devem ser colocados dentro da pasta static e e numa pasta prpria denominada css(Preferencialmente).
.hometext { font-size:50px; font-family: cursive; }
#header { background-color:azure; margin-top:0px; float:left; width:100%; } #menu { float:left; height: 40px; background-color: HoneyDew; width: 100%; border-top-style:solid; border-top-width:1px; border-top-color:Lavender; border-bottom-style:solid; border-bottom-width:1px; border-bottom-color:Lavender; } #menu a { margin-top:5px; display: block; margin-left:20px; padding: 5px; border: 1px solid WhiteSmoke; float: left; text-decoration:none; font: 15px Arial; border-radius:4px; color:DimGray;}

CSS

#content { padding-top:20px; width: 100%; height: 100%; float:left; background-color:white; min-height:500px }


#content div { margin-bottom: 10px; } #content button { margin-left: 60px; } #content div ul { margin-left: 20px; } #content div ul li{ margin-bottom: 10px; color:#555555; font: 15px Arial; } #content p{ margin-bottom: 10px; } #content label { margin-left: 15px; color:#555555; font: 15px Arial;}

#content input[type="text"] { margin-left: 10px; color:#555555; font: 15px Arial; }


#content textarea { margin-left: 10px; color:#555555; font: 15px Arial; } .helptext { margin-left: 5px; color:#555555; font: 10px Arial; margin-left: 10px; } .texto { margin-left: 20px; color:#555555; font: 15px Arial; border-radius:4px; } .titulo { margin-left: 20px; margin-bottom:10px; color:#555555; font: 20px Arial; font-weight: bold; border-radius:4px; }

.subtitle { margin-left: 20px; margin-bottom:10px; color:#555555; font: 17px Arial; font-weight: bold; border-radius:4px; } .link { text-decoration:none; color:#555555; font: 15px Arial; }
#content hr { margin-bottom: 20px; } .errorlist { clear:both; margin-left:18px; color:red; font: 10px Arial; }

81

Projeto Final

82

Projeto Final

83

Agradecimentos
Poliana Cerqueira Pereira Renato Garcia Pedigoni CIRP

Bibliografia
1. http://welcometothedjango.com.br/, por Henrique Bastos 2. http://www.aprendendodjango.com/, por Marinho Brando 3. http://www.novatec.com.br/livros/pythonedjango/, Python e Django - Autor: Osvaldo Santana Thiago Galesi ;ISBN: 978-85-7522-247-8;Pginas: 280;Ano: 2010 4. http://python.org/doc/ 5. https://docs.djangoproject.com/en/1.3/

84