[Zope-dev] Acquisition in a DTML Tag
Brett Carter
brett@kavi.com
12 Sep 2000 10:57:57 -0700
>>>>> "Shane" == Shane Hathaway <shane@digicool.com> writes:
Shane> Brett Carter wrote:
>> >>>>> "Brett" == Brett Carter <brett@kavi.com> writes:
>>
Brett> I've defined my own dtml tag (i.e. <dtml-foo></dtml-foo>)
Brett> and I am trying to look up an object depending on the
Brett> arguments passed to my tag. The python class that defines
Brett> the tag inherits from Acquisition.Implicit, but 'self'
Brett> doesn't contain any of the Acquisition hiarchy. It seems
Brett> like this must be possible, since the <dtml-var> tag must
Brett> have to do an object lookup somewhere for objects passed to
Brett> it to render. Can anybody shed some light on this? Is it
Brett> doable? TIA -Brett
>> Ok, So after some *major* hacking, i've realized that the 'md'
>> passed into the render() method of my dtml tag contains the
>> namespace, and is of type 'TemplateDict' which appears to
>> contain a stack of 'MultiMapping's. Weird. Well, anyways, I
>> just used the 'has_key' and 'getitem' methods to lookup my
>> item. The question now is how do I create a new object in the
>> current namespace? It looks like the TemplateDict is a
>> read-only type of data structure. Anybody? TIA -Brett
Shane> Look at render() of DT_With.py. It does an
Shane> md._push(<mapping containing new names>) then, in a
Shane> try/finally clause, calls DT_Util.render_blocks(). In the
Shane> finally clause, it does md._pop().
Shane> Shane
I'm still confused. Ok, so render gets passed 'md', which is a
TemplateDict, which contains a MultiMapping, which looks like a stack
of dictionaries, which I am guessing is some sort of namespace stack.
So looking at the DT_with.py, it looks like, to create an object in
the current namespace, I have to wrap it in an InstanceDict, and push
it onto the 'md' using 'md._push'. Does this also cause the new
object to be saved in the ZODB? Or do I have to manually add it there
too? Also, what does render_blocks do? Why does DT_with.py's
render() return it? Do I have to run render_blocks() to insert my new
object into the namespace? TIA
-Brett