| 1 | This decorator makes views even easier: |
| 2 | |
| 3 | '''Code:''' |
| 4 | {{{ |
| 5 | def page(template=None, context=None, **decorator_args): |
| 6 | def _wrapper(fn): |
| 7 | def _innerWrapper(request, *args, **kw): |
| 8 | context_dict = decorator_args.copy() |
| 9 | g = fn(request, *args, **kw) |
| 10 | if not hasattr(g, 'next'): #Is this a generator? Otherwise make her a tuple! |
| 11 | g = (g,) |
| 12 | for i in g: |
| 13 | if isinstance(i, httpwrappers.HttpResponse): |
| 14 | return i |
| 15 | if type(i) == type(()): |
| 16 | context_dict[i[0]] = i[1] |
| 17 | else: |
| 18 | context_dict.update(i) |
| 19 | template_name = context_dict.get("template", template) |
| 20 | context_instance = context_dict.get("context", context) |
| 21 | return render_to_response(template_name, context_dict, context_instance) |
| 22 | |
| 23 | return _innerWrapper |
| 24 | return _wrapper |
| 25 | }}} |
| 26 | |
| 27 | '''Usage:''' |
| 28 | |
| 29 | {{{ |
| 30 | @page("polls/index") #The decorator function takes the template to be used. |
| 31 | def index(request): |
| 32 | latest_poll_list = polls.get_list(order_by=['-pub_date'], limit=5) |
| 33 | yield {'latest_poll_list': latest_poll_list} |
| 34 | yield {'title': 'Latest Poll Listing'} # We can yield at multiple places in the function. |
| 35 | }}} |
| 36 | |
| 37 | Or one could yield the locals(): |
| 38 | |
| 39 | {{{ |
| 40 | @page("polls/index", title='Latest Poll Listing') #Extra keyword arguments are sent in the context. |
| 41 | def index(request): |
| 42 | latest_poll_list = polls.get_list(order_by=['-pub_date'], limit=5) |
| 43 | yield locals() #This yeilds all the local variables, which is 'latest_poll_list', and 'request' |
| 44 | }}} |
| 45 | |
| 46 | You can set a template mid-stream with: |
| 47 | {{{ |
| 48 | @page() #We don't say what template is needed yet. |
| 49 | def index(request): |
| 50 | latest_poll_list = polls.get_list(order_by=['-pub_date'], limit=5) |
| 51 | if (latest_poll_list): |
| 52 | template = 'polls/index' |
| 53 | else: |
| 54 | template = 'polls/nopolls' # We could also send 'context' which changes what context we use. |
| 55 | yield locals() |
| 56 | }}} |
| 57 | |
| 58 | You can yield a response to have it immediately returned: |
| 59 | {{{ |
| 60 | @page('polls/index') |
| 61 | def index(request): |
| 62 | latest_poll_list = polls.get_list(order_by=['-pub_date'], limit=5) |
| 63 | if (not latest_poll_list): |
| 64 | yield httpwrappers.HttpResponseRedirect("/home/") #Since we don't have any latest polls, redirect to home. |
| 65 | return #Don't yield anything else, we're done here. |
| 66 | yield locals() |
| 67 | }}} |