domingo, 18 de janeiro de 2009

Parte 4 - Criando views

Para concluir essa primeira fase do tutorial, faremos agora exemplo com duas views para a aplicação CD.

Abra o arquivo views.py e o deixe da seguinte forma:

# -*- coding: utf-8 -*-
# Create your views here.

from django.shortcuts import render_to_response
from app.cd.models import Interprete, Album

def listaInterpretes(request):

interpretes = Interprete.objects.order_by('nome')
return render_to_response('cds/interpretes.html', {'interpretes':interpretes,})


def listaCds(request,slug=None):

cds = Album.objects.filter(interprete__slug = slug)
return render_to_response('cds/cds.html', {'cds':cds,})

A função render_to_response é a responsável de passar todos os objetos para o template especificado.

Para listar os intérpretes, utilizaremos def listaInterpretes. Todas as defs criadas no views.py para utilização no front precisam do parâmetro obrigátorio resquest. Através dele, será possível pegar conteúdos dos POSTs, GETs e SESSIONs.

A primeira linha da def listaInterpretes, é a responsavél por pegar todos os registros contidos no banco para esta classe e através do método order_by, os registros já virão ordenados pelo campo solicitado, neste caso, o nome.

Ao clicar no nome do intérprete, queremos mostrar quais cds estão relacionados a ele. Faremos isso utilizando a listaCds. Da mesma forma que fizemos com a primeira def, será necessário pegar todos os cds, porém agora temos uma restrição: mostraremos apenas os cds vinculados ao intérprete escolhido.

Vamos enteder como isso será feito:

cds = Album.objects

Neste ponto, temos todos os cds contidos no banco de dados. Para filtrar apenas os relacionados ao intérprete escolhido utilizaremos o método filter.

Nossa chave estrangeira interprete da classe Album é uma conexão direta aos objetos da classe Interprete, sendo possivel desta forma acessar quaisquer conteudos lá contidos.

Lembra do campo slug do model? Aqui ele será utilzado. Cada intérprete possui um slug, e como ele estará contido na url, por que não utilizá-lo para o filtro? É extamente isso que iremos fazer.

No comando filter, vamos filtrar pelo campo slug da classe Interprete da seguinte forma:

filter(interprete__slug = slug)

O parâmetro slug desta def será passado pela url. Com as defs prontas veremos agora como criar tais urls para deixá-las elegantes e funcionais.

O URLS.PY

Adicone ao urls.py da raiz do seu projeto a seguinte linha abaixo da url do admin:

(r'^cds/', include('app.cd.urls')),

Esta linha importará todas as urls contidas no urls.py da sua aplicação cd. É possivel colocá-las no arquivo urls.py da raiz, mas por questão de organização, criaremos um outro urls.py dentro da aplicação, referenciando as mesmas través do include acima, mapeadas pela url: /cds/.

Agora crie dentro da pasta cd, um arquivo chamado urls.py e deixe-o da seguinte forma:



from django.conf.urls.defaults import *

urlpatterns = patterns('app.cd.views',

(r'^$', 'listaInterpretes'),
(r'^interpretes/$', 'listaInterpretes'),
(r'^(?P<slug>[-\w]+)/$', listaCds),

)


Com as importações necessárias, definiremos os padrões de urls desta aplicação.
Neste exemplo estão sendo criadas três urls:

  • /cds/
    Irá funcionar de maneira similar ao index.html em uma pasta qualquer. Essa urls chamará a def listaInterpretes contidas no views.py da aplicação cd.

  • /cds/interpretes/
    Esta url terá a mesma funcionalidade da anterior.

  • /cds/
    Aqui, o slug do intérprete será passado através da expressão regular para texto : [-\w]+ , que chamará a def listaCds, passando o segundo parâmetro necessária para a listagem de cds: o slug do intérprete.

OS TEMPLATES

Criarei os dois templates dos exemplos acima de forma bem simples, apenas para servir de exemplo.

Dentro da pasta templates na raiz do projeto crie a pasta cds. Dentro dela crie os dois arquivos abaixo:

interpretes.html



Na linha 14 da imagem a acima, temos um for que irá passar por todos os registros vindos o objeto interepretes que foi passado na view. Para cada registro, será criado um link para redirecionar até SLUG/, onde o mesmo será o valor contido no atributo slug do objeto i corrente.
Conforme vimos anteriormente, o parâmetro slug, será passado através da expressão regular contida no urls.py que foi criado na aplicação.

Vejamos o outro template a ser criado:


cds.html


Neste template, apenas temos um for, que irá correr todos os registros do objeto cds filtrados pelo slug do intérprete, conforme vimos na view.


OBSERVAÇÕES:

  • Note que as variáveis apenas são ACESSADAS no template, não é possivel definí-las no mesmo.

  • Para os comandos, deve-se utilizar o bloco:
    {% comando %} com seu respectivo bloco de fechamento {% endcomando %}.

  • Para acessar o conteúdo dos objetos deve-se utilizar: {{ obj.atritbuto }}, conforme nos exemplos acima.

Agora basta iniciar o servidor e acessar http://localhost:8000/cds/, se estiver rodando local.

Repositório atulizado até este post: Revisao 7.

hasta!

Nenhum comentário:

Postar um comentário