[Zope] Calling dynamic zsql method from zpt?

J Cameron Cooper jccooper at jcameroncooper.com
Fri Nov 28 18:54:06 EST 2003


Nick Bower wrote:
 > What I need is something like this:

>> >
>> > <div tal:define="sqlRows
>> > nocall:here/ZSQLTerritoryList(parent_id=parent_id)">
>> >   <select name="country_list">
>> >   <option value="">ANY</option>
>> >   <option tal:repeat="sqlRow sqlRows" ...
>> >   etc...
>> >
>> > but obviously the first line of code doesn't work.  How else are
>> > variables passed do zsql methods from page templates?
>
You must use a Python expression, and not a TALES expression. TALES is 
path-like, and has no support for arguments.

>> What happens if you change the call to:
>> <div tal:define="sqlRows
>> python:here.ZSQLTerritoryList(parent_id=parent_id)">
>
> Thanks.  But then why does zope go to the trouble of having a "nocall:"? 

'nocall' is for getting a handle to a method. Sort of like::

 def foo():
   print "A"

 bar = foo

 bar()

The standard (calling) operation gets a method's results. It's the 
difference bewteen parens and no parens.

> Would multiple operations on subsequent sqlRows variables not result 
> in multiple queries in the above python implementation?  If not, then 
> I'm safe and it's exactly what I need :-)

You're safe. It binds the results, as per above. Using 'nocall' is very 
rare. I've seen a legit use in the wild only a couple of times.

            --jcc




More information about the Zope mailing list