New django user here, so if this has been covered already, I'd
appreciate a pointer to the right thread.

I've been planning and building my app lately, and it's been quite a
nice experience so far; django seems very well designed and
architected.

One thing's been annoying me though. I have a base template
(base.htm), which defines my basic site design and blocks. For each
app, there is a template that inherits from the base template and adds
a few app-specific bits. Each view in each app then inherits from it's
app template and replaces blocks as required.

The thing is, there are certain things that should be displayed in
each view in an app, e.g. a list of the last 5 blog posts in the blog
app. So in keeping with the DRY principle, I've placed this in the app
template, e.g. blog/app.htm.

Problem is, some of the things in the app template require context
variables. I started off adding the needed context variable into each
view, e.g.

latest_5_blog_posts = entries.objects.all()[:5]
...
return render_to_response("blog/entry.htm", {"latest_5_blog_posts" :
latest_5_blog_posts})

That didn't seem very DRY, so I created a context processor for it,
and added that to the project's settings.py's
TEMPLATE_CONTEXT_PROCESSORS variable.

This was better, but I still didn't like it because it was doing
database calls for each page load (could be solved with caching) and
it was making data only applicable to one app available to all the
apps in the project. It just didn't seem very clean, and potentially
some performance and security concerns there.

The other approach I've seen from James Bennett's blog, is to create a
template tag to retrieve model data generally. This works too, but it
feels like it's more legwork that should be required.

Is there an approach I'm missing?

Just thinking out loud, I think a good approach to this fairly common
issue would be to standardize the template tag idea above so templates
can specify a context processor to execute, either through a {%
context_processor_load (name of function) %} tag, or the template
loader could search in a standard location for a relevant context
processor. If it exists, that context_processor gets loaded and added
to the context object.

So using the blog example, when the template loader loads blog/
entry.htm, it sees that it extends blog/app.htm. It also notices it
has a context_processor_load tag, so it executes that, which returns a
dictionary containing the the context variable latest_5_blog_posts. It
then sees that blog/app.htm extends base.htm, but without a
context_processor_load tag it continues as per normal.

This way the context processor is only triggered if it's needed. It
should complement the project wide context processors setting.

I'll probably end up coding something like this, but before I do, just
wanted to see if there are any issues with this approach, and how
other people are tackling this problem.

Sorry for the extremely long email!

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

Reply via email to