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.1.tar.gz (18.9 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.1-py3-none-any.whl (20.2 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for django_flex_menus-0.4.1.tar.gz
Algorithm Hash digest
SHA256 4c7d2a7dc20df99c3d6ac9b824f36637f10cfb81f7aa2bd1c5e4ae14c26a71ec
MD5 683ea5fcf42fa59e9e83b4e0072c8f2a
BLAKE2b-256 5e8f27fb51879e4359722ca906eede6e522a932451d31441172002e54fd60272

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_flex_menus-0.4.1.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.1-py3-none-any.whl.

File metadata

File hashes

Hashes for django_flex_menus-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e28408d245d4b08a1294ddc29ed7d0a6b4a5630c28039b45ce9c64b95dd3d0c9
MD5 c6450ba7964b97e5035d9534cf6a1a5a
BLAKE2b-256 520134da13558abd64d16f4afbfec38ebe68a3fc6a78d85fbcb380456863752f

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_flex_menus-0.4.1-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