Dynamic siteblocks

Dynamic siteblocks instead of Static ones allows complex logic to build siteblock contents.

Siteblocks content in this case is not defined using Django Admin contrib, but generated by an ordinary Python function registered as a siteblock.

Use register_dynamic_block() function to register a callable that produces contents for a dynamic block.

Such a callable will get the following kwargs when called:

  • block_alias - block alias,
  • block_context - template context for block

Let’s implement quotes siteblock similar to that from Getting started, but dynamic this time.

  1. Add {% siteblock “my_quotes” %} tag where you need it in templates. Here my_quotes is the alias of a block.

    {% extends "_base.html" %}
    {% load siteblocks %}
    {% block sidebar %}
        <div class="quote">
            {% siteblock "my_quotes" %}
    {% endblock %}
  2. Define and register a dynamic siteblock.

    # Put the following code somewhere where it'd be triggered as expected. E.g. in app view.py.
    from random import choice
    # Import the register function.
    from siteblocks.siteblocksapp import register_dynamic_block
    # The following function will be used as a block contents producer.
    def get_quote(**kwargs):
        quotes = [  # From Terry Pratchett's Discworld novels.
            'Ripples of paradox spread out across the sea of causality.',
            'Early to rise, early to bed, makes a man healthy, wealthy and dead.',
            'Granny had nothing against fortune-telling provided it was done badly by people with no talent for it.',
            'Take it from me, there\'s nothing more terrible than someone out to do the world a favour.',
            'The duke had a mind that ticked like a clock and, like a clock, it regularly went cuckoo.',
            'Most gods find it hard to walk and think at the same time.',
            'They didn\'t have to be funny - they were father jokes',
            'Speak softly and employ a huge man with a crowbar.',
        return choice(quotes)
    # And we register our siteblock.
    register_dynamic_block('my_quotes', get_quote)