Python e Django na Prática!
Dec 14, 2014
Python e Django na Prática!
Apresentação Rafael Stain Cassau
Analista de Sistemas – S2IT
Bacharel em Sistemas de Informação
Programando profissionalmente desde 2010.
[email protected] | [email protected]
https://github.com/rafaelcassau
História Python foi criado em meados de
1989.
Guido Van Rossum.
Python não é inspirado na cobra
(Monty Python).
Influências de ABC, C, Perl, Haskell,
SmallTalk.
Python Linguagem de Alto nível.
Open Source.
Tipagem dinâmica.
Fortemente Tipada.
Multiplataforma (Unix, Linux, Mac, Windows, Mobile).
Multiparadigma (OO, funcional e procedural).
Compilada + Interpretada.
Linguagem Interativa.
Linguagem de scrips.
Versões
2.7.6 – Mantido até que a versão 3.x esteja estável e com
boa parte das bibliotecas (frameworks) portados.
3.4.0 – Evolução da linguagem desenvolvida paralelamente
pela comunidade pois quebra a compatibilidade retroativa da
linguagem.
Quem usa Python?
Mãos na massa Python já vem instalado nas distribuições Linux e OS X.
Execução via terminal “python”.
Interpretador Interativo.
Detalhes da linguagem Case sensitive.
Bloco de comandos por endentação (não tem {} ou begin end).
Não tem (ponto e virgula).
Um comando por linha.
Não misture espaços com tabs.
# comentário de uma linha.
"""comentário""" documentação, ou textos em muitas linhas.
Números e operadores
int – Inteiros.
long – Inteiros longos.
float – Ponto flutuante.
complex – Complexos.
+ (Soma).
- (Subtração).
* (Multiplicação).
/ (Divisão).
// (Divisão inteira para floats).
% (Módulo).
** (Exponenciação).
3 / 2 = 1 (int/int = int).
3.0 / 2 = 1.5 (float/int = float)
3 / 2.0 = 1.5 (int/float = float)
3.0 // 2.0 = 1.0
(float//float = float arredondado)
Operadores lógicos 0 - False,
0.0 - False,
[] - False,
() - False,
{} - False,
“” - False,
set() - False,
None - False,
== (Igualdade),
!= (Diferença),
<> (Diferença),
> (Maior),
>= (Maior igual),
< (Menor),
<= (Menor igual),
is (Identidade),
not (negação),
and (e),
or (ou),
in (contido),
not in (Não contido),
is not (Negação de
identidade),
Qualquer outro
valor diferente
dos citados
como False é
considerado
True.
Palavras reservadas and
as
assert
break
class
continue
def
del
elif
Else
lambda
None
nonlocal
not
or
pass
raise
return
True
try
while
with
yield
except
exec
False
finally
for
global
if
import
in
Is
Atribuição = (simples).
+= (soma reduzida).
-= (subtração reduzida).
/= (divisão reduzida).
//= (inteira reduzida).
%= (modulo reduzida).
*= (multiplicação reduzida).
**= (exponenciação reduzida).
a, b = b, a (atribuição em uma linha).
fusca = Carro()
fusca2 = fusca
del fusca
del fusca2
referências [ 1 ]
referências [ 2 ]
referências [ 1 ]
referências [ 0 ]
Referências
Quando o contador de referências chegar a zero o
garbage collector é chamado.
if <condição>:
<bloco de comandos>
elif <condição>:
<bloco de comandos>
else:
<bloco de comandos>
Estrutura condicional Python não tem switch/case.
if, elif, else - (elif - É uma junção do comando else if).
<bloco de comandos> if <condição> else <bloco de comandos>
Estrutura de repetição (while)
Python não tem do while. O comando while possui um else.
while <condicao>:
<bloco de comandos>
else:
<bloco de comandos>
O else será executado quando a condição se tornar false.
Estrutura de repetição (for)
O comando for é executado sobre um objeto iteravel, podendo
ser este uma string, uma lista, uma tupla, um dicionário, etc..
O comando for possui um else.
for <referência> in <iterator>:
<bloco de comandos>
else:
<bloco de comandos>
O else será executado ao fim da iteração.
Estrutura de repetição (for)
for character in 'Python is powerfull language programming':
print character
else:
print "Terminou de iterar pela frase!"
for number in range(0, 100, 2):
print number
else:
print "Terminou de iterar pelo intervalo de 0 a 100 de 2 em 2!"
fruit_list = ['orange', 'lemon']
for i, fruit in enumerate(fruit_list):
print i, fruit
else:
print "As frutas acabaram!"
fruit_list = ['orange', 'lemon']
for fruit in fruit_list:
print fruit
else:
print "As frutas acabaram!"
Estrutura de repetição (for)
Estrutura de repetição (for)
color_list = ('blue', 'red',)
for color in color_ist:
print color
else:
print “Terminou!"
dict_char = {1: 'A', 2: 'B', 3: 'C', 4: 'D'}
for k, v in dict_char.items():
print 'Chave: %s, Valor: %s' % (k, v)
else:
print “Terminou!"
Comandos pass - Preenche blocos vazios de código, substitui os delimitadores
de código, tais como {} ou begin end.
del - remove a referência de um objeto ou um elemento de uma
coleção.
exec - executa código direto de uma string passada como
parâmetro.
assert - Verifica se uma condição é verdadeira, caso contrário
emite um assertionError.
Tipos de dados Em python todo tipo de dados é objeto!
print 5 .__add__(1)
>>> 6
Não existe conversão implícita, o único caso é a promoção de
um (int) para (long) quando o mesmo excede a capacidade
máxima de armazenamento para o tipo inteiro.
Tipos de dados (Sequências)
Indexáveis - Possuem um índice para melhorar a performance.
Iteráveis - Implementam o comportamento de uma coleção iterável.
Fatiáveis - (slice) é uma técnica de obter pedaços da lista com sintaxe
simples.
List comprehension - Capacidade de executar operações iteráveis
de uma lista em uma única expressão escrita em uma linha.
Tipos de dados (list) Listas são objetos mutáveis.
Podem ser criadas através da função builtin list() ou de maneira literal
com a sintaxe [].
my_list = list()
my_list = list(iterable)
my_list = []
my_list.append(object)
my_list.insert(index, object)
my_list.extend([1,2,3])
my_list.remove(value)
my_list.index(object)
my_list.count(object)
Tipos de dados (tuple) Tuplas são objetos imutáveis.
É ordenada por posição. (Posições são importantes)
Podem ser criadas através da função builtin tuple() ou de maneira
literal.
my_tuple = tuple()
my_tuple = tuple(iterable)
my_tuple = (1, 2, 3,)
my_tuple = (1,)
my_tuple = 1, 2, 3,
my_tuple = 1,
my_tuple.index(object)
my_tuple.count(object)
Tipos de dados (dict) Dicionários são objetos compostos por chaves e valores.
Não são ordenados.
Somente objetos imutáveis podem ser usados como chave.
Dicionários podem ser criados através da função builtin dict() ou de
forma literal através da sintaxe {}.
my_dict = dict()
my_dict = dict(k1=1, k2=v2)
my_dict = {}
Tipos de dados (dict)
my_dict.get(key, default)
my_dict.pop(key, default)
my_dict.setdefault(key, default)
my_dict.has_key(key)
my_dict.keys()
my_dict.values()
my_dict.items()
my_dict.update(k1=v1, k2=v2)
my_dict[key]
del my_dict[key]
my_dict[key] = value
key in my_dict:
[key1, key2]
[value1, value2]
[(key1, value1), (key2, value2)]
Tipos de dados (string) Strings são objetos imutáveis.
É possível iterar strings e fatiar strings. (slice)
Podem ser criadas com aspas simples ou duplas, ou três aspas
simples ou duplas. (Multilinha e docstrings)
my_string = „Python is powerfull language‟
my_string = “Python is powerfull language”
my_string = “„Python is powerfull language”‟
Tipos de dados (string)
„A,B,C‟.split(„,‟)
„\n\t Pithon‟.strip(„\n\t‟)
„Python‟.replace(„P‟, „p‟)
„Python‟.upper()
„Python‟.lower()
„Python‟.startswith(„py‟)
„Python‟.endstswith(„on‟)
„Python‟.isdigit()
„ ‟.join(„Python‟)
[„A‟, „B‟, „C‟]
Python
python
PYTHON
python
True
True
False
P Y T H O N
Slice Slice é a capacidade de fatiar um iterador usando a sintaxe:
Iterator[inicio:fim:intervalo]
Inicio: Se não for especificado é 0 (zero).
Fim: Se não for especificado é a tamanho da string menos 1 (um).
Intervalo: Se não for especificado é 1 (um).
„Python language‟[0]
„Python language‟[:6]
„Python language‟[6:]
„Python language‟[0:6:2]
„P‟
„Python‟
„ language‟
„Pto‟
Arquivos (file) Arquivos podem ser criados ou abertos de duas formas diferentes:
Contrutor: file(name, mode, buffer)
Builtin: open(name, mode, buffer)
Arquivos podem ser iterados.
r - leitura
w - escrita (trunca o arquivo)
a - escrita (adiciona)
b - binário
+ - ( leitura + escrita)
file.close() - Fecha o arquivo
file.flush() - Esvazia o buffer
file.read(0) - Ira ler a linha 5 do arquivo
file.seek(3) - Posiciona o ponteiro na linha 3
file.tell() - Posiciona o ponteiro para o inicio do arquivo
file.write('line') - Escreve 'line'
file.readline() - Ira ler a linha onde o ponteiro estiver posicionado
file.readlines() - retorna um iterável do arquivo
Arquivos (file)
Funções built-ins Python vem com baterias inclusas. (builtins)
Funções builtins já estão disponíveis no escopo global sem a
necessidade de import.
Dentre elas se destacam:
dir(object) - Imprime a lista de todos os métodos do objeto.
help(object) - Imprime a documentação de classe e de seus
respectivos métodos.
Funções built-ins int(object)
isinstance(obj, cls)
len(iter)
list(iter)
long(object)
max(iter)
min(ter)
open(na, mod, buff)
range(start, stop, step)
reversed(iter)
set(iter)
sorted(iter)
str(object)
sum(iter)
tuple(iter)
type(object)
unicode(object)
abs(object)
bool(object)
dict(k1=v1)
dir(object)
divmod(x, y)
enumerate(iter)
file(na, mod, buff)
float(object)
help(object)
Funções Funções em python também são objetos.
Podem ser passadas como parâmetro para outras funções.
Sempre retornam um objeto que por default é None.
Suportam valor default em seus parâmetros.
Suportam uma lista dinâmica de argumentos *args e um dicionário
dinâmico de valores **kwargs, caso sejam definidos. (devem ser os
últimos parâmetros).
Podem ter funções internas. (Closures)
Podem ser funções anônimas. (lambda)
Funções def sum_two_num(n1=0, n2=0):
return n1 + n2;
def repeat_sum(fn, length):
total = 0
for i in range(1, (length + 1)):
result = fn(i, i)
total += result
print '%s call: %s' % (i, result)
print „Sum total: %s' % total
def repeat_sum_closure(length):
t = {'total': 0}
def sum_two_num(n1=0, n2=0, t={}):
answer = n1 + n2
total['total'] += answer
return answer
for i in range(1, (length+1)):
result = sum_two_num(i, i, total)
print '%s call: %s' % (i, result)
print 'Sum total: %s' % total['total']
Funções def sum_two_num(*args, **kwargs):
if kwargs.get(„operacao‟) == „matematica‟:
return args[0] + args[1]
sum_two_num(2,2, operacao='matematica')
my_pow = lambda x: x**2
for i in range(1, 11):
print my_pow(i)
Hierarquia do escopo A hierarquia de escopos segue o seguinte processo:
Busca as variáveis no escopo local, ou seja, funções internas ou
métodos de classes.
Busca as variáveis nas funções externas.
Busca as variáveis no escopo global.
Busca as variáveis no escopo builtin.
O comando global deve ser usado para alterar o valor de uma
variável global de dentro de uma função. (Evite variáveis globais)
language = 'Java'
def alter_language():
global language
language = 'Python'
Exceptions Exceptions são objetos responsáveis por capturar e tratar erros comuns.
Python possui varias exceptions nativas.
Não existe o conceito de checked exceptions.
É recomendável a criação de exceptions personalizadas.
fruit_list = ['orange', apple]
try:
fruit = fruit_list[2]
except IndexError as e:
print 'Indice inválido!'
Exception
KeyError
IndexError
IndentationError
AttributeError
Orientação a Objetos Orientação a objetos é um paradigma de programação.
Características e comportamentos. (Atributos e Classes)
Baixo acoplamento e alta coesão.
Abstração
Encapsulamento
Herança
Polimorfismo
Abstração Python possui classes abstratas a partir da versão 2.6.
Possui herança múltipla.
Não possui o mecanismo de interface.
Podemos ter o mesmo comportamento de uma interface utilizando
classes abstratas e herança múltipla.
Abstração class GemFigure(object):
def __init__(self, center):
self.center = center
def draw(self):
raise NotImplementError()
class Rectangle(GemFigure):
def __init__(self, center, height, width):
super(GemFigure, self).__init__(center)
self.center = center
def draw(self):
print 'rectangule drawn'
Encapsulamento Em python o encapsulamento é por convenção.
Atributos ou métodos com prefixo _ são CONSIDERADOS de uso
interno do objeto. (Indica possíveis mudanças sem aviso prévio)
Atributos ou métodos com prefixo __ tem seu nome alterado pela
classe com o objetivo de evitar acesso externo.
class Person(object):
name = ''
_age = 0
__social_number = 0
Person.name
Person._age
Person._Person__social_number
Encapsulamento class Person(object):
def __init__(self):
self._name = ''
def _get_name(self):
return self._name
def _set_name(self, name):
if not name:
raise ValueError('Vazio')
self._name = name
name = property(_get_name, _set_name)
p1 = Person()
p1.name = ''
ValueError: Vazio
Herança Python suporta herança múltipla. (Muito cuidado!).
Mecanismo sofisticado de precedência de herança.
MRO - (Method Resolution Order).
class Father(object):
fhater = 'Eu sou o pai'
class Mother(object):
mother = 'Eu sou a mãe'
class Son(Father, Mother):
son = 'Eu sou o filho''
son = Son()
print son.father
print son.mother
print son.son
Polimorfismo Polimorfismo é a capacidade de executar um comportamento em
comum de maneira especifica sem se preocupar com o tipo do
objeto.
name = 'Python is powerfull language'
print name[0:6] # chama o método __getslice__(0, 6)
>>> Python
fruit_list = ['orange', 'apple', lemon, 'strawberry']
print fruit_list[0:2] # chama o método __getslice__(0, 2)
>>> ['orange', apple]
Outras características Atributos de classes X Atributos de instâncias.
Criação dinâmica de atributos em classes e instâncias.
Mixin em classes e instâncias.
Programação funcional. (map, filter, reduce, zip, lambda)
List comprehension.
Generators e generator comprehension.
Sobrecarga de operadores (special methods).
@classmethod X @staticmethod.
Django
Criado por Jacob Kaplan-Moss, Adrian Holovaty e Simon Willison em
2003.
CMS para auxiliar na criação de modulos administraveis do Lawrence
Journal-World.
Disponibilizado Opensource logo depois.
Framework Full Stack.
Web ágil, plugável, action based.
Componentes
ORM - Mapeador Objeto Relacional.
Template System - Linguagem de Templates.
URL dispatcher - Roteador de URLs.
Admin - Interface Administrativa automatizada.
Internacionalização.
Gerador e validador de formulários.
Autenticação, perfil de acessos, etc...
MVC ou MTV
MVC - Model View Controller.
MTV - Model Template View.
Model - Camada responsável pela lógica de negocios, abstração de
persistência etc...
Template - Camada responsável pela lógica de visualização.
View - Camada responsável pela interface entre Model e Template.
Ambiente (PIP) PIP – Utilitário de instalação de pacotes python.
Baixa e instala pacotes do PyPI (Python Package Index).
Download - https://www.python.org/download.
Distribuições baseadas em Debian - sudo apt-get install python-pip.
pip freeze – Lista os pacotes python instalados.
pip install nome_do_pacote – Instala novos pacotes.
pip uninstall nome_do_pacote – Desistala o pacote.
sudo apt-get install python-pip
Ambiente (Virtualenv) Poderiamos desenvolver utilizando o interpretador padrão do python,
mas se tivessemos 2 sistemas sendo desenvolvidos simultaneamente
com versões do python diferentes?
virtualenv – pacote python que tem a capacidade de criar e gerenciar
ambientes isolados.
pip install virtualenv
virtualenv --no-site-packages diretorio/nome_do_ambiente
source diretorio/nome_do_ambiente/bin/activate
(nome_do_ambiente)
Projeto
Biblioteca pessoal – Cadastrar livros pessoais e controlar empréstimos.
Cadastro de livros – (titulo, descrição, status, nome, email).
Instale o pip.
Crie o ambiente virtual com o nome "personal_library".
Ative o ambiente virtual.
Instale o Django 1.6. (pip install django==1.6).
execute o comando "pip freeze" para verificar se a instalação foi
realizada com sucesso.
Sucesso!
django-admin.py O modulo "django-admin.py" possui diversos comandos utilitários para
auxliar o desenvolvedor.
django-admin.py help - Lista os comandos disponíveis.
django-admin.py <comando> - Definição detalhada sobre o comando.
django-admin.py startproject nome_do_projeto
django-admin.py startapp nome_da_aplicacao
Criando o projeto Execute o comando django-admin.py startproject personal_library.
O Django criará a seguinte estrutura:
personal_library
personal_library
__init__.py
settings.py
urls.py
wsgi.py
manage.py
Pasta onde o projeto está guardado.
Project (Não deve ser renomeada).
Arquivo vazio (indica um package).
Arquivo de configuração do projeto.
Definições de URLs do projeto.
Protocolo parecido com fastCGI serve HTTP.
Utilitário parecido com o "django-admin.py".
Testando o projeto
O Django possui um servidor web interno para ser usado no ambiente
de desenvolvimento.
NUNCA use o servidor interno em produção.
O servidor local possui recarga automática de módulos e por padrão já
serve os arquivos estaticos. (javascripts, css, imagens, etc.).
O comando para executa-lo é "python manage.py runserver porta".
python manage.py runserver 8000.
Sucesso!
Testando no browser
manage.py O módulo "manage.py" possui varios comandos utilitários.
syncdb - Cria tabelas no banco de dados.
dumpdata --format F [aplicação] - Extrai dados da aplicação em
XML/JSON.
loaddata fixture - Insere dados XML/JSON/YAML no banco de dados.
shell - Interpretador Python com modelo de dados.
create superuser --username --email - Cria uma usuário root.
runserver endereco:porta - Inicia o servidor web de desenvolvimento.
startapp aplicacao - Cria a estrutura de uma nova aplicação no projeto.
Aplicações O django é um framework plugável.
Um projeto é uma composição de várias aplicações que PODEM ser
plugáveis e podem ser instaladas em vários projetos.
my_application
__init__.py
views.py
models.py
tests.py
admin.py
Nome da app.
Arquivo vazio (indica um package).
Módulo onde as views da app são criadas.
Módulo onde os models da app são criados.
Módulo onde os testes automatizados são criados.
Módulo onde a parte administrativa é criada.
Criando a app library
Estrutura do projeto
Ciclo de vida (request)
Urls É um módulo python responsável por realizar o roteamento de URLs do
projeto através do mapeamento das mesmas utilizando regex.
Todas as urls podem ficar em um unico arquivo urls.py, mas é
recomendável que cada aplicação contenha seu próprio arquivo urls.py
para mapear as urls expecificas da aplicação e deixa-la plugável.
Posteriormente o arquivo urls.py referênte ao projeto deve importar os
módulos urls.py de cada aplicação instalada ao projeto.
url(regex, app.views.action, name=my.action)
Iniciando (urls.py)
Views É um módulo python que agrupa um conjunto de actions (views).
Toda view deve receber um objeto “HTTPRequest” como primeiro
parâmetro e retornar um objeto “HTTPResponse” como resposta.
O objeto “HTTPRequest” é fornecido automaticamente pelo django.
O objeto “HTTPResponse” é de responsabilidade do desenvolvedor.
Iniciando (views.py)
Testando
Testando
Models É um módulo python responsável por mapear as tabelas do banco de
dados em objetos e abstrair toda a complexidade de manipulação das
tabelas. (CRUD)
TIPOS DE CAMPOS MAIS USADOS
BooleanField EmailField TextField
CharField DecimalField SlugField
DateField IntegerField URLField
OPÇÕES DE CAMPOS MAIS USADAS
null db_column primary_key
blank db_index unique
choices default verbose_name
Iniciando (models.py)
Iniciando (settings.py) O settings.py é um arquivo de configuração do projeto.
É criado automaticamente.
Já vem com varias definições inclusas e vários comentários
autoexplicativos sobre as mesmas.
Os parâmetros de configuração do banco ficam no settings.py
Configurando o banco Atualmente o django suporta os seguintes bancos de dados:
SQLite
MySQL
PostGreSQL
Oracle
Usaremos o SQLite devido a facilidade de configuração, e por não
precisar de nenhum SGBD.
Configurando o banco
Altere o nome do arquivo para “personal_library.db”.
Instalando a app
Adicione a app library ao final da tupla e comente as 4 primeiras apps.
Validando os models
Exibindo o SQL da app
Criando as tabelas
Estrutura do projeto
Templates O django possui uma linguagem de templates poderosa.
É possível extender templates e sobreescrever trechos especificos de
código com o mecânismo "extends".
É possível incluir paginas expecificas com o mecanismo "include".
As tags com (lógica) devem ficar entre as marcações "{% %}".
Para imprimir o resultado de uma expressão os marcadores utilizados
são "{{ }}".
É possível criar template "filters" e "tags" personalizadas.
Templates O django possui por padrão dois mecânismos de busca de templates.
filesystem.Loader - percorre somente o projeto buscando por HTMLs
que estejam dentro de um diretório chamado “templates”.
app_directories.Loader - percorre somente as apps buscando por
HTMLs que estejam dentro de um diretório “templates”.
Template padrão
Criando o template base.
Crie uma pasta chamada “templates” dentro do pacote
“personal_library”.
Adicione a tupla “TEMPLATE_DIRS” no settings do projeto, ela adiciona
o seguinte diretório na árvore de busca de templates do django.
Template padrão
Template app library Criando o template da app library.
Crie um diretório com as pastas “templates” e ”library” dentro da app.
O diretório é criado com esse padrão para distinguir que o template
“library.html” é referente a app “library”, pois pode existir um template
chamado “library.html” em outra app.
Essa técnica evita que o o mecânismo de busca do django carregue
templates errados.
Template app library
Listando livros Realiza uma busca em todos os livros. (ORM)
Altera método de retorno, para que o mesmo importe o template
“library.html” e popule o contexto com a lista de livros retornados do
banco.
Inserindo (shell) Realiza um cadastro de livro no banco através da ferramenta “shell” do
django. (ORM)
Testando Execute o comando runserver.
Forms É um módulo python divido em duas funções principais:
1 - Validar a entrada de dados vindos do HTML.
2 - Gerar HTML automaticamente.
Fields – Realizam o mapeamento do formulário recebido via POST
convertendo os valores recebidos para tipos nativos do python.
Widgets – Geram o HTML que o field exibirá na página HTML.
Todo field possui um widget padrão atrelado a ele, mas é possível altera-
lo.
Forms O django fornece duas classes geradoras de forms.
forms.Form – Classe padrão que define os fields e seus respectivos
widgets, que quando herdada serve para criar formulários específicos.
forms.ModelForm – Classe que usa o mecânismo de metaprogramação
e faz um introspecção no model definido em seu corpo para gerar os
fields dinamicamente em tempo de execução.
A renderização do formulário no template pode ser feita com os seguintes
comandos no template:
form.as_p, form.as_li, ou form.as_table
Forms TIPOS DE CAMPOS MAIS USADOS
BooleanField DateField ImageField
CharField EmailField IntegerField
ChoiceField FileField MultipleChoiceField
TIPOS DE WIDGETS MAIS USADOS
TextInput FileInput CheckBoxInput
PasswordInput DateInput SelectMultiple
HiddenInput TextArea RadioSelect
Iniciando (forms.py)
Refatorando (index) Com o formulário de cadastro e alteração implementado, é necessário
criar uma instancia do mesmo e adiciona-la ao contexto para ser
retornado quando a view “index” é chamada.
Cadastro livros Após alterar a view “index” para retornar o formulário no contexto, é
necessário adiciona-lo ao template “library.html” para que o mesmo
seja renderizado.
Cadastro livros Na action do form foi adiciona a templatetag “url” contendo o nome da
rota que fará a ligação com a view responsável por persistir os livros no
banco.
É necessário adicionar essa rota no arquivo “urls.py”.
Cadastro livros Com a rota adicionada no “urls.py” é necessário criar a view “save”
que conterá a lógica de persistência de livros no banco.
Testando
Execute o runserver da aplicação e cadastre um novo livro.
Faça teste de validação de campos obrigatórios.
Veja que a mensagem de validação é exibida em inglês.
Para traduzi-la altere a variável “LANGUAGE_CODE” para “pt-br”
no “settings.py”.
Testando
Fluxo de alteração Para realizar a alteração de livros é necessário recuperar o objeto e
adiciona-lo ao formulário.
Quando a listagem foi implementada a URL especifica para a alteração
já foi adicionada no link “editar”.
Agora é necessário mapeá-la no “urls.py” adicionando uma rota a ela.
Fluxo de alteração Com a rota adicionada no “urls.py” é necessário criar a view “edit”
que conterá a lógica de recuperação do objeto e adição do mesmo ao
contexto.
Refatorando o save
Testando Execute o runserver da aplicação.
Cadastre um novo livro.
Faça a alteração do livro cadastrado anteriormente.
Fluxo de remoção Para realizar a remoção de livros é necessário recuperar o objeto e
remove-lo através do método “delete()”. (ORM)
Quando a listagem foi implementada a URL especifica para a remoção já
foi adicionada no link “excluir”.
Agora é necessário mapeá-la no “urls.py” adicionando uma rota a ela.
Fluxo de remoção Com a rota adicionada no “urls.py” é necessário criar a view “remove”
que conterá a lógica de remoção do objeto.
Testando Execute o runserver da aplicação.
Cadastre um novo livro.
Faça a remoção do livro cadastrado anteriormente.
Estrutura da aplicação
Django Admin É um mecanismo do django que permite a geração automática de
interfaces administrativas.
É flexível, ou seja é possível customizar somente partes especificas.
É customizavel, para cada model existe um conjunto de varias opções
para a modificação do layout e gerenciamento dos fluxos.
É fortemente baseado em metaprogramação.
Django Admin Para ativa-lo é necessário habilitar as quatro primeiras linhas que
estavam comentadas no “INSTALED_APPS”.
Django Admin Outro passo necessário é habilitar as rotas do “admin” que estavam
comentadas no arquivo “urls.py”.
Django Admin Após realizar essas configurações execute o comando:
“python manage.py syncdb”, ele ira criar as tabelas necessárias e
sugerir a criação de um “superuser” que deve ser criado.
Autenticação Após esses passos execute o runserver da aplicação e acesse a url:
“localhost:8000/admin”.
Autentique com o usuário criado no passo anterior.
Dashboard Uma tela com uma listagem das aplicações instaladas no projeto é exibida
no canto superior esquerdo.
No canto superior direito uma tela de listagem de suas operações é
exibida.
Cadastro de grupos Permite o cadastro de grupos de acesso associados a ações de cada app
instalada.
Listagem de grupos Lista os grupos de acesso cadastrados.
Cadastro de usuários Tela de cadastro de usuários divida em dois passos:
1 - Dados de autenticação.
2 - Dados pessoais.
Listagem de usuários Lista os usuários cadastrados.
Possui filtros no canto superior direito.
Adicionando apps Para permitir que uma “app” seja gerenciada pelo “Django Admin” é
necessário registra-la no arquivo “admin.py” que compõe a “app”.
Podemos registra-la da maneira clássica através do comando:
“admin.site.register(Library)”.
Ou da maneira customizada onde o comportamento padrão do “admin”
é alterado.
Adicionando apps Após a configuração do “admin.py” execute o runserver da aplicação e
acesse o admin novamente.
A app “library” já esta no menu de aplicações que são gerenciadas
pelo admin.
Customização
O item de menu referente a app “library” apareceu em inglês, não
somente ele como também a tela de listagem de livros, outro problema
é que na listagem não é exibido o titulo do livro e sim uma
representação do “objeto” recuperado.
Para resolver esses problemas é necessário adicionar algumas meta-
informações no model “Library” e sobrescrever o método
“__unicode__(self)” do mesmo.
Customização model
Customização Após as alterações no model execute o runserver da aplicação e
observe o resultado.
Customização Listagem de livros.
Customização Cadastro de livros.
Logout
Garimpando na web http://ark4n.files.wordpress.com/2010/01/python_para_desenvolvedores
_2ed.pdf - Livro de Python (Opensource)
http://osantana.me/pydjango/ - Curso de Python/Django
https://www.youtube.com/playlist?list=PLfkVgm8720kzm6fmTekjtKyFcpp
yD4Ubd – Curso de Python/Django
http://pycursos.com/biblioteca/ - Python (Assuntos diversos)
http://www.globalcode.com.br/gratuitos/minicursos/minicurso-introducao-
a-programacao-orientada-a-objetos-em-python - OO
http://pycursos.com/python-para-zumbis/ - Python (Completo)
Referências
https://docs.python.org/2/library/
https://docs.djangoproject.com/en/1.6/ref/
http://osantana.me/pydjango/
http://pt.slideshare.net/ramalho/orientao-a-objetos-em-python-
presentation
http://www.python.org.br/wiki/ProgramacaoOrientadaObjetoPython
http://www.dcc.ufrj.br/~fabiom/mab225/pythonoo.pdf
Duvidas?