flex_menu.renderers#

Renderer system converting processed menu items into HTML using templates.

Module Contents#

Classes#

BaseRenderer

Base renderer class for menu rendering.

Functions#

get_renderer

Get a renderer instance by name from settings.

Data#

API#

logger#

‘getLogger(…)’

class BaseRenderer[source]#

Base renderer class for menu rendering.

Renderers define how menu items are presented using templates. Templates are selected based on menu depth and properties.

An optional inner Media class defines CSS and JS dependencies for this renderer, following Django’s Form.Media/ModelAdmin.Media pattern.

Variables:

templates – Mapping of depth -> template configuration. Each depth can have ‘parent’ and ‘leaf’ templates, or just ‘default’. If a depth is not found, uses the ‘default’ key if present, otherwise raises an error.

Example

class MyRenderer(BaseRenderer):
    templates = {
        0: {"default": "menu/container.html"},
        1: {
            "parent": "menu/dropdown.html",
            "leaf": "menu/item.html",
        },
    }

    class Media:
        css = {"all": ("menu/styles.css",)}
        js = ("menu/scripts.js",)

Initialization

templates: dict[int | str, dict[str, str]]#

None

property media#

Return media assets (CSS/JS) required by this renderer.

get_template(item: flex_menu.menu.MenuItem) → str[source]#

Get the template path for a menu item based on depth and properties.

Parameters:

item – The menu item to render.

Returns:

Template path string.

Raises:

ValueError – If no template found for this depth and no default provided.

get_context_data(item: flex_menu.menu.MenuItem, **kwargs) → dict[str, Any][source]#

Build context data for template rendering.

Parameters:
  • item – The menu item to render.

  • **kwargs – Additional context data.

Returns:

Dictionary of context data for the template.

render(item: flex_menu.menu.MenuItem, **kwargs) → str[source]#

Render a menu item using its template.

Parameters:
  • item – The menu item to render.

  • **kwargs – Additional context data.

Returns:

Rendered HTML string, or empty string if item is not visible.

get_renderer(name: str | None = None) → flex_menu.renderers.BaseRenderer[source]#

Get a renderer instance by name from settings.

Loads renderer class path from FLEX_MENUS[‘renderers’] dict in settings. If no name provided, uses FLEX_MENUS[‘default_renderer’].

Parameters:

name – Renderer name or None for default.

Returns:

Renderer instance.

Raises:
  • ValueError – If renderer not found in settings.

  • ImportError – If renderer class cannot be imported.

  • TypeError – If the imported renderer class has no ‘render’ method.

Example

# In settings.py
FLEX_MENUS = {
    "renderers": {
        "bootstrap5": "myapp.renderers.Bootstrap5Renderer",
        "tailwind": "myapp.renderers.TailwindRenderer",
    },
    "default_renderer": "bootstrap5",
}

# In code or template
renderer = get_renderer("bootstrap5")
html = renderer.render(menu_item)