O documento fornece uma introdução ao framework Django, incluindo:
1) O que é Django e seus principais recursos como mapeador objeto-relacional e interface administrativa automática;
2) Como instalar Django;
3) Como criar um projeto Django com arquivos e diretórios padrão;
4) Como criar e configurar uma aplicação de notícias dentro do projeto com modelos, views, templates e URLs.
1. Django
Framework Web para Perfeccionistas
Curso de Python - Sexta Aula
Bruno Gama Catão - brunogamacatao@gmail.com
2. O que é Django ?
• É um framework web focado em alta
produtividade;
• Principais recursos:
• Mapeador objeto-relacional;
• Interface administrativa automática;
• Design elegante de URLs;
• Sistema de templates;
• Sitema de cache;
• Internacionalização.
3. Sites que usam Django
• Washington Post;
• Lawrence;
• Toronto Life;
• Lista de sites que usam Django:
• http://www.djangosites.org
4. Instalando
• Site oficial: http://www.djangoproject.com
• URL para download:
• http://www.djangoproject.com/download/
• Descompacte o arquivo;
• No diretório criado digite:
• [Windows]: python setup.py install
• [Linux/MacOs]: sudo python setup.py install
6. Criando um projeto
• No diretório onde você for criar seus
projetos digite:
• django-admin.py startproject meusite
• Django criou para você os seguintes
arquivos:
meusite/
__init__.py
manage.py
settings.py
urls.py
7. Criando um projeto
• No diretório onde Lembre-se,nocriar seussão sempre
você foros comandos
digitados prompt ou terminal !
projetos digite:
• django-admin.py startproject meusite
• Django criou para você os seguintes
arquivos:
meusite/
__init__.py
manage.py
settings.py
urls.py
8. Criando um projeto
com PyDev
• Selecione a opção de menu:
• File→New→Project ...
• Escolha:
• Pydev→Pydev Django Project;
• No project name escreva: meusite;
• Clique em “Finish”.
10. Entrando em detalhes
• __init__.py: Arquivo vazio que diz que ao
Python que o diretório meusite é um módulo;
• manage.py: Arquivo contendo uma série de
utilitários de linha de comando;
• settings.py: Configurações gerais do
projeto;
• urls.py: Configurações das URLs do projeto.
11. Configurando um
banco de dados
• Todo projeto criado com Django está
associado a um banco de dados;
• Abra o arquivo settings.py
12. Definindo que banco
de dados usar
• Procure as seguintes linhas no arquivo
settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.', # ...
'NAME': '', # ...
'USER': '', # ...
'PASSWORD': '', # ...
'HOST': '', # ...
'PORT': '', # ...
}
}
13. Definindo que banco
de dados usar
• Modifique para ficar assim:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'meusite.db',
'USER': '', # ...
'PASSWORD': '', # ...
'HOST': '', # ...
'PORT': '', # ...
}
}
14. Sincronizando o projeto
com o banco de dados
• Sempre que você fizer qualquer
modificação relativa ao banco de dados do
seu projeto, você deve sincronizar o
projeto com o banco de dados;
• Clique com o botão direito do mouse
sobre o projeto e selecione:
• Django→Sync DB
15. Criando o super usuário do projeto
• Todo projeto em Django tem um super usuário;
• Na primeira vez que você for sincronizar o projeto
com o banco de dados, Django irá te perguntar se
quer criar este super usuário:
Digite ‘yes’, em seguida o nome do usuário, e-mail e a senha duas vezes.
16. Criando uma aplicação
• Como já dissemos anteriormente, um projeto
possui uma ou mais aplicações;
• Nossa primeira aplicação será um site de notícias;
• Para criar uma aplicação, clique com o botão direito
do mouse sobre o projeto e selecione:
• Django→Create application;
• Digite noticias;
• Clique “OK”.
17. Definindo as entidades
• Edite o arquivo noticias/models.py:
from django.db import models
class Jornalista(models.Model):
nome = models.CharField(max_length=100)
class Categoria(models.Model):
nome = models.CharField(max_length=100)
class Noticia(models.Model):
jornalista = models.ForeignKey(Jornalista)
categoria = models.ForeignKey(Categoria)
titulo = models.CharField(max_length=200)
texto = models.TextField()
data_publicacao = models.DateTimeField()
18. Aplicações instaladas
• Para definir que aplicações estão instaladas em um
projeto você deve editar o arquivo settings.py;
• Localize as seguintes linhas:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
)
19. Aplicações instaladas
• Para instalar o módulo de administração
automática descomente a última linha:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
)
20. Adicionando URLs
• É necessário adicionar uma URL para a aplicação de
administração automática;
• Para isto modifique o arquivo meusite/urls.py:
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover() Descomente
urlpatterns = patterns('',
# Example:
# (r'^meusite/', include('meusite.foo.urls')),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
(r'^admin/', include(admin.site.urls)),
Descomente
)
21. Sincronize o
banco de dados
• Clique com o botão direito do mouse
sobre o projeto e selecione:
• Django→Sync DB
22. Testando
• Para testar se tudo correu bem, no prompt
de comando (terminal) vá até o diretório
onde está o arquivo manage.py do seu
projeto e digite:
• python manage.py runserver
• Abra seguinte endereço no seu navegador:
• http://localhost:8000/admin/
27. Tornando entidades
administráveis
• Adicione no pacote meusite/noticias o
módulo admin.py com o conteúdo:
from meusite.noticias.models import *
from django.contrib import admin
admin.site.register(Jornalista)
admin.site.register(Noticia)
admin.site.register(Categoria)
28. Registrando a aplicação
• Para instalar a aplicação de notícias modifique as
INSTALLED_APPS do arquivo meusite/settings.py:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'meusite.noticias'
)
29. Reinicie o servidor
• No terminal pressione CONTROL+C para
parar o servidor;
• Inicie novamente digitando:
• python manage.py runserver
• Abra seguinte endereço no seu navegador:
• http://localhost:8000/admin/
37. Criando as suas páginas
• Cada aplicação tem um módulo views.py;
• Aí estão todas as funções por exibir as
páginas deste módulo;
• Cada aplicação deve ter um módulo urls.py
que fará o mapeamento das urls para as
funções do módulo views.py.
38. Hello World
• Edite o arquivo meusite/noticias/views.py:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello World !")
• Crie um módulo urls.py no pacote meusite/
noticias:
from django.conf.urls.defaults import *
urlpatterns = patterns('meusite.noticias.views',
(r'^$', 'index'),
)
39. Configuração das URLs
• Abra o arquivo meusite/urls.py:
from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^admin/', include(admin.site.urls)),
(r'^noticias/', include('meusite.noticias.urls')),
)
40. Testando
• Abra o seguinte endereço em seu
navegador:
• http://localhost:8000/noticias/
41. Utilizando templates
• Não é muito prático (e bonito) colocar o
código HTML diretamente dentro de
módulos Python;
• Podemos editar as páginas HTML
externamente e utilizá-las a partir do nosso
código.
42. Utilizando templates
• Crie um diretório templates na raiz do seu
projeto;
• Crie um diretório noticias dentro do
diretório templates;
• Edite o arquivo meusite/settings.py, localize
a linha que contém TEMPLATE_DIRS.
43. TEMPLARE_DIRS
• Clique com o botão direito do mouse
sobre o diretório templates;
• Copie a localização do diretório (Location):
44. Arquivo settings.py
• Altere a declaração da variável TEMPLATE_DIRS:
TEMPLATE_DIRS = (
'/Users/brunocatao/Documents/workspace/meusite/templates'
)
45. Atenção
• O mundo da informática (linguagens,
ferramentas, compiladores, etc) não foi feito para
os acentos :(
• Portanto, é importante você estar atendo ao
encoding que você está usando;
• Quando abrir o seu arquivo HTML para edição
defina o encoding:
• Selecione o menu Edit→Set Encoding...
• Selecione Other: UTF-8.
46. Crie o seu template
• Crie um arquivo chamado index.html no diretório
templates/noticias:
<html>
<head>
<title>Últimas Notícias</title>
</head>
<body>
<h1>Veja as nossas últimas notícias:</h1>
<ul>
{% for noticia in noticias %}
<li><b>{{noticia.categoria}}</b>: {{noticia.titulo}}</li>
{% endfor %}
</ul>
</body>
</html>
47. Exibindo as notícias
• Modifique o seu arquivo meusite/noticias/views.py:
from django.http import HttpResponse
from django.shortcuts import render_to_response, get_object_or_404
from meusite.noticias.models import *
def index(request):
noticias = Noticia.objects.all().order_by('-data_publicacao')
return render_to_response('noticias/index.html', {'noticias': noticias})
48. Exibindo o detalhe das
notícias
• Modifique o template index.html:
<html>
<head>
<title>Últimas Notícias</title>
</head>
<body>
<h1>Veja as nossas últimas notícias:</h1>
<ul>
{% for noticia in noticias %}
<li><a href="/noticias/noticia/{{noticia.id}}">
<b>{{noticia.categoria}}</b>: {{noticia.titulo}}</a></li>
{% endfor %}
</ul>
</body>
</html>
49. Crie um template para
os detalhes
• Crie um arquivo (detalhe.html) na pasta templates/
noticias/detalhe.html:
<html>
<head>
<title>{{noticia.titulo}}</title>
</head>
<body>
<p>{{noticia.categoria}}: {{noticia.jornalista}}</p>
<h1>{{noticia.titulo}}</h1>
<h2>{{noticia.texto}}</h2>
</body>
</html>
50. Criando a função para
exibir o detalhe
• Modifique o seu arquivo meusite/noticias/views.py,
adicione a seguinte função:
def detalhe(request, noticia_id):
noticia = get_object_or_404(Noticia, pk=noticia_id)
return render_to_response('noticias/detalhe.html', {'noticia': noticia})
51. Associando a URL à
função criada
• Modifique o arquivo meusite/noticias/urls.py:
from django.conf.urls.defaults import *
urlpatterns = patterns('meusite.noticias.views',
(r'^$', 'index'),
(r'^noticia/(?P<noticia_id>d+)/$', 'detalhe'),
)
52. Testando
• Abra o seguinte endereço em seu
navegador:
• http://localhost:8000/noticias/
53. Limitando o número de
notícias
• Podemos limitar o número de notícias exibidas. Por
exemplo, vamos modificar a função index do módulo
views.py:
from django.http import HttpResponse
from django.shortcuts import render_to_response, get_object_or_404
from meusite.noticias.models import *
def index(request):
noticias = Noticia.objects.all().order_by('-data_publicacao')[:10]
return render_to_response('noticias/index.html', {'noticias': noticias})
54. Testando
• Adicione pelo menos 11 notícias e teste a
sua aplicação;
• Experimente mudar os templates;
• Abra o seguinte endereço em seu
navegador:
• http://localhost:8000/noticias/