[Zope3-Users] Nested lists- "iteration over non-sequence"

Daniel M danielm1 at fmguy.com
Sat Nov 11 05:28:33 EST 2006


Hi Kevin,
Thanks for the help! 

I've studied your example at
http://zope3demos.googlecode.com/svn/tags/zope3demos-200610-21/otherdemos/objectsofobjects2/ 
but I don't see how I could extend this example into a "List of List".

Suppose I want to change your IPerson to include a list, such as:

class IPerson(interface.Interface):
    first = schema.TextLine(title=u"firstname")
    last = schema.TextLine(title=u"lastname")
    names = schema.List(title=u'Names',
                          value_type=schema.TextLine(title=u"names"),
                          required=False)

I can't figure out how to create to modify the widgets so that
AddressBook will display correctly... I keep getting the "Iteration over
non sequence" exception.

I can create a custom widget for "names" (although I don't know if I
have to), but even then, what would I assign it to? 
If it should somehow be a subwidget of the Person subwidget, I have no
idea what the syntax for that is.

I'd be grateful if you could show me how to change the code to make this
work.

Regards, and thanks again,
Daniel.   


On Sat, 21 Oct 2006 15:08:16 -0700 (PDT), ksmith93940-dev at yahoo.com
said:
> Hi, Yes, one solution is custom widgets. Although I don't have a List of
> List example, I do have a List of Object example. It uses formlib,
> CustomWidgetFactory, ListSequenceWidget and ObjectWidget
> 
> http://zope3demos.googlecode.com/svn/tags/zope3demos-200610-21/otherdemos/objectsofobjects2/
> 
> Project at http://zope3demos.googlecode.com/
> 
> 
> Kevin Smith
> 
> ----- Original Message ----
> From: Daniel M <danielm1 at fmguy.com>
> To: zope3-users at zope.org
> Sent: Friday, October 20, 2006 2:47:36 PM
> Subject: [Zope3-Users] Nested lists- "iteration over non-sequence"
> 
> Hello, I'm new to Zope, and using Zope 3.3. I have managed to get a
> simple site running.
> 
> I am having trouble getting the web interface to let me edit an object
> that contains a list, where the type of values in the list, is an
> interface that also holds a list.  I can&#8217;t get this &#8220;list inside a list&#8221;
> setup to work correctly.
> 
> In my example, I have a Person object that contains a list of PersonInfo
> objects, where each PersonInfo contains a list of names.
> 
> When I enter the view for Person (based on EditForm), it displays an
> edit form as I would expect. However, when I try to add a PersonInfo to
> the list via the interface, an exception is raised:
> 
> &#8220;TypeError: iteration over non-sequence&#8221; 
> 
> (The full traceback is over 6 pages long, so I won&#8217;t post it, but it
> does mention &#8220;sequencewidget&#8221; many times).
>  
> 
> I've tried some variations to narrow down the problem:
> 
> *If I change PersonInfo to hold just a string instead of a list, it
> works!
> 
> *If I change Person to hold just a single PersonInfo instead of a list,
> it works!
> 
> * Therefore, it seems like my Zope site is set up OK, but for some
> reason Lists of objects with Lists raise an exception.
>  
> Am I missing something? Maybe I have to write some custom widget to get
> around this? Is this possibly a known problem?
> 
> The code:
> 
> ********** People.py *****************
> 
> class IPersonInfo(interface.Interface):
>     names = schema.List(
>         title=u"names",
>         unique=False,
>         value_type=schema.TextLine(title=u'name')
>     )
> 
> 
> class IPerson(interface.Interface):
>     ID = schema.TextLine(
>         title=u'ID',
>         description=u'Persons ID code')
> 
>     the_list = schema.List(
>         title=u"PersonInfo list",
>         unique=False,
>         value_type=schema.Object(IPersonInfo))
> 
> class PersonInfo(persistent.Persistent):    
>     interface.implements(IPersonInfo)
>     def __init__(self):
>         self.names = persistent.list.PersistentList()
> 
> def PersonInfoWidget(context,obj,request):
>     return ObjectWidget(context, request, PersonInfo)
> 
> class Person(persistent.Persistent):    
>     interface.implements(IPerson)
>     ID = "1-2-3"   
>     def __init__(self):
>         self.the_list = persistent.list.PersistentList()
> 
> 
> class AutoEditView(form.EditForm):
>     form_fields = form.Fields(IPerson)
> 
> class PersonInfoView(form.EditForm):
>     form_fields = form.Fields(IPersonInfo)
> 
> ********** end People.py *****************
> 
> configure.zcml doesn&#8217;t do anything unusual, it sets up the views to use
> my custom widgets and sets up the edit views and security. 
> 
> Regards and thanks for your help!
> -- 
>   Daniel M
>   danielm1 at fmguy.com
> 
> -- 
> http://www.fastmail.fm - Send your email first class
> 
> _______________________________________________
> Zope3-users mailing list
> Zope3-users at zope.org
> http://mail.zope.org/mailman/listinfo/zope3-users
> 
> 
> 
-- 
  Daniel M
  danielm1 at fmguy.com

-- 
http://www.fastmail.fm - Faster than the air-speed velocity of an
                          unladen european swallow



More information about the Zope3-users mailing list