garpix-menu


Namegarpix-menu JSON
Version 1.17.1 PyPI version JSON
download
home_page
Summary
upload_time2024-03-14 11:43:12
maintainer
docs_urlNone
authorGarpix LTD
requires_python
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Garpix Menu

Настраиваемые меню для [garpix_page](https://pypi.org/project/garpix-page/).

## Быстрый старт

Сначала установите и настройте [garpix_page](https://pypi.org/project/garpix-page/).

---

Установите с pip:

```bash
pip install garpix_menu
```

Добавьте `garpix_menu` и пакеты зависимостей в `INSTALLED_APPS`:

```python
# settings.py

INSTALLED_APPS = [
    # ...
    'garpix_menu',
]

```

Пакет не включает миграции, укажите путь к каталогу миграций. Не забудьте создать этот каталог (`app/migrations/garpix_page/`) и поместить в него пустой `__init__.py`:

```
app/migrations/
app/migrations/__init__.py  # empty file
app/migrations/garpix_menu/__init__.py  # empty file
```

Добавьте путь и другие настройки:

```python
# settings.py

MIGRATION_MODULES = {
    'garpix_menu': 'app.migrations.garpix_menu',
}

TEMPLATES = [
    {
        # ...
        'OPTIONS': {
            'context_processors': [
                # ...
                'garpix_menu.context_processors.menu_processor',
            ],
        },
    },
]
```

Создайте миграции:

```bash
python manage.py makemigrations
```

Примените миграции:

```bash
python manage.py migrate
```

### Пример

Set up your custom menus in `settings.py`, for example:

```python
# settings.py

MENU_TYPE_HEADER_MENU = 'header_menu'
MENU_TYPE_FOOTER_MENU = 'footer_menu'

MENU_TYPES = {
    MENU_TYPE_HEADER_MENU: {
        'title': 'Header menu',
    },
    MENU_TYPE_FOOTER_MENU: {
        'title': 'Footer menu',
    },
}

CHOICE_MENU_TYPES = [(k, v['title']) for k, v in MENU_TYPES.items()]
```

Пример шаблона меню по умолчанию:

```html
# templates/menus/default.html

{% for menu_item in menu %}
<a {% if menu_item.target_blank %}target="_blank" {% endif %}
   href="{{ menu_item.get_link }}">{{ menu_item.title }}</a>
{% if not forloop.last %}|{% endif %}
{% endfor %}
```

Пример со всеми шаблонами:

```html
# templates/base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% include 'garpix_page/seo.html' %}
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"
          crossorigin="anonymous">
</head>
<body>
{% include 'include/header.html' %}

<main class="container">
    {% block content %}
    {% endblock %}
</main>

{% include 'include/footer.html' %}
</body>
</html>

# templates/pages/default.html

{% extends 'base.html' %}

{% block content %}
<h1>{{object.title}}</h1>
<div>
    {{object.content|safe}}
</div>
{% endblock %}

# templates/include/header.html

<nav class="navbar navbar-expand-md navbar-dark bg-dark">
    <div class="container-fluid">
        <a class="navbar-brand" href="/">My Site</a>
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExampleDefault"
                aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>

        <div class="collapse navbar-collapse" id="navbarsExampleDefault">
            {% include 'menus/header_menu.html' with menu=menus.header_menu %}
        </div>
    </div>
</nav>

# templates/include/footer.html

<style>
    /* Sticky footer styles
    -------------------------------------------------- */
    html {
        position: relative;
        min-height: 100%;
    }

    body {
        margin-bottom: 60px; /* Margin bottom by footer height */
    }

    .footer {
        position: absolute;
        bottom: 0;
        width: 100%;
        height: 60px; /* Set the fixed height of the footer here */
        line-height: 60px; /* Vertically center the text there */
        background-color: #f5f5f5;
    }

</style>

<footer class="footer">
    <div class="container">
        <span class="text-muted">
            {% include 'menus/footer_menu.html' with menu=menus.footer_menu %}
        </span>
    </div>
</footer>

# templates/menus/header_menu.html

<ul class="navbar-nav me-auto mb-2 mb-md-0">
    {% for menu_item in menu %}
    <li class="nav-item">
        <a class="nav-link {% if menu_item.is_current %}active{% endif %}" aria-current="page"
           {% if menu_item.target_blank %}target="_blank" {% endif %}
           href="{{ menu_item.get_link }}">{{ menu_item.title }}</a>
    </li>
    {% endfor %}
</ul>

# templates/menus/footer_menu.html

{% for menu_item in menu %}
<a {% if menu_item.target_blank %}target="_blank" {% endif %}
   href="{{ menu_item.get_link }}">{{ menu_item.title }}</a>
{% if not forloop.last %}|{% endif %}
{% endfor %}

```

Теперь вы можете авторизоваться в панели администратора и начать добавлять меню и страницы.

# Changelog

Смотрите [CHANGELOG.md](https://github.com/garpixcms/garpix_menu/blob/master/CHANGELOG.md).

# Contributing

Смотрите [CONTRIBUTING.md](https://github.com/garpixcms/garpix_menu/blob/master/CONTRIBUTING.md).

# License

[MIT](LICENSE)

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "garpix-menu",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "",
    "author": "Garpix LTD",
    "author_email": "info@garpix.com",
    "download_url": "https://files.pythonhosted.org/packages/ab/82/45a04e5fe0a0769c8e5861ac865fa3304d4e9b6e7f280f07d5908cc759e6/garpix_menu-1.17.1.tar.gz",
    "platform": null,
    "description": "# Garpix Menu\n\n\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043c\u0435\u043d\u044e \u0434\u043b\u044f [garpix_page](https://pypi.org/project/garpix-page/).\n\n## \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\n\n\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 [garpix_page](https://pypi.org/project/garpix-page/).\n\n---\n\n\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0441 pip:\n\n```bash\npip install garpix_menu\n```\n\n\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 `garpix_menu` \u0438 \u043f\u0430\u043a\u0435\u0442\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 `INSTALLED_APPS`:\n\n```python\n# settings.py\n\nINSTALLED_APPS = [\n    # ...\n    'garpix_menu',\n]\n\n```\n\n\u041f\u0430\u043a\u0435\u0442 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438, \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u0443\u0442\u044c \u043a \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0443 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 (`app/migrations/garpix_page/`) \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u043f\u0443\u0441\u0442\u043e\u0439 `__init__.py`:\n\n```\napp/migrations/\napp/migrations/__init__.py  # empty file\napp/migrations/garpix_menu/__init__.py  # empty file\n```\n\n\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043f\u0443\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438:\n\n```python\n# settings.py\n\nMIGRATION_MODULES = {\n    'garpix_menu': 'app.migrations.garpix_menu',\n}\n\nTEMPLATES = [\n    {\n        # ...\n        'OPTIONS': {\n            'context_processors': [\n                # ...\n                'garpix_menu.context_processors.menu_processor',\n            ],\n        },\n    },\n]\n```\n\n\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:\n\n```bash\npython manage.py makemigrations\n```\n\n\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:\n\n```bash\npython manage.py migrate\n```\n\n### \u041f\u0440\u0438\u043c\u0435\u0440\n\nSet up your custom menus in `settings.py`, for example:\n\n```python\n# settings.py\n\nMENU_TYPE_HEADER_MENU = 'header_menu'\nMENU_TYPE_FOOTER_MENU = 'footer_menu'\n\nMENU_TYPES = {\n    MENU_TYPE_HEADER_MENU: {\n        'title': 'Header menu',\n    },\n    MENU_TYPE_FOOTER_MENU: {\n        'title': 'Footer menu',\n    },\n}\n\nCHOICE_MENU_TYPES = [(k, v['title']) for k, v in MENU_TYPES.items()]\n```\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043c\u0435\u043d\u044e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:\n\n```html\n# templates/menus/default.html\n\n{% for menu_item in menu %}\n<a {% if menu_item.target_blank %}target=\"_blank\" {% endif %}\n   href=\"{{ menu_item.get_link }}\">{{ menu_item.title }}</a>\n{% if not forloop.last %}|{% endif %}\n{% endfor %}\n```\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438:\n\n```html\n# templates/base.html\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    {% include 'garpix_page/seo.html' %}\n    <link href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css\" rel=\"stylesheet\"\n          crossorigin=\"anonymous\">\n</head>\n<body>\n{% include 'include/header.html' %}\n\n<main class=\"container\">\n    {% block content %}\n    {% endblock %}\n</main>\n\n{% include 'include/footer.html' %}\n</body>\n</html>\n\n# templates/pages/default.html\n\n{% extends 'base.html' %}\n\n{% block content %}\n<h1>{{object.title}}</h1>\n<div>\n    {{object.content|safe}}\n</div>\n{% endblock %}\n\n# templates/include/header.html\n\n<nav class=\"navbar navbar-expand-md navbar-dark bg-dark\">\n    <div class=\"container-fluid\">\n        <a class=\"navbar-brand\" href=\"/\">My Site</a>\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExampleDefault\"\n                aria-controls=\"navbarsExampleDefault\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n            <span class=\"navbar-toggler-icon\"></span>\n        </button>\n\n        <div class=\"collapse navbar-collapse\" id=\"navbarsExampleDefault\">\n            {% include 'menus/header_menu.html' with menu=menus.header_menu %}\n        </div>\n    </div>\n</nav>\n\n# templates/include/footer.html\n\n<style>\n    /* Sticky footer styles\n    -------------------------------------------------- */\n    html {\n        position: relative;\n        min-height: 100%;\n    }\n\n    body {\n        margin-bottom: 60px; /* Margin bottom by footer height */\n    }\n\n    .footer {\n        position: absolute;\n        bottom: 0;\n        width: 100%;\n        height: 60px; /* Set the fixed height of the footer here */\n        line-height: 60px; /* Vertically center the text there */\n        background-color: #f5f5f5;\n    }\n\n</style>\n\n<footer class=\"footer\">\n    <div class=\"container\">\n        <span class=\"text-muted\">\n            {% include 'menus/footer_menu.html' with menu=menus.footer_menu %}\n        </span>\n    </div>\n</footer>\n\n# templates/menus/header_menu.html\n\n<ul class=\"navbar-nav me-auto mb-2 mb-md-0\">\n    {% for menu_item in menu %}\n    <li class=\"nav-item\">\n        <a class=\"nav-link {% if menu_item.is_current %}active{% endif %}\" aria-current=\"page\"\n           {% if menu_item.target_blank %}target=\"_blank\" {% endif %}\n           href=\"{{ menu_item.get_link }}\">{{ menu_item.title }}</a>\n    </li>\n    {% endfor %}\n</ul>\n\n# templates/menus/footer_menu.html\n\n{% for menu_item in menu %}\n<a {% if menu_item.target_blank %}target=\"_blank\" {% endif %}\n   href=\"{{ menu_item.get_link }}\">{{ menu_item.title }}</a>\n{% if not forloop.last %}|{% endif %}\n{% endfor %}\n\n```\n\n\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0435\u043d\u044e \u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n# Changelog\n\n\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 [CHANGELOG.md](https://github.com/garpixcms/garpix_menu/blob/master/CHANGELOG.md).\n\n# Contributing\n\n\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 [CONTRIBUTING.md](https://github.com/garpixcms/garpix_menu/blob/master/CONTRIBUTING.md).\n\n# License\n\n[MIT](LICENSE)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "",
    "version": "1.17.1",
    "project_urls": {
        "Changelog": "https://github.com/garpixcms/garpix_menu/blob/master/CHANGELOG.md/",
        "Documentation": "https://docs.garpixcms.ru/packages/garpix_menu/",
        "GitHub": "https://github.com/garpixcms/garpix_menu/"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "db8be6d6e5389c9aa660f2964854e0bc1c22d4e370ace8c9e19268a5d3347de1",
                "md5": "c741fe57d8a80c78675a2999ee2f5a09",
                "sha256": "9e79725b49cf57ba39eef1d550e6e3e642fd921be31a37d9fbb2ffcedcf803de"
            },
            "downloads": -1,
            "filename": "garpix_menu-1.17.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "c741fe57d8a80c78675a2999ee2f5a09",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 33146,
            "upload_time": "2024-03-14T11:43:10",
            "upload_time_iso_8601": "2024-03-14T11:43:10.686778Z",
            "url": "https://files.pythonhosted.org/packages/db/8b/e6d6e5389c9aa660f2964854e0bc1c22d4e370ace8c9e19268a5d3347de1/garpix_menu-1.17.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ab8245a04e5fe0a0769c8e5861ac865fa3304d4e9b6e7f280f07d5908cc759e6",
                "md5": "ca31e4c2d43a96a10c7ac1d5d1d09677",
                "sha256": "92b2867b47d9b909847750122bd6a1911f3ffc7b668351d10bf85302948167d9"
            },
            "downloads": -1,
            "filename": "garpix_menu-1.17.1.tar.gz",
            "has_sig": false,
            "md5_digest": "ca31e4c2d43a96a10c7ac1d5d1d09677",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 21240,
            "upload_time": "2024-03-14T11:43:12",
            "upload_time_iso_8601": "2024-03-14T11:43:12.019216Z",
            "url": "https://files.pythonhosted.org/packages/ab/82/45a04e5fe0a0769c8e5861ac865fa3304d4e9b6e7f280f07d5908cc759e6/garpix_menu-1.17.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-14 11:43:12",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "garpixcms",
    "github_project": "garpix_menu",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "garpix-menu"
}
        
Elapsed time: 0.31235s