Workshop Django

Post on 11-Nov-2014

2,446 views 1 download

description

Workshop de Iniciação a Django, uma plataforma web para desenvolvimento de sites utilizando a linguagem de programação Python. Projecto desenvolvido no workshop: http://jeknowledge.com/media/formacao/django/demo.zip

transcript

Workshop

Pedro Gaspar pedro.gaspar@jeknowledge.com

Sérgio Santos sergio.santos@jeknowledge.com

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(?)