Attention

This document was written for an unsupported version of Plone, Plone 2.1.x, and was last updated 1602 days ago.

For more information, see the version support policy.

To learn how to upgrade to the current version of Plone, read the upgrade manual.

KeyError during restrictedTraverse

by Mikko Ohtamaa last modified Dec 30, 2008 03:08 PM
Page template engine is unable to find files. KeyError occuring during restrictedTraverse. E.g. KeyError: 'field'.

You have a traceback similiar to this:

Traceback (innermost last):
  Module ZPublisher.Publish, line 113, in publish
  Module ZPublisher.mapply, line 88, in mapply
  Module ZPublisher.Publish, line 40, in call_object
  Module Products.Archetypes.BaseFolder, line 57, in __call__
  Module Shared.DC.Scripts.Bindings, line 311, in __call__
  Module Shared.DC.Scripts.Bindings, line 348, in _bindAndExec
  Module Products.CMFCore.FSPageTemplate, line 188, in _exec
  Module Products.CMFCore.FSPageTemplate, line 127, in pt_render
  Module Products.PageTemplates.PageTemplate, line 102, in pt_render
   - <FSPageTemplate at /Plone/base_view used for /Plone/usability>
  Module TAL.TALInterpreter, line 206, in __call__
  Module TAL.TALInterpreter, line 250, in interpret
  Module TAL.TALInterpreter, line 709, in do_useMacro
  Module TAL.TALInterpreter, line 250, in interpret
  Module TAL.TALInterpreter, line 426, in do_optTag_tal
  Module TAL.TALInterpreter, line 411, in do_optTag
  Module TAL.TALInterpreter, line 406, in no_tag
  Module TAL.TALInterpreter, line 250, in interpret
  Module TAL.TALInterpreter, line 740, in do_defineSlot
  Module TAL.TALInterpreter, line 250, in interpret
  Module TAL.TALInterpreter, line 426, in do_optTag_tal
  Module TAL.TALInterpreter, line 411, in do_optTag
  Module TAL.TALInterpreter, line 406, in no_tag
  Module TAL.TALInterpreter, line 250, in interpret
  Module TAL.TALInterpreter, line 688, in do_defineMacro
  Module TAL.TALInterpreter, line 250, in interpret
  Module TAL.TALInterpreter, line 732, in do_defineSlot
  Module TAL.TALInterpreter, line 250, in interpret
  Module TAL.TALInterpreter, line 426, in do_optTag_tal
  Module TAL.TALInterpreter, line 411, in do_optTag
  Module TAL.TALInterpreter, line 406, in no_tag
  Module TAL.TALInterpreter, line 250, in interpret
  Module TAL.TALInterpreter, line 688, in do_defineMacro
  Module TAL.TALInterpreter, line 250, in interpret
  Module TAL.TALInterpreter, line 426, in do_optTag_tal
  Module TAL.TALInterpreter, line 411, in do_optTag
  Module TAL.TALInterpreter, line 406, in no_tag
  Module TAL.TALInterpreter, line 250, in interpret
  Module TAL.TALInterpreter, line 709, in do_useMacro
  Module TAL.TALInterpreter, line 250, in interpret
  Module TAL.TALInterpreter, line 477, in do_setLocal_tal
  Module Products.PageTemplates.TALES, line 221, in evaluate
   - URL: file:Archetypes/skins/archetypes/base.pt
   - Line 82, Column 8
   - Expression: standard:'field_macro | here/widgets/field/macros/view'
   - Names:
      {'container': <PloneSite at /Plone>,
       'context': <ApplicationFolder at /Plone/usability>,
       'default': <Products.PageTemplates.TALES.Default instance at 0x0145B670>,
       'here': <ApplicationFolder at /Plone/usability>,
       'loop': <Products.PageTemplates.TALES.SafeMapping object at 0x0450F120>,
       'modules': <Products.PageTemplates.ZRPythonExpr._SecureModuleImporter instance at 0x0144E800>,
       'nothing': None,
       'options': {'args': ()},
       'repeat': <Products.PageTemplates.TALES.SafeMapping object at 0x0450F120>,
       'request': <HTTPRequest, URL=http://localhost/usability>,
       'root': <Application at >,
       'template': <FSPageTemplate at /Plone/base_view used for /Plone/usability>,
       'traverse_subpath': [],
       'user': admin}
  Module Products.PageTemplates.Expressions, line 183, in __call__
  Module Products.PageTemplates.Expressions, line 171, in _eval
  Module Products.PageTemplates.Expressions, line 127, in _eval
   - __traceback_info__: here
  Module Products.PageTemplates.Expressions, line 306, in restrictedTraverse
   - __traceback_info__: {'path': ['widgets', 'field', 'macros', 'view'], 'TraversalRequestNameStack': ['view', 'macros']}
  Module OFS.ObjectManager, line 704, in __getitem__
KeyError: 'field'

Looks like something was unable to access "field" which is part of some object. Crucial information here is traceback_info:

__traceback_info__: {'path': ['widgets', 'field', 'macros', 'view'], 'TraversalRequestNameStack': ['view', 'macros']}

Here you can see page template path which was accessed. In this case, it was widgets/field.pt -> macros/view. Page template was unable to find field.pt in widgets directory, thus KeyError: "field".

This is caused by missing files in skin folders. In my case, I had created widgets folder under the skin folder of my own product. This override Archetypes internal skin folder, thus making field.pt unavailable. The solution was to rename my skins/usability/widgets folder to skins/usability/usability_widgets.