Django - how to get the contents of a {% block %} tag from a template

后端 未结 2 1478
别那么骄傲
别那么骄傲 2021-01-19 05:43

I got this far:

>>> some_template = get_template_from_string(
...     load_template_source(
...         \'some_template.html\',
...         settings         


        
相关标签:
2条回答
  • 2021-01-19 06:00

    The solution I created:

    import re
    
    
    BLOCK_RE = re.compile(r'{%\s*block\s*(\w+)\s*%}')
    NAMED_BLOCK_RE = r'{%%\s*block\s*%s\s*%%}'  # Accepts string formatting
    ENDBLOCK_RE = re.compile(r'{%\s*endblock\s*(?:\w+\s*)?%}')
    
    
    def get_block_source(template_source, block_name):
        """
        Given a template's source code, and the name of a defined block tag,
        returns the source inside the block tag.
        """
        # Find the open block for the given name
        match = re.search(NAMED_BLOCK_RE % (block_name,), template_source)
        if match is None:
            raise ValueError(u'Template block {n} not found'.format(n=block_name))
        end = inner_start = start = match.end()
        end_width = 0
        while True:
            # Set ``end`` current end to just out side the previous end block
            end += end_width
            # Find the next end block
            match = re.search(ENDBLOCK_RE, template_source[end:])
            # Set ``end`` to just inside the next end block
            end += match.start()
            # Get the width of the end block, in case of another iteration
            end_width = match.end() - match.start()
            # Search for any open blocks between any previously found open blocks,
            # and the current ``end``
            nested = re.search(BLOCK_RE, template_source[inner_start:end])
            if nested is None:
                # Nothing found, so we have the correct end block
                break
            else:
                # Nested open block found, so set our nested search cursor to just
                # past the inner open block that was found, and continue iteration
                inner_start += nested.end()
        # Return the value between our ``start`` and final ``end`` locations
        return template_source[start:end]
    
    0 讨论(0)
  • 2021-01-19 06:21

    This seems like you're working hard against the Django grain. Put the content into an include file, then {% include %} it in your block, and also read the file directly. If you could tell us more about what you're trying to accomplish, there's probably a better way to do it.

    0 讨论(0)
提交回复
热议问题