13 | | ---- |
| 12 | == Anonymity == |
| 13 | |
| 14 | {{{user.is_anonymous}}} is a method, not an attribute, which makes it hard to test against in a template. Set your own context variable {{{is_anonymous}}}, instead. |
| 15 | |
| 16 | == Context variables and template inheritance == |
| 17 | |
| 18 | To solve ''Anonymity'' above, it's handy to define a method each view can call to fill in its {{{Context}}} with the right variables. If you're inheriting templates, you should also do the same with the method. I've ended up with an {{{app_vars}}} method in each app's views module which calls {{{site_vars}}} in the site. |
| 19 | |
| 20 | {{{site_vars}}} goes in {{{sitename/views/sitename.py}}} if you're trying to match the default shape of the application namespace, or in {{{sitename/views.py}}} if you're flattening it: |
| 21 | |
| 22 | {{{ |
| 23 | def site_vars(request, **kwargs): |
| 24 | """Determine context variables for the site's base template.""" |
| 25 | user = request.user |
| 26 | is_anonymous = user.is_anonymous() |
| 27 | if is_anonymous: |
| 28 | username = name = '(anonymous)' |
| 29 | else: |
| 30 | username = user.username |
| 31 | name = user.get_full_name() |
| 32 | if not name: |
| 33 | name = username |
| 34 | vars = { |
| 35 | 'is_anonymous': is_anonymous, |
| 36 | 'name': name, |
| 37 | 'username': username, |
| 38 | } |
| 39 | vars.update(kwargs) |
| 40 | return vars |
| 41 | }}} |
| 42 | |
| 43 | A custom version of {{{app_vars}}} goes in each {{{sitename/apps/appname/views/appname.py}}} (or, if you're flattening the namespace, {{{sitename/apps/appname/views.py}}}): |
| 44 | |
| 45 | {{{ |
| 46 | def app_vars(request, **kwargs): |
| 47 | """Determine context variables for the application and site base templates.""" |
| 48 | vars = {} # set your app variables here |
| 49 | vars.update(site_vars(request, **kwargs)) |
| 50 | return vars |
| 51 | }}} |
| 52 | |
| 53 | The keyword arguments let you define additional useful variables for your page without having to further manipulate the dictionary: just keep piling on the arguments to {{{app_vars}}}. Let's say your base template likes to have a {{{title}}} variable available to it: |
| 54 | |
| 55 | {{{ |
| 56 | def index(request): |
| 57 | """View the appname index.""" |
| 58 | |
| 59 | # Customise the app variables the hard way |
| 60 | vars = app_vars(request) |
| 61 | vars['title'] = "Index" |
| 62 | |
| 63 | # Or, the easy way |
| 64 | vars = app_vars(request, title="Index") |
| 65 | |
| 66 | # Load the template, construct the context, and render one against the other: |
| 67 | t = template_loader.get_template('appname_index') |
| 68 | c = Context(request, vars) |
| 69 | return HttpResponse(t.render(c)) |
| 70 | }}} |