How to fix "Object not iterable" error?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • william hoskins
    New Member
    • Feb 2011
    • 3

    How to fix "Object not iterable" error?

    Hey everyone,
    I am fairly new to python, and I was working on a google app engine project for a class, and this error came up. I wasn't sure why, because right above it I have the same object type right above it, and when I take the filter off the other, it works fine, I just can't do that or it screws everything up
    Code:
    def LoginBar():
        user = users.get_current_user()
        greet = Greeting.all()
        info = greet
        greet.filter("username =", user)
        info = Greeting.all()
        url_account_linktext = "Account"
        check = 0
        if user:
            for info in greet:
                if info.username == user:
                    check = 1
                    break
            if check == 0:
                greeting = Greeting()
                greeting.username = users.get_current_user()
                greeting.email = user.email()
                greeting.name = greeting.username.nickname()
                greeting.put()
                        
            url = users.create_logout_url('/')
            url_linktext = 'Logout'
        else:
            url = users.create_login_url('/')
            url_linktext = 'Login'
        template_values = {
                'info': info,
                'greetings': greet,
                'url': url,
                'url_linktext': url_linktext,
                'url_account_linktext': url_account_linktext, 
            }
    If I use the info variable in this code

    Code:
    {% for greeting in info %}
        <br /><b>{{ greeting.name }}</b><br />
    {% endfor %}
    it throws this exception, but if I put greet in there, whether it is filtered or not, it works. Any ideas why? I really wish I could use greet, but that doesn't work, sadly, because I use it else where for other stuff. Thanks in advance

    Edit, here is the traceback
    Code:
    Traceback (most recent call last):
      File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\__init__.py", line 515, in __call__
        handler.get(*groups)
      File "C:\Users\William\Documents\workspace\242Homework2\src\homework\main.py", line 109, in get
        self.response.out.write(template.render(path, values))
      File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\template.py", line 143, in render
        return t.render(Context(template_dict))
      File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\template.py", line 183, in wrap_render
        return orig_render(context)
      File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\template\__init__.py", line 168, in render
        return self.nodelist.render(context)
      File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\template\__init__.py", line 705, in render
        bits.append(self.render_node(node, context))
      File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\template\__init__.py", line 718, in render_node
        return(node.render(context))
      File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\template\defaulttags.py", line 175, in render
        return self.nodelist_true.render(context)
      File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\template\__init__.py", line 705, in render
        bits.append(self.render_node(node, context))
      File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\template\__init__.py", line 718, in render_node
        return(node.render(context))
      File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\template\defaulttags.py", line 99, in render
        values = list(values)
    TypeError: 'Greeting' object is not iterable
  • bvdet
    Recognized Expert Specialist
    • Oct 2006
    • 2851

    #2
    It would help if you posted the error message including the traceback.

    The assignments you make in LoginBar() don't seem right. You make an assignment to info twice before the if statement, and then again if user evaluates True.

    The second block of code posted is not valid Python and would raise a SyntaxError.

    Comment

    • william hoskins
      New Member
      • Feb 2011
      • 3

      #3
      I added the tracebook, sorry, meant to add that. The last block of code is integrating the python into html, I was half asleep when I asked this, sorry

      Comment

      • william hoskins
        New Member
        • Feb 2011
        • 3

        #4
        Never mind, it works now...it turns out I needed to put .all onto the iterating object in the for loop. Thanks for your help!

        Comment

        Working...