Created
June 10, 2013 22:18
-
-
Save michaelBenin/5752919 to your computer and use it in GitHub Desktop.
Problem: Sharing templates between backbonejs and django. I found that Backbone never needs to actually render out a whole page, only specific views, this allows me to render those views with the same templating language. If it is initial pageload, Backbone js just binds events and allows SEO and a faster page load time, as well as the page func…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django import template | |
from django.conf import settings | |
import pystache | |
# Needed to register a custom template tag | |
register = template.Library() | |
# Decorator to register a tag that takes the context | |
@register.simple_tag(takes_context=True) | |
# Function which takes the django context class and the template string | |
def mustache(context, template, locale): | |
# This can be modified to whatever template directory you want to hold your mustache templates | |
# Opens the file for reading as a raw string, cannot use django's get_template or render_to_string methods | |
# Because they attempt to render the context and actually return a class which pystache cannot use | |
template = open(settings.TEMPLATE_DIRS[0]+"/"+template, 'r').read() | |
# To retrieve the context passed and not the class info from django, we convert the context to a list | |
# After converted to a list, if the context is being passed from base, we want the first item in the list | |
# If the context is passed from a block, we want the second item in the list, from an include the third | |
# In each template load in the custom tag: {% load mustache %} | |
context_map = { | |
'base': list(context)[0], # {% mustache "_came_from_base_template.html" 'base' %} | |
'block': list(context)[1], # {% mustache "_came_from_block.html" 'include' %} | |
'include': list(context)[2] # {% mustache "_came_from_include.html" 'include' %} | |
} | |
# Return the rendered template with pystache | |
return pystache.render(template, context_map[locale]) |
This is currently being modified to work with templates coming from blocks insid of includes.
See this gist: https://gist.github.com/michaelBenin/5753378
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
If you are using this in an extend:
{% extends "__base.html" %}
{% load mustache %}
{% block header %}
{% mustache "_mustache_test.html" %}
{% include "_header.html" %}
{% endblock %}