On Fri, Jun 15, 2007 at 10:52:24AM -0700, gnosis wrote: > I've been trying out the new z3c form package and like what I see. I am > having problems getting a subform in an AddForm though. The subform.txt > covers EditForms where you have a context object to work on, in an AddForm > the context is the underlying IContainer.
Really? Usually in Zope 3 (zope.app.form or zope.formlib) the context of an add form is the IAdding view. To get the container you have to use self.context.context. > Here is what I have, using formdemo examples as the basis. Any help on > getting this to work is greatly appreciated. > > IRestaurant with address attribute using schema.Object holding an IAddress. > > browser/restaurant.py > > class RestaurantAddForm(AddFormLayoutSupport, form.AddForm): > """Add form""" > > template = None > layout = None > contentName = None > label = u'Add Restaurant' > > fields = field.Fields(IRestaurant).omit('address') > > def update(self): > self.address = AddressAddForm(self.context.address, self.request) ## > <---- Problem area You did not say what the problem was. I suspect that you ought to have a simple subform here (nor an add form, since you're not going to add the address object into a container -- you're going to set it on an attribute; also not an edit form since the address object doesn't exist yet). I'm not familiar with z3c.form, but I'm betting that it follows the same conventions as the older Zope 3 form modules. > self.address.update() > super(RestaurantAddForm, self).update() > > def create(self, data): > r = Restaurant() > r.name = data['name'] > r.description = data['description'] > r.address = data['address'] > return r > > def add(self, object): > self._name = object.name > self.context[self._name] = object > return object > > def nextURL(self): > return absoluteURL(self.context[self._name], self.request) > > > browser/address.py > > class AddressAddForm(AddFormLayoutSupport, form.AddForm): > template = None > layout = None > contentName = None > label = u'Address' > > fields = field.Fields(IAddress) > prefix = u'address' > > browser/configure.zcml > > <!-- Restaurant Add Form --> > <z3c:pagelet > name="addRestaurant.html" > for="zope.app.folder.interfaces.IFolder" > class=".restaurant.RestaurantAddForm" > layer="metrod.app.layer.IMetroDBrowserLayer" > permission="zope.Public" /> > > <z3c:template > template="restaurant.pt" > for=".restaurant.RestaurantAddForm" > layer="metrod.app.layer.IMetroDBrowserLayer" /> > > <!-- Address Add Form --> > <z3c:pagelet > name="addAddress.html" > for="metrod.restaurant.interfaces.IAddress" > class=".address.AddressAddForm" > layer="metrod.app.layer.IMetroDBrowserLayer" > permission="zope.Public" /> > > <z3c:template > template="address.pt" > for=".address.AddressAddForm" > layer="metrod.app.layer.IMetroDBrowserLayer" /> Marius Gedminas -- Despite all appearances, your boss is a thinking, feeling, human being.
signature.asc
Description: Digital signature
_______________________________________________ Zope3-users mailing list Zope3-users@zope.org http://mail.zope.org/mailman/listinfo/zope3-users