[Grok-dev] Multiple models inside container

Martijn Faassen faassen at startifact.com
Wed Mar 23 19:06:13 EDT 2011


On 03/23/2011 01:24 PM, Lumir Jasiok wrote:

> OK, I understand concept and I like it. This is what I looking for. But
> I am not familiar with grok.traversable(). Sorry for trouble you, but do
> you have some small example? Will be possible edit objects inside
> container using EditForm?

Yes, it won't matter where the objects are, as long as the EditForm's 
context is the objects you want to edit, it should work.

> AFIK grok.context() inside EditForm should be
> just Application or Model object types?

Generally for an edit form you'd want the context to be the object you 
want to edit, and for an add form you'd want the context to be the 
collection (container) of objects you want to add to.

For an example, check here:

http://grok.zope.org/doc/1.3/reference/directives.html#grok-traversable

but for containers, you'd basically do this:

class MyApplication(grok.Application, grok.Model):
     grok.traversable('foo')
     grok.traversable('bar')

     def __init__(self):
          self.foo = FooContainer()
          self.bar = BarContainer()


Now myapp/foo and myapp/bar are your containers. You'd probably have add 
forms like this: myapp/foo/add and myapp/bar/add, and you'd have edit 
forms like this myapp/foo/1553/edit and myapp/bar/515353/edit. You'd 
make the add form for 'Foo' objects the context of FooContainer, and the 
same for bar and BarContainer.

Note that as I said previously, you might need an event to set up these 
containers instead, I'm not sure initialization will go nicely here - 
not 100% sure.

You could also choose to let MyApplication itself be a container, in 
which case you wouldn't need grok.traversable:

class MyApplication(grok.Application, grok.Container):
     def __init__(self):
          self['foo'] = FooContainer()
          self['bar'] = BarContainer()

but this design is a bit less nice, as really the application isn't 
really a container people can add and remove things to.

[snip]
> This code doesn't work. Problem is with isinstance(store,Store)
> evaluation. It always failed. I tried isinstance(store,context/Store)
> without success. Only working code is isinstance(store,object). But this
> is useless. How can I test if repeated object is Store or Employee
> object correctly inside page templates?

I would never do this within a template. I'd always write a helper 
method in Python to do this, and then call this from your template 
instead. I'd simply make a method that returns all stores. That makes it 
easier to test too. Page templates are restricted in various ways that I 
just don't want to have to deal with. In this case I don't know where 
the 'Store' class comes from in the template.

But anyway, if you change your application's design so that the stores 
are in a separate container, things will become simpler.

Regards,

Martijn



More information about the Grok-dev mailing list