[Zope] Questions about DocumentTemplate.

Brian Lloyd Brian@digicool.com
Tue, 23 Mar 1999 10:15:45 -0500


Hi Mark.

I've cc'ed this to the zope list, since others may find this
useful.

> I want DocTemplate to expose an object model, and it seems
> perfect for the task.  However, Im having trouble using "."
> expressions.
> 
> Code speaks louder than words, so my code is:
> ##
> class Spam:
> 	def eggs(self):
> 		return "Eggs"
> 
> spam=Spam()
> 
> from DocumentTemplate import *
> ss=HTML('Eggs are <!--#var expr="spam.eggs()"-->')
> print ss(spam=spam)
> 
> ss=String('Eggs are %(spam.eggs)s')
> print ss(spam=spam)
> ##
> 
> What Im hoping to do should be quite obvious - I want to refer to
> "spam.eggs" in the DTML.
> 
> With the HTML example, #var expr="spam.eggs()" is the best I can
> get.  It seems ugly to me, and I feel there must be a better way.

The <!--#var expr="spam.eggs()"--> is a perfectly valid way to do
it. Another way would be to use the "with" tag:

<!--#with spam-->
  <!--#var eggs-->
<!--#/with-->

Neither is really "more correct" than the other, though the with
construct is probably cleaner in situations where you use many
services of the object:

<!--#with spam-->
  <!--#var eggs-->
  <!--#var method_one-->
  <!--#var method_two-->
  <!--#var method_three-->
<!--#/with-->


> Using the String example, I can't make _anything_ work.
> 
> Any I missing something?  Is there something I can do so that
> String('Eggs are %(spam.eggs)s') does what I want?

Hmm - it appears that the expr support is currently broken
for the python string format syntax. We'll take a look at
that. You can, however, also use the with construct here too:

ss=String('eggs are %(with spam)[ %(eggs)s %(with)]')


Just in case you hadn't found them already, the latest DTML manuals
are on the zope site at: http://www.zope.org/Documentation/Guides/DTML.
They contain some examples that try to demonstrate common DTML idioms.


Brian Lloyd        brian@digicool.com
Software Engineer  540.371.6909              
Digital Creations  http://www.digicool.com