Если ваше приложение (как отдельный модуль) имеется возможность показывать меню с других приложений (связанных с этим в настройках), тогда вам необходимо добавить в ваше меню возможность вывода этих данных.
Меню -> Настройки -> Плагины -> Отделения -> Связать с этим плагином
Выбрать Бухгалтерия и связать
Теперь ваше приложение money
будет искать наличие субменю для вывода в меню своего приложения. В данном случае мы рассматриваем вывод меню для фильтрации записей в money
относительно склада, к которому привязана запись цены в модели.
Пример приводится на создании субменю между приложениями money и storehouse. В приложении money будет выводится данные из приложения storehouse не напрямую, а через хаб в приложении plugins.utils
Создаем файлы templatetags
:
storehouse/templatetags/__init__.py
storehouse/templatetags/sidebar_storehouse_related_submenu_tags.py
from django import template
from .models import Storehouses
register = template.Library()
@register.inclusion_tag('storehouse/related/tags/sidebar_storehouse_related_submenu_tags.html', takes_context=True)
def show_menu(context):
query = Storehouses.objects.all()
context['storehouses'] = query
return context
Создаем файл templates
:
storehouse/templates/storehouse/related/load_sidebar_storehouse_related_submenu_tags.html
этот файл будет вызывать связанное приложение через include
{% load sidebar_storehouse_related_submenu_tags %}
{% show_menu %}
Создаем файл templates
:
storehouse/templates/storehouse/related/tags/sidebar_storehouse_related_submenu_tags.html
# sidebar_storehouse_related_submenu_tags.html
<!-- не используйте кнопку submit и form и csrf токен в related html файлах-->
<!--begin:Menu item-->
<div data-kt-menu-trigger="click" class="menu-item menu-accordion show">
<!--begin:Menu link-->
<span class="menu-link">
<span class="menu-icon">
<!--begin::Svg Icon | path: icons/duotune/communication/com012.svg-->
<span class="svg-icon svg-icon-2">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.3"
d="M20 3H4C2.89543 3 2 3.89543 2 5V16C2 17.1046 2.89543 18 4 18H4.5C5.05228 18 5.5 18.4477 5.5 19V21.5052C5.5 22.1441 6.21212 22.5253 6.74376 22.1708L11.4885 19.0077C12.4741 18.3506 13.6321 18 14.8167 18H20C21.1046 18 22 17.1046 22 16V5C22 3.89543 21.1046 3 20 3Z"
fill="currentColor"/>
<rect x="6" y="12" width="7" height="2" rx="1" fill="currentColor"/>
<rect x="6" y="7" width="12" height="2" rx="1" fill="currentColor"/>
</svg>
</span>
<!--end::Svg Icon-->
</span>
<span class="menu-title">Модуль "Склады"</span>
<span class="menu-arrow"></span>
</span>
<!--end:Menu link-->
<!--begin:Menu sub-->
<div class="menu-sub menu-sub-accordion ">
<!--begin:Menu item-->
<div class="menu-item">
<!--begin:Menu link-->
<div class="list-group">
<input type="hidden" name="relateddata" value="{'storehouse' : {'category': 'filterform'}}">
<select name="storehouse" id="storehouse">
{% for item in storehouses %}
<option value="{{ item.id }}">{{ item.name }}</option>
{% endfor %}
</select>
<br>
</div>
<!--end:Menu link-->
</div>
<!--end:Menu item-->
</div>
<!--end:Menu sub-->
</div>
Файл related.py содержит каждое приложение crm hub. Файл содержит класс class AppRelated, который имеет разные методы для работы с другими приложениями. Этот класс и методы запрашивает встроеное приложение plugins, которое и является хабом для других приложенией
Файл storehouse/related.py
содержит не активный метод submenuImportRelated, который отвечает за возврат строки с содержанием ссылки на html файл для include
def submenuImportRelated(self, **kwargs):
pass
изменяем метод
def submenuImportRelated(self, **kwargs):
return 'storehouse/related/load_sidebar_storehouse_related_submenu_tags.html'
Каждое приложение имеет стандартный вид распложения html блоков. Вывод основного меню каждого приложения выглядит так:
money/templates/money/money_list.html
{% extends "base.html" %}
{% load money_template_tags %}
{% block title %}{{ title }} - {{ block.super }}{% endblock %}
{% block sidebar %}
{% include 'include/_sidebar_money.html' %}
{% endblock %}
....
мы подгружаем файл _sidebar_money.html
, который запускает load tags
и вызывает метод show_menu
# _sidebar_money.html
{% load sidebar_money_menu_tags %}
{% show_menu %}
money/templatetags/sidebar_money_menu_tags.py
содержит метод show_menu
, который вызывает из ядра CRM HUB класс RelatedMixin
, который позволяет взаимодействовать приложениям друг с другом. Ядро в данном случае подразумевается основные приложения CRM HUB, которые встроены в базовую версию.
# money/templatetags/sidebar_money_menu_tags.py
from django import template
from plugins.utils import RelatedMixin
register = template.Library()
@register.inclusion_tag('money/sidebar_money_menu_tags.html', takes_context=True)
def show_menu(context):
Relateddata = RelatedMixin()
Relateddata.related_module_name = 'money'
related_submenu = Relateddata.relatedImportSubmenu()
context['relatedmenu'] = related_submenu
return context
мы добавляем в context['relatedmenu']
вывод данных из всех связанных приложенией для money
.
Файл money/templates/money/sidebar_money_menu_tags.html
выводит суб меню всех связанных приложений в виде формы
<div class="menu menu-column menu-rounded menu-sub-indention fw-semibold fs-6" id="#kt_aside_menu" data-kt-menu="true">
<!--begin:Menu NEW item-->
<div class="menu-item pt-5">
<!--begin:Menu content-->
<div class="menu-content">
<span class="menu-heading fw-bold text-uppercase fs-7">Фильтрация</span>
</div>
<!--end:Menu content-->
</div>
<!-- используем этот код если модуль подразумевает возможность поиска, фильтарции или меню от других приложенией -->
<form action="" method="get">
{% csrf_token %}
{% for key, value in relatedmenu.items %}
{% for k2, v2 in value.items %}
{% if k2 == 'submenu_import' %}
{% include v2 %}
{% endif %}
{% endfor %}
{% endfor %}
<br>
<div class="d-flex flex-row justify-content-center align-items-center">
<button type="submit" class="btn btn-secondary text-center" id="button-addon2">Сортировать</button>
</div>
</form>
</div>
Пример того, как это выглядит, приложение money связано с приложениями orders и storehouse. При выводе меню, показываются данные для фильтрации данных бухгалтерии, где мы можем отсортировать их в соответствии с логикой каждого приложения отдельно.