[Zope] rendering client object in dtml method

Dieter Maurer dieter@handshake.de
Mon, 19 Aug 2002 21:47:16 +0200


Dave Peticolas writes:
 > Hello, I am a Zope beginner and have a hopefully simple question.
 > I want to use a dtml method to format the content of a dtml document
 > which is the client object when the dtml method is called.
 > 
 > For example, <http://dtml_doc/dtml_method> would, if I understand
 > correctly, invoke dtml_method with dtml_doc as the client object.
 > 
 > Given my understanding, I would think a statement such
 > as the following in dtml_method
 > 
 >   ...
 >   <dtml-var this>
 >   ...
 > 
 > would produce the rendered contents of dtml_doc appropriate for display,
 > i.e., the contents you would get with <dtml-var dtml_doc>.
 > 
 > However, said statement results in the rendered contents of dtml_doc
 > with the html special characters escaped to display literally rather 
 > than be intepreted by the browser.
You can read in the Zope Book or in

  <http://www.dieter.handshake.de/pyprojects/zope/book/chap3.html>

how "<dtml-var var>" works.

Essentially, it looks up "var" and calls it, if it is callable.
The result is then converted into a string.

In your case, "this" is a method returning the object.
As a method, it is callable. "<dtml-var this>" does this.
The result is your DTML Document instance. It is then
converted into a string (by calling its "__str__" method)
with the result you see.

You need to render (call) the result of "this" a second time.
There are at least the following ways:

  1.  <dtml-let client=this><dtml-var client></dtml-let>

      This first calls "this" (giving your DTML Document and binding
      it to client) and then calls "client" (giving you the rendered
      page).

  2.  <dtml-var expr="_.render(this())">

      This renders "this()" the same way "<dtml-var var>" would
      do when "var" where bound to "this()".


Dieter