[Zope-dev] Creating a variable in a DTML method that may be modified

Jeff Rush jrush@taupro.com
Tue, 04 Feb 2003 16:51:19 -0600


Other than explictly passing arguments, the shareable namespace, _, is 
the logical place to exchange such variables btw DTML and 
Script(Python).  However, the namespace object, a TemplateDict, only 
allows you to PUSH/POP spaces, not set/change variables, so you have to 
find or provide something in the namespace that is mutable.  You found 
REQUEST, and there is also SESSION.  And you can provide your own 
mutable namespace as a dictionary:

----- cut here ----- DTML Method
<dtml-let myvars="{ 'somevar': 5 }"> <!-- Create My Own Namespace -->
   <dtml-with myvars mapping> <!-- and Push onto the Search Stack -->

     Before: <dtml-var somevar>
     <dtml-call mypython>
     After: <dtml-var somevar>

   </dtml-with>
</dtml-let>

----- cut here ----- Script(Python) Method
## Script (Python) "mypython"
##bind container=container
##bind context=context
##bind namespace=_
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
_['myvars']['somevar'] = 7

When the DTML Method is invoked, this will print:

   Before: 5
   After: 7

When the end of the DTML-WITH is reached, the namespace will be 
popped/discarded, so it won't be permanent, as you wish to avoid.

Hope this helps,

Jeff Rush


Asad Habib wrote:
> Hello. Does anyone know how to create a variable in a
> DTML method which may be updated by a Python script? I
> am currently using the set method of the REQUEST
> object to create a variable. However, creating a
> variable in this fashion renders it permanent. Any
> help would be appreciated. Thanks.