Skip to main content

A flexible menu builder for Wagtail CMS

Project description

Wagtail MenuBuilder

A flexible and easy-to-use menu management system for Wagtail CMS that allows you to create and manage menus directly from the Wagtail admin interface.


Features

  • Create multiple menus with different slugs
  • Hierarchical menu structure with unlimited depth
  • Drag-and-drop menu item ordering
  • Automatic page link updates when pages are moved
  • Custom template support
  • Built-in templates for common menu types (e.g., top navigation, footer)
  • Wagtail 6.0+ compatible

Requirements

  • Python 3.8+
  • Django 4.2+
  • Wagtail 6.0+

Installation

  1. Install the package using pip:

    pip install wagtail-menubuilder
    
  2. Add menubuilder to your INSTALLED_APPS in settings.py:

    INSTALLED_APPS = [
        ...
        'wagtail.admin',
        'wagtail.core',
        ...
        'menubuilder',
        ...
    ]
    
  3. Run migrations:

    python manage.py migrate menubuilder
    

Quick Start

1. Creating and Managing Menus

  1. Access the Wagtail Admin Panel.
  2. Navigate to Snippets in the left sidebar.
  3. Click on Menubuilder.
  4. Click Add Menubuilder to create a new menu.

2. Menu Configuration

  • Title: Give your menu a descriptive name (e.g., "Main Navigation", "Footer Menu").
  • Slug: Use a unique identifier (e.g., "main-nav", "footer").
  • Menu Items: Add and organize your menu items:
    • Title: The text that appears in the menu.
    • URL: External link (optional).
    • Internal Link: Link to a Wagtail page (optional).
    • Parent Item: Create dropdown menus by setting a parent.

Using Menus in Templates

Rendering Menus

  1. Load the template tags in your template:

    {% load menubuilder_tags %}
    
  2. Render a menu using its slug:

    {% render_menu "your-menu-slug" %}
    

Example: Using the top-navbar.html Template

The package includes an example template, top-navbar.html, which demonstrates a responsive navigation bar.

Steps to Use top-navbar.html:

  1. Add the Template to Your Base Template

    Load the required tags and render the menu in your global template (e.g., base.html):

    {% load static menubuilder_tags %}
    {% render_menu "top-navbar" %}
    

    If your template uses Wagtail-specific features (e.g., {% pageurl %}), also load wagtailcore_tags:

    {% load static wagtailcore_tags menubuilder_tags %}
    
  2. Create a Template File Matching the Slug

    The slug defined in the Menubuilder menu must match the name of the template file used to render it. For example:

    • If the menu slug is top-navbar, you should create a file named top-navbar.html in your templates directory (e.g., templates/menu/top-navbar.html).
  3. Customize top-navbar.html

    • The file is located in your project’s templates/menu/ directory.
    • Modify the design, CSS, or structure to suit your needs.
  4. Include Styles and Scripts

    Ensure the required CSS and JavaScript files are loaded in your base template:

    <link rel="stylesheet" type="text/css" href="{% static 'css/top-navbar.css' %}">
    <script type="text/javascript" src="{% static 'js/top-navbar.js' %}"></script>
    

Advanced Usage

Custom Menu Templates

You can create custom templates for your menus by using the following context variables:

  • menu: The menu object.
  • menu_items: List of menu items.
  • request: The current request object.

Example Custom Template

<nav class="custom-menu">
    <ul>
        {% for item in menu_items %}
            <li class="{% if item.active %}active{% endif %}">
                <a href="{{ item.url }}">{{ item.title }}</a>
                {% if item.children %}
                    <ul class="submenu">
                        {% for child in item.children %}
                            <li><a href="{{ child.url }}">{{ child.title }}</a></li>
                        {% endfor %}
                    </ul>
                {% endif %}
            </li>
        {% endfor %}
    </ul>
</nav>

Then use your custom template:

{% render_menu "main-menu" template="menubuilder/custom-menu.html" %}

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

  1. Fork the repository.
  2. Create your feature branch (git checkout -b feature/AmazingFeature).
  3. Commit your changes (git commit -m 'Add some AmazingFeature').
  4. Push to the branch (git push origin feature/AmazingFeature).
  5. Open a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

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

wagtail_menubuilder-0.1.0.tar.gz (5.5 kB view details)

Uploaded Source

Built Distribution

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

wagtail_menubuilder-0.1.0-py3-none-any.whl (5.9 kB view details)

Uploaded Python 3

File details

Details for the file wagtail_menubuilder-0.1.0.tar.gz.

File metadata

  • Download URL: wagtail_menubuilder-0.1.0.tar.gz
  • Upload date:
  • Size: 5.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.13.1

File hashes

Hashes for wagtail_menubuilder-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d5516a346efbfda2cc26127b05a5b7410458dae051c0a4ecaa2ee57966607829
MD5 c4a34e8f51667cfd4eaefe41ad23b4ff
BLAKE2b-256 0c331f56541623177e02fd6fa80e41fa171d487af31e7a7c3d9fae91174502b3

See more details on using hashes here.

File details

Details for the file wagtail_menubuilder-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for wagtail_menubuilder-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b13cb57eab814998c7b2e581833abccddfe0835112b4f08ce7e219f3e8ec0065
MD5 2ca61f1d8dc433efebb65be2de8c8a00
BLAKE2b-256 ae571b94755ebe7cda94f2a30399101f94b46b7b10a0f6e65843da03375167a2

See more details on using hashes here.

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