Changes between Initial Version and Version 1 of DeclarandoSeuProprioSignal


Ignore:
Timestamp:
Sep 22, 2008, 11:32:37 AM (16 years ago)
Author:
Marinho Brandão
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DeclarandoSeuProprioSignal

    v1 v1  
     1= Declarando seu próprio Signal =
     2
     3Às vezes é necessário requisitar uma informação ou permitir que gatilhos sejam
     4adicionados a determinados comportamentos de sua aplicação. Os signals são
     5recursos criados para permitir que isso seja possível.
     6
     7O conceito de signal e dispatcher é o de vincular uma função a um signal, ou
     8seja, a um gatilho pré-declarado que será chamado quando um evento ocorrer.
     9O dispatcher é o pacote responsável por vincular uma função ao signal e por
     10chamá-lo quando necessário. Uma grande vantagem de signals sobre outras formas
     11de se fazer isso é que com signals é possível vincular quantas funções quiser
     12a um mesmo signal, que eles serão chamados em ordem.
     13
     14Siga os passos abaixo:
     15
     161. Supondo que sua aplicação se chama "minha_app" que contenha as classes
     17"Produto" e "Categoria", crie um arquivo "app_signals.py" em sua aplicação e
     18insira as linhas abaixo::
     19
     20{{{
     21from django.dispatch import Signal
     22obter_informacoes_adicionais_do_produto = Signal()
     23}}}
     24
     25como o nome sugere, vamos criar um comportamento para requisitar informações
     26adicionais de um determinado produto e permitir que várias funções para isso
     27sejam chamadas em tal momento sem nenhum vínculo direto.
     28
     292. Agora edite o arquivo "views.py" de sua aplicação, adicionando as seguintes
     30linhas::
     31
     32{{{
     33from models import Produto
     34from app_signals import obter_informacoes_adicionais_do_produto
     35
     36def produto(request, produto_id):
     37    produto = Produto.objects.get(id=produto_id)
     38   
     39    informacoes_adicionais = []
     40   
     41    obter_informacoes_adicionais_do_produto.send(
     42        produto,
     43        informacoes_adicionais=informacoes_adicionais,
     44        request=request
     45        )
     46   
     47    return render_to_response(
     48        'minha_app/produto.html',
     49        locals(),
     50        )
     51}}}
     52
     53esta view está preparada para carregar as informações adicionais numa lista
     54que receberá essas informações através do signal.
     55
     563. Crie agora um template na pasta de templates de sua aplicação, com o nome
     57"produto.html" (ou seja, "minha_app/templates/produto.html")::
     58
     59{{{
     60<html>
     61    <body>
     62        {{ produto.descricao }}
     63
     64        <ul>
     65            {% for info in informacoes_adicionais %}
     66            <li>{{ info }}</li>
     67            {% endfor %}
     68        </ul>
     69    </body>
     70</html>
     71}}}
     72
     73esse template irá listar as informações adicionais resgatadas através do signal.
     74
     754. Agora vamos declarar uma função para vincular ao signal. Esta função pode
     76ser declarada em qualquer módulo que seja carregado no momento da inicialização
     77do projeto. Vamos editar então o arquivo "models.py" para criá-la, adicionando
     78as seguintes linhas::
     79
     80{{{
     81from app_signals import obter_informacoes_adicionais_do_produto
     82
     83def informacoes(signal, sender, **kwargs):
     84    produto=sender
     85    kwargs['informacoes_adicionais'].append(produto.id)
     86    kwargs['informacoes_adicionais'].append('outra info')
     87
     88obter_informacoes_adicionais_do_produto.connect(informacoes)
     89}}}
     90
     91esse codigo irá adicionar algumas linhas à lista de informações.
     92
     935. Por fim, adicione a seguinte URL ao arquivo de "urls.py" do projeto::
     94
     95{{{
     96url(r'^produtos/(?P<produto_id>\d+)/$', 'minha_app.views.produto'),
     97}}}
     98
     99Pronto! Agora ao carregar essa página em seu navegador, será exibida uma lista
     100com as informações adicionadas pela função vinculada ao signal.
     101
     102----
     103Tire outras dúvidas em nosso [wiki:CookBookPortugues CookBook em Português]
Back to Top