[Grok-dev] Re: Grok patterns for content types

Martijn Faassen faassen at startifact.com
Thu Jul 17 15:09:05 EDT 2008


Hey Martin,

Thanks for the questions, sorry it took a few days to answer.

Martin Aspeli wrote:
> I'm interested in experimenting with Grok-like patterns in Zope 2 and 
> Plone. In particular, I want to try to make it possible to build a 
> content type from a schema interface, a class for the persistent object, 
> a default view, and edit form and an add form.
> 
> What is the current "canonical" pattern for this in Grok? I have skimmed 
> some of the documentation, but I'd quite like to see an example or have 
> it spelled out, just so that I don't end up making incorrect assumptions.
> 
> How does Grok deal with add- and edit- forms? Is there a standard way to 
> do "configure-and-create" add forms without having to duplicate an edit 
> form?

I'm not sure what you mean about duplicating an edit form with add forms.

The default in Grok is pretty minimal already:

class Edit(grok.EditForm):
    form_fields = grok.Fields(ISomeInterface)

    @grok.action("Submit")
    def handle(self, **kw):
        self.applyData(self.context, **kw)

this will work on a context that doesn't have much logic of its own. Add 
forms are similar.

an add form would typically be a view for a container:

class Add(grok.EditForm)
    form_fields = grok.Fields(ISomeInterface)

    @grok.action("Add")
    def handle(self, **kw):
        self.context['name'] = obj = Object()
        self.applyData(obj, **kw)

This is so minimal it doesn't really feel very much like duplication...

If you want to do higher-level approaches where add and edit forms 
automatically exist for some content object just supplying the schema, 
we don't really have this yet. This would be part of the hoped-for crud 
in Grok project.

 > Finally, I'm curious about how Grok implements the logic that says a
 > view defined in the same module as a content type/model class defaults
 > to being a view for that content type, and a template with the same name
 > as the view ends up being the template for that view.
 >
 > Is there some standard support for this in martian or grokcore.component?
 >

Yes, it's in grokcore.component now, we factored it out in the 
Grokkerdam sprint to support things like megrok.rdb (and hopefully soon 
megrok.rdf).

If you want to create a new model object that views auto-associate with 
and the like, you should implement grokcore.component.interfaces.IContext.

Making this work for containers still currently requires the Grok core 
however (grok.interfaces.IContainer). The only thing different for 
containers if I recall correctly is setting up different traversers, 
however.

Regards,

Martijn



More information about the Grok-dev mailing list