Code

This decorator makes views even easier:

Code:

def page(template=None, context=None, **decorator_args):
    def _wrapper(fn):
        def _innerWrapper(request, *args, **kw):
            context_dict = decorator_args.copy()
            g = fn(request, *args, **kw)
            if not hasattr(g, 'next'):  #Is this a generator?  Otherwise make her a tuple!
                g = (g,)
            for i in g:
                if isinstance(i, httpwrappers.HttpResponse):
                    return i
                if type(i) == type(()):
                    context_dict[i[0]] = i[1]
                else:
                    context_dict.update(i)
            template_name = context_dict.get("template",  template)
            context_instance = context_dict.get("context", context)
            return render_to_response(template_name, context_dict, context_instance)
            
        return _innerWrapper
    return _wrapper

Usage:

@page("polls/index")    #The decorator function takes the template to be used.
def index(request):
    latest_poll_list = polls.get_list(order_by=['-pub_date'], limit=5)
    yield {'latest_poll_list': latest_poll_list}
    yield {'title': 'Latest Poll Listing'}  # We can yield at multiple places in the function.

Or one could yield the locals():

@page("polls/index", title='Latest Poll Listing')  #Extra keyword arguments are sent in the context.
def index(request):
    latest_poll_list = polls.get_list(order_by=['-pub_date'], limit=5)
    yield locals()   #This yeilds all the local variables, which is 'latest_poll_list', and 'request'

You can set a template mid-stream with:

@page() #We don't say what template is needed yet.
def index(request):
    latest_poll_list = polls.get_list(order_by=['-pub_date'], limit=5)
    if (latest_poll_list):
        template = 'polls/index'
    else:
        template = 'polls/nopolls'  # We could also send 'context' which changes what context we use.
    yield locals()

You can yield a response to have it immediately returned:

@page('polls/index')
def index(request):
    latest_poll_list = polls.get_list(order_by=['-pub_date'], limit=5)
    if (not latest_poll_list):
        yield httpwrappers.HttpResponseRedirect("/home/")  #Since we don't have any latest polls, redirect to home.
        return #Don't yield anything else, we're done here.
    yield locals()
Last modified 8 years ago Last modified on 01/11/06 12:28:48