[Zope3-Users] zope.schema.Object and custom widgets in formlib
Jachin Rupe
jachin at voltzsoftware.com
Thu May 18 13:34:06 EDT 2006
hi there
I am having trouble getting form's generated for zope.schema.Object.
After doing some more reading it looks like I should be using formlib
instead of zope.app.form.browser.add.AddView and
zope.app.form.browser.editview.EditView
(my new code will be at the bottom)
Which is fine because I was really having trouble getting
zope.schema.Object to work properly. Of course, now I am running
into the same basic problem with formlib. It looks like I need to
specify some sort of custom widget for my zope.schema.Object. If I
don't I get the same ComponentLookupError I was getting with the old
system.
I tried the zope.app.form.CustomWidgetFactory, and that actually got
that part of the form to show up but it didn't work right. If
someone could tell me what I should be doing that would be great.
Also.... one other kinda bizarre thing, in my formlib form all the
button text and messages where in German (I think, my German is a
little rusty).
An aside... I have been really surprised by the lack of other people
having the same problems or working examples else where. I think I'm
trying to do something very basic that would come up in lots of
applications. This makes me think that I'm going about this the
wrong way, or the solution is very simple and I'm just being too
dense to get it. So basically, if anyone out there has some
commentary on my approach to this problem I would really appreciate it.
thanks.
-jachin
# -=interfaces.py=-
from zope.interface import Interface
from zope.schema import TextLine, Int, Object
class IStreetAddress(Interface):
"""A street address"""
street = TextLine(
title=u"street",
description=u"",
required=False)
class IABookEntry(Interface):
"""An address book entry"""
streetAddress = Object(
schema=IStreetAddress,
title=u"Street Address",
description=u"",
required=False)
firstName = TextLine(
title=u"First Name",
description=u"",
required=False)
# -=entry.py=-
from zope.interface import implements
from zope.formlib import form
from zope.schema.fieldproperty import FieldProperty
from zope.app.form import CustomWidgetFactory
from zope.app.form.browser import ObjectWidget
from persistent import Persistent
from interfaces import IStreetAddress
from interfaces import IABookEntry
class StreetAddress(Persistent):
"""The Street Address object."""
implements(IStreetAddress)
class ABookEntry(Persistent):
"""The Address Book Entry object."""
implements(IABookEntry)
streetAddress = StreetAddress
firstName = u""
class ABookEntryEditView(form.EditForm):
form_fields = form.Fields(IABookEntry)
form_fields["streetAddress"].custom_widget =
^^^^^^^^^^^^
what should go here?
<!-- -=configure.zcml=- -->
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser">
<content class=".entry.StreetAddress">
<require
permission="zope.View"
interface=".interfaces.IStreetAddress"
/>
<require
permission="zope.ManageContent"
set_schema=".interfaces.IStreetAddress"
/>
</content>
<content class=".entry.ABookEntry">
<require
permission="zope.View"
interface=".interfaces.IABookEntry"
/>
<require
permission="zope.ManageContent"
set_schema=".interfaces.IABookEntry"
/>
</content>
<browser:page
for=".entry.IABookEntry"
name="index.html"
template="entry.pt"
class=".entry.ABookEntry"
permission="zope.Public"
/>
<browser:page
for=".entry.IABookEntry"
name="edit.html"
template="edit.pt"
class=".entry.ABookEntryEditView"
menu="zmi_views"
title="Edit"
permission="zope.ManageContent"
/>
<browser:addMenuItem
title="ABook Entry"
class=".entry.ABookEntry"
permission="zope.ManageContent"
/>
</configure>
<!-- -=entry.pt=- -->
<html metal:use-macro="context/@@standard_macros/view">
<body>
<div metal:fill-slot="body" tal:content="view">
</div>
</body>
</html>
<!-- -=edit.pt=- -->
<html metal:use-macro="context/@@standard_macros/view">
<body>
<div metal:fill-slot="body" tal:content="view">
</div>
</body>
</html>
More information about the Zope3-users
mailing list