[Zope3-Users] z3c.form: Data Manager - getting value via dm.query() instead of dm.get()
Roger Ineichen
dev at projekt01.ch
Thu Aug 14 06:20:03 EDT 2008
Hi Hermann
> Betreff: Re: AW: AW: [Zope3-Users] z3c.form: Data Manager -
> getting value via dm.query() instead of dm.get()
>
>
> > Hi Herman
> >
> >> Betreff: Re: AW: [Zope3-Users] z3c.form: Data Manager -
> getting value
> >> via dm.query() instead of dm.get()
> >
> > [...]
> >
> >> But I would nevertheless suggest to implement some kind of
> "switch"
> >> that decides if an error is raised or NOVALUE is returned
> in case a
> >> value is missing in the underlying object.
> >
> > I don't understand that.
> >
> > Why whould you like to store a default value if a value is missing.
> > That's just a write access for storing what default returns anyway.
>
> Hmmm, perhaps I have to explain my case better:
>
> Normally, z3c.forms are used to edit/display content objects,
> which is e.g. a "person object" with attributes such as
> "name, etc.", which are then mapped to fields/widgets. In
> case the underlying data object is a dictionary, this
> dictionary has to provide all key/value pairs as specified in
> the field.fields().
>
> In my case, I'm creating a search form. This search form does
> not store any data into a content object, it just calls a
> specific search function.
> However, the values in the search form should be remembered,
> so that if the user comes back to the form, it is already
> prefilled. Therefore, I simply store the "data" dictionary of
> the button handler into the session and (mis)use this object
> as content object:
>
> def getContent():
> return session.get('searchformkey', {})
>
> def handle_search(self, action):
> data, errors = self.extractData()
> if errors:
> self.searched = None
> self.status = self.formErrorsMessage
> return
> self.do_search(data)
> self.session['searchformkey'] = data
>
> So, it may happen, that not all fields are filled out,
> therefore key/value pairs may be missing. If that happens,
> the widget routine throws an error.
> If I manage to overcome this error (e.g. by replacing the
> get() through
> query() routine in z3c.form.widget), my form works.
>
> Maybe, there's a better way to accomplish the above, but I
> could not think of one...
I understand. Ther must be something wrong.
Take a look at the AddForm implementation this one uses
ignoreContext = True. This forces to not store the values
to the object. Because it doesn't use applyChanges like
the EditForm does.
For a SearchForm, you can use extractData offered from
the form and do what every you need to do with the extracted
form values. e.g. store them into a session. You can setup
the widgets with this values later.
Or even better you can define a custom ISession object
which provides what you need. e.g. with useful default
values from the schema field definition. Such a custom
session object can be used within the EditForm and
you don't have to use the AddForm concept.
Such a search session object could look like:
class ISearchSession(ISession):
"""Message filter session."""
searchText = zope.schema.TextLine(
title=Search text',
description=u'The search text',
default=u'',
required=False)
class SearchSessioon(Session):
_spd = None
@Lazy
def spd(self):
return self.__getitem__('SEARCH_SESSION_KEY')
@apply
def searchText():
def get(self):
return self.spd.get('searchText', u'')
def set(self, searchText):
self.spd['searchText'] = searchText
return property(get, set)
I allways use such a session implementation because it
abstracts what you need, uses schema fields, offers
built in defaults and works well with z3c.form.
Note; I'm still not 100% sure if the get() or query()
usage in applyChanges is right or wrong. I hope to
find time to deep into that in the near future.
But I think nobody will understand the concept if we
implement a form property for use get or query in
applyChanges.
Hope the session concept works for you till someone
agrees/checks the get/query useage.
Regards
Roger Ineichen
> Best Regards,
> Hermann
>
> --
> hermann at qwer.tk
> GPG key ID: 299893C7 (on keyservers)
> FP: 0124 2584 8809 EF2A DBF9 4902 64B4 D16B 2998 93C7
>
>
>
More information about the Zope3-users
mailing list