[Zope] Newbie: Missing a Variable (TAL/METAL Question)
Dieter Maurer
dieter at handshake.de
Sat Jul 29 16:01:47 EDT 2006
beno - wrote at 2006-7-29 10:09 -0700:
> ...
> <tr tal:repeat="item batch">
> <tal:block define="global number repeat/item/number">
> <td tal:content="number">1</td>
> <td tal:content="item/title">title</td>
> <td><tal:content metal:use-macro="here/?number/macros/author">author</tal:content></td>
> <td><tal:content metal:use-macro="here/?number/macros/content">content</tal:content></td>
> <td tal:content="item/bobobase_modification_time">
> modification date</td>
> </tal:block>
> </tr>
> ...
> Sorry, a site error occurred.Traceback (innermost last):
> ...
> Line 22, Column 8
> Expression: standard:'here/?number/macros/author'
> ...
> Module Products.PageTemplates.Expressions, line 107, in _eval
>TypeError: iteration over non-sequence (Also, an error occurred while attempting to render the standard error message.)
This one is a bit more difficult: you need to look at the source code
to find out what goes wrong.
The traceback again tells you that the problem is
with "here/?number/macros/author".
Moreover, it tells you that the exception is raised in line 107
of "Module Products.PageTemplates.Expressions".
The code, you see there is "path[i:i+1] = list(val)".
I see from this code (it is okay when you do not yet see it),
that "list(val)" is the problem.
You must now look a bit around and take names seriously.
The code aroung is:
if self._dp:
path = list(path) # Copy!
for i, varname in self._dp:
val = vars[varname]
if isinstance(val, StringType):
path[i] = val
else:
# If the value isn't a string, assume it's a sequence
# of path names.
path[i:i+1] = list(val)
This loop is responsible to replace the "?varname" occurrencies in your
path by the value of the variable "varname".
As you see, the value may either be a string or a sequence of paths.
In your case, it is an integer and "list(<some_integer>)" results
in the "TypeError" you observe.
Add "number python:`number`" after your definition of "number", i.e.
<tal:block define="number repeat/item/number; number python:`number`">
I removed the "global" (as you no longer need it due to the introduction
of "tal:block").
The "`...`" is a Python operator equivalent to
a call to "repr(...)" which converts into a string.
--
Dieter
More information about the Zope
mailing list