from django import template
from django.conf import settings
+from django.contrib.contenttypes.models import ContentType
register = template.Library()
class MembersofNode(template.Node):
def __init__(self, collection, model, as_var):
self.collection = template.Variable(collection)
- self.model = template.Variable(model)
+ self.model = model
self.as_var = as_var
def render(self, context):
try:
collection = self.collection.resolve(context)
- model = self.model.resolve(context)
- context[self.as_var] = collection.members.with_model(model)
+ context[self.as_var] = collection.members.with_model(self.model)
except:
pass
- return settings.TEMPLATE_STRING_IF_INVALID
+ return ''
def do_membersof(parser, token):
"""
- {% membersof <collection> with <model> as <var> %}
+ {% membersof <collection> with <app_label>.<model_name> as <var> %}
"""
params=token.split_contents()
tag = params[0]
if params[2] != 'with':
raise template.TemplateSyntaxError('"%s" template tag requires the third parameter to be "with"' % tag)
+
+ try:
+ app_label, model = params[3].strip('"').split('.')
+ ct = ContentType.objects.get(app_label=app_label, model=model)
+ except ValueError:
+ raise template.TemplateSyntaxError('"%s" template tag option "with" requires an argument of the form app_label.model (see django.contrib.contenttypes)' % tag)
+ except ContentType.DoesNotExist:
+ raise template.TemplateSyntaxError('"%s" template tag option "with" requires an argument of the form app_label.model which refers to an installed content type (see django.contrib.contenttypes)' % tag)
if params[4] != 'as':
raise template.TemplateSyntaxError('"%s" template tag requires the fifth parameter to be "as"' % tag)
- return MembersofNode(collection=params[1], model=params[3], as_var=params[5])
+ return MembersofNode(collection=params[1], model=ct.model_class(), as_var=params[5])
register.tag('membersof', do_membersof)
\ No newline at end of file
class ContainerNode(template.Node):
- child_nodelists = ('nodelist_main', 'nodelist_empty',)
-
- def __init__(self, name, references=None, as_var=None, nodelist_main=None, nodelist_empty=None):
+ def __init__(self, name, references=None, as_var=None):
self.name = name
self.as_var = as_var
self.references = references
-
- if nodelist_main is None:
- self.nodelist_main = template.NodeList()
- else:
- self.nodelist_main = nodelist_main
-
- if nodelist_empty is None:
- self.nodelist_empty = template.NodeList()
- else:
- self.nodelist_empty = nodelist_empty
def render(self, context):
content = settings.TEMPLATE_STRING_IF_INVALID
if 'page' in context:
container_content = self.get_container_content(context)
- if not self.nodelist_main:
- if self.as_var:
- context[self.as_var] = container_content
- return ''
-
- if not container_content:
- return ''
-
- return container_content
-
- if container_content:
- if self.as_var is None:
- self.as_var = self.name
-
- #make a new context
- context.push()
+ if self.as_var:
context[self.as_var] = container_content
- nodelist = template.NodeList()
- for node in self.nodelist_main:
- nodelist.append(node.render(context))
- context.pop()
- return nodelist.render(context)
+ return ''
- if self.nodelist_empty is not None:
- return self.nodelist_empty.render(context)
+ if not container_content:
+ return ''
- return ''
+ return container_content
def get_container_content(self, context):
page = context['page']
def do_container(parser, token):
"""
- {% container <name> [[references <type>] as <variable>] %}
- {% blockcontainer <name> [[references <type>] as <variable>] %} [ {% empty %} ] {% endblockcontainer %}
+ {% container <name> [[references <type>] as <variable>] %}
"""
params = token.split_contents()
if len(params) >= 2:
raise template.TemplateSyntaxError('"%s" template tag option "as" requires an argument specifying a variable name' % tag)
if references and not as_var:
raise template.TemplateSyntaxError('"%s" template tags using "references" option require additional use of the "as" option specifying a variable name' % tag)
- if tag == 'container':
- return ContainerNode(name, references, as_var)
-
- nodelist_main = parser.parse(('empty','endblockcontainer',))
- token = parser.next_token()
-
- if token.contents == 'empty':
- nodelist_empty = parser.parse(('endblockcontainer',))
- parser.delete_first_token()
- else:
- nodelist_empty = None
- return ContainerNode(name, references, as_var, nodelist_main, nodelist_empty)
+ return ContainerNode(name, references, as_var)
else: # error
raise template.TemplateSyntaxError('"%s" template tag provided without arguments (at least one required)' % tag)
register.tag('container', do_container)
-register.tag('blockcontainer', do_container)