2008/4/2, Edgard Costa <[EMAIL PROTECTED]>:
> Zé Henrique
>
>  Obrigado pela resposta.
>
>  Mas, poderia dar um exemplo mais "explicito" do uso de:
>
> <span tal:replace="structure context/meu_script_python"/>
>
>
> Explicando melhor o meu segundo caso. Estou trabalhando um formulário
>  e desejo pegar os valores digitados no campo valor1 e valor2 e
>  realizar algumas contas e mostrar na tela.
>  O problema e que não estou encontrando a maneira certa de capturar os
>  valores e em seguida mostra-los da tela.
>  No livro do zope, que acho meio confuso, mostra algo como:
>  <span tal:define="campo request/ campo"></span>
>
>  A resposta que tenha na tela é: (, 'valor1')
>  Não aparece nem os campos txt para captura.
>
Ok, vamos lá.  Em primeiro lugar, eu não sou muito fã de scripts que
retornam fragmentos de HTML.  Creio que a apresentação de ser feita em
templates e o processamento em scripts.  De forma geral, é melhor
formatar os dados retornados pelos scripts (listas, dicionários,
strings, etc.) de forma que fique mais fácil de fazer a renderização
em HTML.  Assim, na minha opinião, seria melhor você alterar seu
template para que ficasse assim:

<tal:block define="results context/meu_script">
    <p>Sua soma eh: <span tal:replace="results/valor" /></p>
    <p>A segunda soma eh: <span tal:replace="results/soma" /></p>
</tal:block>

Agora, se for inevitável (?) retornar um fragmento de HTML, então para
apresentá-lo corretamente você deve utilizar a palavra-chave
structure, para que o código HTML seja interpretado corretamente.
Assim, se o seu script retorna algo assim:

return """<p>Sua soma eh: %d </p><p> A segunda soma eh: %d</p>""" %(valor,soma)

ao inserir a seguinte tag em seu template:

<span tal:content="structure context/meu_script" />

O fragmento HTML será interpretado e inserido corretamente em seu
template.  Faça um teste para verificar.

Quanto ao segundo caso, me parece que os scripts python têm algum
problema em retornar uma tupla, mas retornam listas e dicionários
tranquilamente.  Assim, prefira essas duas últimas formas para
retornar dados mais complexos.

Assim, o seu segundo exemplo poderia ficar assim:

#script

valor1=req.Calculo.getfirst('valor1')
valor2=req.Calculo.getfirst('valor2')
valor1,valor2=int(valor1),int(valor2)
soma={'soma1':valor1, 'soma2': valor2}
return soma

# template

<tal:block define="results context/meu_script">
    <p>Primeira soma: <span tal:replace="results/soma1" /></p>
    <p>Segunda soma: <span tal:replace="results/soma2" /></p>
</tal:block>

Zénrique

Responder a