In the following code, I am using django templates to render data from a
SQLAlchemy-mapped database.  I subclass django.template.Context, so that
I can pass it a unique ID, from which it determines what to pull from
the DB.  But when it comes time to render the template (that is: when I
actually try to access data in the database), I get an
UnboundExecutionError.  If I instantiate the Context object directly, I
don't have any problems.  Any idea why this would be, and how I can get
my class to work?  I'd rather keep the lazy loading semantics intact, if
possible.

In the code below, render_1() has no problem, while render_2() raises
the error.  Below the code, I show the output I'm getting.

#### CODE ####
  from django.conf import settings
settings.configure()

from django.template import Template, Context

from sqlalchemy.orm.session import Session
from cdla.orm import docsouth, docsouth_sohp

class SohpContext(Context):
    def __init__(self, sohp_id):
        s = Session()
        q = s.query(docsouth_sohp.Interview)
        context_dict = {'interview': q.filter_by(sohp_id=sohp_id).one()}
        super(SohpContext, self).__init__(context_dict)

def render_1(sohp_id):
    print "render_1"
    template = Template('''
{% for p in interview.participants %}\
  * {{ p.participant.participant_firstname }}
{% endfor %}''')
    s = Session()
    c = Context({'interview':
s.query(docsouth_sohp.Interview).filter_by(sohp_id=sohp_id).one()})
    print template.render(c)

def render_2(sohp_id):
    print "render_2"
    template = Template('''
{% for p in interview.participants %}\
  * {{ p.participant.participant_firstname }}
{% endfor %}''')
    c = SohpContext(sohp_id)
    print template.render(c)

if __name__ == '__main__':
    render_1('A-0001')
    render_2('A-0001')
#### END CODE ####

#### RESULTS ####
$ python error_reduce.py
/net/docsouth/dev/lib/python/sqlalchemy/logging.py:62: FutureWarning:
hex()/oct() of negative int will return a signed string in Python 2.4
and up
  return "%s.%s.0x..%s" % (instance.__class__.__module__,
render_1

  * Richard
  * Richard
  * Jack
  * Jack

render_2
Traceback (most recent call last):
  File "error_reduce.py", line 37, in ?
    render_2('A-0001')
  File "error_reduce.py", line 33, in render_2
    print template.render(c)
  File "/usr/lib/python2.3/site-packages/django/template/__init__.py",
line 168, in render
    return self.nodelist.render(context)
  File "/usr/lib/python2.3/site-packages/django/template/__init__.py",
line 705, in render
    bits.append(self.render_node(node, context))
  File "/usr/lib/python2.3/site-packages/django/template/__init__.py",
line 718, in render_node
    return(node.render(context))
  File
"/usr/lib/python2.3/site-packages/django/template/defaulttags.py", line
93, in render
    values = self.sequence.resolve(context, True)
  File "/usr/lib/python2.3/site-packages/django/template/__init__.py",
line 563, in resolve
    obj = resolve_variable(self.var, context)
  File "/usr/lib/python2.3/site-packages/django/template/__init__.py",
line 650, in resolve_variable
    current = getattr(current, bits[0])
  File "/net/docsouth/dev/lib/python/sqlalchemy/orm/attributes.py", line
44, in __get__
    return self.impl.get(instance._state)
  File "/net/docsouth/dev/lib/python/sqlalchemy/orm/attributes.py", line
279, in get
    value = callable_()
  File "/net/docsouth/dev/lib/python/sqlalchemy/orm/strategies.py", line
432, in __call__
    raise exceptions.UnboundExecutionError("Parent instance %s is not
bound to a Session, and no contextual session is established; lazy load
operation of attribute '%s' cannot proceed" % (instance.__class__,
self.key))
sqlalchemy.exceptions.UnboundExecutionError: Parent instance <class
'cdla.orm.docsouth_sohp.Interview'> is not bound to a Session, and no
contextual session is established; lazy load operation of attribute
'participants' cannot proceed
$
#### END RESULTS ####


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to