[Zope3-Users] z3c.form and subforms in an AddForm?

Mats Nordgren mats at ronin-group.org
Fri Jun 22 14:36:48 EDT 2007


Stephan,

Thanks again for you help.

I'm still having the ErrorViewSnippet problem.  I've gone over and over the
message example in formdemo and can't see anything different in my setup
from the demo.  The demo works fine but mine throws the ErrorViewSnippet
error when I submit an AddForm with missing input.  EditForm works correct
though.

Here is the full traceback.  I'll also include the browser files at the end.

Traceback (most recent call last):
  Module zope.publisher.publish, line 133, in publish
    result = publication.callObject(request, obj)
  Module zope.app.publication.zopepublication, line 161, in callObject
    return mapply(ob, request.getPositionalArguments(), request)
  Module zope.publisher.publish, line 108, in mapply
    return debug_call(obj, args)
   - __traceback_info__: <security proxied
z3c.pagelet.zcml.RestaurantAddForm instance at 0x033DE610>
  Module zope.publisher.publish, line 114, in debug_call
    return obj(*args)
  Module z3c.formui.layout, line 40, in __call__
    return layout(self)
  Module zope.app.pagetemplate.viewpagetemplatefile, line 51, in __call__
    sourceAnnotations=getattr(debug_flags, 'sourceAnnotations', 0),
  Module zope.pagetemplate.pagetemplate, line 117, in pt_render
    strictinsert=0, sourceAnnotations=sourceAnnotations)()
  Module zope.tal.talinterpreter, line 271, in __call__
    self.interpret(self.program)
  Module zope.tal.talinterpreter, line 346, in interpret
    handlers[opcode](self, args)
  Module zope.tal.talinterpreter, line 534, in do_optTag_tal
    self.no_tag(stuff[-2], stuff[-1])
  Module zope.tal.talinterpreter, line 516, in no_tag
    self.interpret(program)
  Module zope.tal.talinterpreter, line 346, in interpret
    handlers[opcode](self, args)
  Module zope.tal.talinterpreter, line 745, in do_insertStructure_tal
    structure = self.engine.evaluateStructure(expr)
  Module zope.tales.tales, line 696, in evaluate
    return expression(self)
   - D:\Mats\Zope\lib\python\metrod\app\skin\template.pt
   - Line 22, Column 2
   - Expression: <StringExpr u'pagelet'>
   - Names:
      {'args': (),
       'context': <zope.app.folder.folder.Folder object at 0x01B80BF0>,
       'default': <object object at 0x0099C568>,
       'loop': {},
       'nothing': None,
       'options': {},
       'repeat': {},
       'request': <zc.resourcelibrary.publication.Request instance
URL=http://localhost:50080/++skin++MetroDSkin/@@addRestaurant.html>,
       'template':
<zope.app.pagetemplate.viewpagetemplatefile.ViewPageTemplateFile object at
0x023361F0>,
       'usage': <zope.pagetemplate.pagetemplate.TemplateUsage object at
0x033DE8D0>,
       'view': <z3c.pagelet.zcml.RestaurantAddForm object at 0x033DE610>,
       'views': <zope.app.pagetemplate.viewpagetemplatefile.ViewMapper
object at 0x033DE4F0>}
  Module zope.contentprovider.tales, line 74, in __call__
    return provider.render()
  Module z3c.pagelet.provider, line 43, in render
    return self.__parent__.render()
  Module z3c.form.form, line 186, in render
    return super(AddForm, self).render()
  Module z3c.form.form, line 95, in render
    return template(self)
  Module zope.app.pagetemplate.viewpagetemplatefile, line 51, in __call__
    sourceAnnotations=getattr(debug_flags, 'sourceAnnotations', 0),
  Module zope.pagetemplate.pagetemplate, line 117, in pt_render
    strictinsert=0, sourceAnnotations=sourceAnnotations)()
  Module zope.tal.talinterpreter, line 271, in __call__
    self.interpret(self.program)
  Module zope.tal.talinterpreter, line 346, in interpret
    handlers[opcode](self, args)
  Module zope.tal.talinterpreter, line 891, in do_useMacro
    self.interpret(macro)
  Module zope.tal.talinterpreter, line 346, in interpret
    handlers[opcode](self, args)
  Module zope.tal.talinterpreter, line 957, in do_defineSlot
    self.interpret(block)
  Module zope.tal.talinterpreter, line 346, in interpret
    handlers[opcode](self, args)
  Module zope.tal.talinterpreter, line 861, in do_defineMacro
    self.interpret(macro)
  Module zope.tal.talinterpreter, line 346, in interpret
    handlers[opcode](self, args)
  Module zope.tal.talinterpreter, line 536, in do_optTag_tal
    self.do_optTag(stuff)
  Module zope.tal.talinterpreter, line 521, in do_optTag
    return self.no_tag(start, program)
  Module zope.tal.talinterpreter, line 516, in no_tag
    self.interpret(program)
  Module zope.tal.talinterpreter, line 346, in interpret
    handlers[opcode](self, args)
  Module zope.tal.talinterpreter, line 855, in do_condition
    self.interpret(block)
  Module zope.tal.talinterpreter, line 346, in interpret
    handlers[opcode](self, args)
  Module zope.tal.talinterpreter, line 855, in do_condition
    self.interpret(block)
  Module zope.tal.talinterpreter, line 346, in interpret
    handlers[opcode](self, args)
  Module zope.tal.talinterpreter, line 824, in do_loop_tal
    self.interpret(block)
  Module zope.tal.talinterpreter, line 346, in interpret
    handlers[opcode](self, args)
  Module zope.tal.talinterpreter, line 534, in do_optTag_tal
    self.no_tag(stuff[-2], stuff[-1])
  Module zope.tal.talinterpreter, line 516, in no_tag
    self.interpret(program)
  Module zope.tal.talinterpreter, line 346, in interpret
    handlers[opcode](self, args)
  Module zope.tal.talinterpreter, line 623, in do_insertText_tal
    text = self.engine.evaluateText(stuff[0])
  Module zope.tales.tales, line 704, in evaluateText
    text = self.evaluate(expr)
  Module zope.tales.tales, line 696, in evaluate
    return expression(self)
   - C:\Python24\Lib\site-packages\z3c\formui\div-form.pt
   - Line 22, Column 10
   - Expression: <PathExpr standard:u'error/widget/label'>
   - Names:
      {'args': (),
       'context': <zope.app.folder.folder.Folder object at 0x01B80BF0>,
       'default': <object object at 0x0099C568>,
       'loop': {},
       'nothing': None,
       'options': {},
       'repeat': {},
       'request': <zc.resourcelibrary.publication.Request instance
URL=http://localhost:50080/++skin++MetroDSkin/@@addRestaurant.html>,
       'template':
<zope.app.pagetemplate.viewpagetemplatefile.ViewPageTemplateFile object at
0x0234E9F0>,
       'usage': <zope.pagetemplate.pagetemplate.TemplateUsage object at
0x033DEC90>,
       'view': <z3c.pagelet.zcml.RestaurantAddForm object at 0x033DE610>,
       'views': <zope.app.pagetemplate.viewpagetemplatefile.ViewMapper
object at 0x033DEBD0>}
  Module zope.tales.expressions, line 217, in __call__
    return self._eval(econtext)
  Module zope.tales.expressions, line 194, in _eval
    ob = self._subexprs[-1](econtext)
  Module zope.tales.expressions, line 124, in _eval
    ob = self._traverser(ob, element, econtext)
  Module zope.app.pagetemplate.engine, line 68, in __call__
    request=request)
  Module zope.traversing.adapters, line 164, in traversePathElement
    return traversable.traverse(nm, further_path)
   - __traceback_info__: (<ErrorViewSnippet for RequiredMissing>, 'widget')
  Module zope.traversing.adapters, line 52, in traverse
    raise TraversalError(subject, name)
   - __traceback_info__: (<ErrorViewSnippet for RequiredMissing>, 'widget',
['label'])
TraversalError: (<ErrorViewSnippet for RequiredMissing>, 'widget') 

