Skip to main content

Flexible site menus for Django

Project description

Django Flex Menu

Github Build Github Tests codecov GitHub GitHub last commit

A flexible menu management system for Django built around anytree.

Features

  • Modular, tree-based design for easy customization and extension
  • Flexible URL resolution
  • Object-based processing for detail view menus
  • Thread-safe processing for concurrent requests
  • Request-specific menu state isolation
  • Simple template system with single template attribute per component
  • Child type validation for theme-specific menu classes

Installation

API

Once you have a menu instance, you can modify it in the following ways:

main_menu = Menu("Site Menu")
child_menu = MenuLink("My Child", url="/my-child")

# Append a child
main_menu.append(child_menu)

# Get a child instance by name
child_menu = main_menu.get("My Child")

# Pop a child (note this is done via the child menu, not the parent menu)
child = child_menu.pop()

# Extend a menu with a list of menu items
main_menu.extend([child_menu, child_menu2, child_menu3])

# Insert child/children at a specific position
main_menu.insert(child_menu, 2)

# Insert child after another named child
main_menu.insert_after(child_menu, "My Other Child")

Configuration

Logging URL Resolution Failures

By default, URL resolution failures are only logged when DEBUG=True. To control this behavior:

# In your Django settings
FLEX_MENU_LOG_URL_FAILURES = False  # Disable logging (recommended for production)
FLEX_MENU_LOG_URL_FAILURES = True   # Always log failures
# Default: settings.DEBUG

See CONFIGURATION.md for detailed configuration options.

Performance Considerations

For optimal performance in production:

  • Avoid menu.copy() during request processing - it's expensive
  • Cache permission checks when possible - use @lru_cache or Django's cache framework
  • Pre-resolve static URLs during app startup for menus that don't change
  • Use lazy evaluation - check parent visibility before processing children
  • Consider menu depth - deep hierarchies can impact performance

See PERFORMANCE.md for detailed optimization strategies.

Thread Safety

⚠️ Important: The menu processing is now thread-safe for concurrent requests. Each request gets its own processed copy to prevent race conditions.

See THREAD_SAFETY.md for detailed information about concurrency handling.

Theme-Specific Menu Classes

Create type-safe theme-specific menu classes:

class Bootstrap5DropdownMenu(Menu):
    template = "bootstrap5/dropdown-menu.html"
    allowed_children = ['Bootstrap5DropdownMenuLink']

class Bootstrap5DropdownMenuLink(MenuLink):
    template = "bootstrap5/dropdown-item.html"

# Type validation prevents mixing incompatible components
dropdown = Bootstrap5DropdownMenu("User Menu")
dropdown.append(Bootstrap5DropdownMenuLink("Profile", view_name="profile"))  # ✅ OK
dropdown.append(MenuLink("Settings", view_name="settings"))  # ❌ TypeError!

See THEME_CLASSES.md for detailed examples and patterns.

See also

django-account-management

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_flex_menus-0.4.2.tar.gz (17.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_flex_menus-0.4.2-py3-none-any.whl (19.3 kB view details)

Uploaded Python 3

File details

Details for the file django_flex_menus-0.4.2.tar.gz.

File metadata

  • Download URL: django_flex_menus-0.4.2.tar.gz
  • Upload date:
  • Size: 17.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for django_flex_menus-0.4.2.tar.gz
Algorithm Hash digest
SHA256 a0e3efed48310691beb7a3ec2dc0e0eabc262d36cecd93d3528c1e3607622c39
MD5 8a973516ea355e336c18a8159045bf22
BLAKE2b-256 d4f7fdbc0da84d0496b861f426c343ee12c275902975ae3f8803f10deb799fcb

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_flex_menus-0.4.2.tar.gz:

Publisher: on-release-main.yml on SamuelJennings/django-flex-menus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file django_flex_menus-0.4.2-py3-none-any.whl.

File metadata

File hashes

Hashes for django_flex_menus-0.4.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f9ba4deab51f5e254b91385360087eb6491fc72bd40125f3fdc14ee19d05dafa
MD5 2c8ae647ade0fe4df0868f430f198b2a
BLAKE2b-256 1deb4dfbc897bf5f94aa8614085110acb4e333f58c077a7e718f81d634b1eb21

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_flex_menus-0.4.2-py3-none-any.whl:

Publisher: on-release-main.yml on SamuelJennings/django-flex-menus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page