def do_include_maybe(parser, token): """ A template helper to optionally include a template partial, and catch the exception if it fails. Source: http://stackoverflow.com/a/18951166/15690 """ bits = token.split_contents() if len(bits) < 2: raise template.TemplateSyntaxError( "%r tag takes at least one argument: " "the name of the template to be included." % bits[0]) try: silent_node = do_include(parser, token) except template.TemplateDoesNotExist: # Django < 1.7 return CommentNode() _orig_render = silent_node.render def wrapped_render(*args, **kwargs): try: return _orig_render(*args, **kwargs) except template.TemplateDoesNotExist: return CommentNode() silent_node.render = wrapped_render return silent_node
def if_has_tag(parser, token): """ The logic for both ``{% if_has_tag %}`` and ``{% if not_has_tag %}``. Checks if all the given tags exist (or not exist if ``negate`` is ``True``) and then only parses the branch that will not error due to non-existing tags. This means that the following is essentially the same as a ``{% comment %}`` tag:: {% if_has_tag non_existing_tag %} {% non_existing_tag %} {% endif_has_tag %} Another example is checking a built-in tag. This will alway render the current year and never FAIL:: {% if_has_tag now %} {% now \"Y\" %} {% else %} FAIL {% endif_has_tag %} """ bits = list(token.split_contents()) if len(bits) < 2: raise TemplateSyntaxError("%r takes at least one arguments" % bits[0]) end_tag = 'end%s' % bits[0] has_tag = all([tag in parser.tags for tag in bits[1:]]) nodelist_true = nodelist_false = CommentNode() if has_tag: nodelist_true = parser.parse(('else', end_tag)) token = parser.next_token() if token.contents == 'else': parser.skip_past(end_tag) else: while parser.tokens: token = parser.next_token() if token.token_type == TOKEN_BLOCK and token.contents == end_tag: try: return IfNode([(Literal(has_tag), nodelist_true), (None, nodelist_false)]) except TypeError: # < 1.4 return IfNode(Literal(has_tag), nodelist_true, nodelist_false) elif token.token_type == TOKEN_BLOCK and token.contents == 'else': break nodelist_false = parser.parse((end_tag, )) token = parser.next_token() try: return IfNode([(Literal(has_tag), nodelist_true), (None, nodelist_false)]) except TypeError: # < 1.4 return IfNode(Literal(has_tag), nodelist_true, nodelist_false)
def wrapped_render(*args, **kwargs): try: return _orig_render(*args, **kwargs) except template.TemplateDoesNotExist: return CommentNode()
def do_include_maybe(parser, token): try: return do_include(parser, token) except template.TemplateDoesNotExist: return CommentNode()