browser/restaurant.py

from metrod.restaurant.restaurant import Restaurant
from metrod.restaurant.interfaces import IRestaurant
from zope.app.container.interfaces import INameChooser
from zope.traversing.browser import absoluteURL
from z3c.formui import layout

from z3c.form import field, form


class RestaurantAddForm(layout.AddFormLayoutSupport, form.AddForm):
    fields = field.Fields(IRestaurant)
    template = None
    layout = None
    contentName = None
    label = u'Add Form'
    
    def create(self, data):
        r = Restaurant()
        r.name = data['name']
        r.description = data['description']
        return r
        
    def add(self, object):
        nc = INameChooser(self.context)
        self._name = nc.chooseName(object.name, object)
        if not nc.checkName(self._name, object):
                raise ValueError("PROBLEM")
        self.context[self._name] = object
        return object
    
    def nextURL(self):
        return absoluteURL(self.context[self._name], self.request)

class RestaurantEditForm(layout.FormLayoutSupport, form.EditForm):
    fields = field.Fields(IRestaurant)

browser/restaurant.pt

<div metal:use-macro="macro:form" />

browser/configure.zcml

<configure
  xmlns="http://namespaces.zope.org/browser"
  xmlns:z3c="http://namespaces.zope.org/z3c">

  <z3c:pagelet
    name="addRestaurant.html"
    for="zope.app.container.interfaces.IContainer"
    class=".restaurant.RestaurantAddForm"
    layer="metrod.app.layer.IMetroDBrowserLayer"
    permission="zope.Public" />
    
  <z3c:template
    template="restaurant.pt"
    for=".restaurant.RestaurantAddForm"
    layer="metrod.app.layer.IMetroDBrowserLayer" />

  <z3c:pagelet
    name="index.html"
    for="metrod.restaurant.interfaces.IRestaurant"
    class=".restaurant.RestaurantEditForm"
    layer="metrod.app.layer.IMetroDBrowserLayer"
    permission="zope.Public" />
    
  <z3c:template
    template="restaurant.pt"
    for=".restaurant.RestaurantEditForm"
    layer="metrod.app.layer.IMetroDBrowserLayer" />

</configure>


> > Perhaps unrelated but I had this working before. I'm using formui and
> I'm
> > getting a "TraversalError: (<ErrorViewSnippet for RequiredMissing>,
> > 'widget')".  I tried to trim out all the sub-form stuff I've messed
> around
> > with and replaced a simple object with two textlines one of which is
> > required.  This happens when I'm submitting the form without an entry in
> > required field.  With data it works just fine and adds the object.  The
> > addform is using the macro:form from formui.  Any ideas as to where this
> > comes from and how I can fix it?
> 
> No idea. Could you provide the complete traceback?
> 
> Regards,
> Stephan
> --
> Stephan Richter
> CBU Physics & Chemistry (B.S.) / Tufts Physics (Ph.D. student)
> Web2k - Web Software Design, Development and Training



More information about the Zope3-users mailing list