www.djangoproject.com
www.python.org
Introdução
Arquitectura
Clientes <> HTTP <> Servidor
Arquitectura
Browsers
Servidor Web+
Python+
Django
Arquitectura
Views
TemplatesModels
Lógica
Objectos Apresentação
Arquitectura
Views
TemplatesModels
Lógica
Objectos Apresentação
Base de dados
Base de dados
MySQL SQLite
Oracle PostgreSQL
Base de dados
MySQL SQLite
Oracle PostgreSQL
Projecto
“A minha biblioteca”
A minha biblioteca
Funcionalidades:
• Gestão de livros pessoais
• Catalogação de livros
• Partilha de listas de livros
Configuraçõesiniciais
Criar aplicação
manage.py startapp biblioteca
# E adicionar demo.biblioteca às INSTALLED_APPS
# no ficheiro settings.py
Criar projecto
django-admin.py startproject demo
Ficheiro de configuração
settings.py:
ROOT_PATH = os.path.realpath(os.path.dirname(__file__))
TIME_ZONE = 'Europe/Lisbon '
LANGUAGE_CODE = 'pt-pt'
MEDIA_ROOT = os.path.join(ROOT_PATH, 'media/')
MEDIA_URL = '/media/'
TEMPLATE_DIRS = ( os.path.join(ROOT_PATH, 'templates'), )
Base de dadospara SQLite
settings.py:
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'demo.sqlite3'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
Iniciar o servidor
manage.py runserver [8000]
>> http://localhost:8000
Iniciar a shell
manage.py shell
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Desenvolvimento
Models
Objectos
Utilizadores
Livros
Categorias1
N
N
N
Utilizadores(automático)
• Username
• Last Name
• E-mail address
• Password
• Last Login
• Date Joined
Livros
• Título
• Autor
• ISBN
• Categorias
• Descrição
• Link
• Dono
• …
Categorias
• Nome
• Descrição
• …
Tipos de campos de objectos
from django.db import models
class NomeDoObjecto(models.Model):
nome = models.CharField(max_length=200)
data = models.DateTimeField('Data de criação')
custo = models.DecimalField(max_digits=9,
decimal_places=2)
Tipos de campos de objectos
...
email = models.EmailField()
comprovativo = models.FileField(upload_to='uploads')
foto = models.ImageField(upload_to='imagens')
anos = models.IntegerField('Anos de experiência')
descricao = models.TextField('Descrição')
link = models.URLField(verify_exists=True)
Tipos de campos de objectos
...
criador = models.ForeignKey(User,
verbose_name='Indivíduo')
amigos = models.ManyToManyField(User)
Definir modelos e campospara a biblioteca...
Sincronizar com abase de dados
manage.py syncdb
Administração
Adicionar modelos
admin.py:
from django.contrib import admin
from biblioteca.models import *
admin.site.register(Categoria)
admin.site.register(Livro)
Resultado
Configurar administraçãoadmin.py:
class LivroAdmin(admin.ModelAdmin):
# Campos apresentados na listagem
list_display = ('titulo', 'autor', 'dono', 'isbn',)
# Campos pesquisáveis
search_fields = ('titulo', 'autor', 'descricao')
# Ordenar por estes campos
ordering = ('titulo',)
admin.site.register(Livro, LivroAdmin)
Configurar administração
Outras opções:
• Remover campos
• Alterar a ordem dos campos
• Retirar obrigatoriedade de preenchimento
• Definir detalhes do layout da página
• ...
Views
URLsurls.py:
urlpatterns = patterns('',
(r'^users/(?P<username>\w+)/$', 'biblioteca.views.user_view'),
)
URLsurls.py:
urlpatterns = patterns('',
(r'^users/(?P<username>\w+)/$', 'biblioteca.views.user_view'),
)
>> http://localhost:8000/users/xpto
Link View
Variável Tipo de dados
URLsTipos de dados:
\w – Caracter alphanumérico
\d – Número
. – Qualquer caracter ou espaço
Quantificadores:
? – 0 ou 1 caracter
+ – 1 ou mais caracteres
* - 0 ou mais caracteres
Viewviews.py:
@login_required # Obrigar a fazer login
def user_view(request, username):
user = User.objects.get(username=username)
return render(request,
'detalhe_user.html',
{'user': user})
Variável
Templates
View
views.py:
def user_view(request, username):
user = User.objects.get(username=username)
return render(request,
'detalhe_user.html',
{'user': user})
Template
Templatetemplates/detalhe_user.html:
<html>
<head><title>Utilizador</title></head>
<body>
<h1>{{ user }}</h1>
<p>Último login em: {{ user.last_login }}</p>
</body>
</html>
Template>> http://localhost:8000/users/sdsantos
Loginurls.py:
(r'^login/$', 'django.contrib.auth.views.login',
{'template_name': 'login.html', 'redirect_field_name':'/'}),
(r'^logout/$', 'django.contrib.auth.views.logout_then_login',
{'login_url': '/login/?next=/'}),
settings.py:
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'
Login
templates/login.html:
<h1>Login</h1>
<form method="POST" action="">
<table>
{{ form.as_table }}
</table>
<input type="submit" value="Entrar" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
Extend de templatestemplates/base.html:
<html>
<head><title>Utilizador</title></head>
<body>
{% block content %}{% endblock %}
</body>
</html>
templates/other.html:
{% extends "base.html" %}
{% block content %}
<p>O conteúdo a ser inserido no bloco acima</p>
{% endblock %}
Outras páginas daaplicação...
Extras(?)