如何在Django下拉菜单中移除或隐藏「设置和工具」子菜单?
如何移除Django下拉菜单中的「设置和工具」子菜单
问题描述
我是Python Django新手,想了解如何隐藏或移除下拉菜单中的「设置和工具」子菜单。当前使用的模板代码会渲染出包含该子菜单的页面,希望能将其移除或注释掉。
相关模板文件
generic_subnavigation.html
{% load common_tags %} {% load navigation_tags %} {% if link|common_get_type == "<class 'mayan.apps.navigation.classes.Menu'>" %} <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="true"> {% if link.icon %}{{ link.icon.render }}{% endif %} {{ link.label }} <span class="caret"></span> </a> <ul class="dropdown-menu"> {% navigation_resolve_menu name=link.name as sub_menus_results %} {% for sub_menu_results in sub_menus_results %} {% for link_group in sub_menu_results.link_groups %} {% with '' as li_class_active %} {% with link_group.links as object_navigation_links %} {% include 'navigation/generic_navigation.html' %} {% endwith %} {% endwith %} {% endfor %} {% endfor %} </ul> </li> {% else %} {% if as_li %} <li class="{% if link.active and li_class_active %}{{ li_class_active }}{% endif %}"> {% endif %} {% include link_template|default:'navigation/generic_link_instance.html' %} {% if as_li %} </li> {% endif %} {% endif %}
generic_link_instance.html
{% if link.separator %} <li role="separator" class="divider"></li> {% elif link.text_span %} <li class="text-center link-text-span {{ link.html_extra_classes }}" >{{ link.text }}</li> {% else %} {% if link.disabled %} <a class="{{ link.html_extra_classes }} {% if link_classes %}{{ link_classes }} {% else %}btn {% if 'dangerous' in link.tags %}btn-danger{% else %}btn-primary{% endif %} btn-xs{% endif %} {% if link.active %}{{ link_class_active }}{% endif %} {% if 'new_window' in link.tags %}new_window{% endif %} disabled" disabled='disabled' style="cursor: default;" href="#">{% if link.icon %}{{ link.icon.render }}{% endif %} {{ link.text }}{% if link.error %} - {{ link.error }}{% endif %}</a> {% else %} <a class="{{ link.html_extra_classes }} {% if link_classes %}{{ link_classes }} {% else %}btn {% if 'dangerous' in link.tags %}btn-danger{% else %}btn-primary{% endif %} btn-xs{% endif %} {% if link.active %}{{ link_class_active }}{% endif %} {% if 'new_window' in link.tags %}new_window{% endif %}" {% for key,value in link.html_data.items %} data-{{ key }}={{ value }} {% endfor %} {% if link.html_extra_attributes %}{{ link.html_extra_attributes }}{% endif %} {% if link.url %}href="{{ link.url }}"{% endif %} >{% if link.icon and not hide_icon %}{{ link.icon.render }}{% endif %} {{ link.text|default:'' }}{% if link.badge_text %} <span class="badge">{{ link.badge_text }}</span> {% endif %}{% if link.error %} - {{ link.error }}{% endif %} </a> {% endif %} {% endif %}
generic_navigation.html
{% load i18n %} {% for link in object_navigation_links %} {% include 'navigation/generic_subnavigation.html' %} {% endfor %}
action_dropdown.html
{% load i18n %} {% load common_tags %} <button aria-expanded="false" aria-haspopup="true" class="{{ action_dropdown_classes|default:"btn btn-default btn-danger"}} btn-sm dropdown-toggle" data-toggle="dropdown" type="button"> {% if action_dropdown_label %} {{ action_dropdown_label }} {% else %} {% trans 'Actions' %} {% endif %} <span class="caret"></span> <span class="sr-only">{% trans 'Toggle Dropdown' %}</span> </button> <ul class="dropdown-menu" role="menu"> {% for menus_link_result in action_menus_link_results %} {% if not action_menu_disable_labels and action_menus_link_results|length > 1 %} <li class="dropdown-header"><strong>{{ menus_link_result.menu.label }}</strong></li> <li class="divider"></li> {% endif %} {% for link_group in menus_link_result.link_groups %} {% if navigation_object_list %} {% ifchanged link_group.object %} {% common_get_object_verbose_name obj=link_group.object as link_group_object_verbose_name %} {% if link_group_object_verbose_name %}<li class="dropdown-header">{{ link_group_object_verbose_name }}</li>{% endif %} {% endifchanged %} {% endif %} {% with link_group.links as object_navigation_links %} {% with 'true' as as_li %} {% with 'true' as hide_active_anchor %} {% with 'btn btn-sm navigation-btn-dropdown' as link_classes %} {% include 'navigation/generic_navigation.html' %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% if not forloop.last and link_group %} <li class="divider"></li> {% endif %} {% endfor %} {% if not forloop.last and menus_link_result %} <li class="divider"></li> {% endif %} {% endfor %} </ul>
解决方案
方法1:精准过滤「设置和工具」菜单(推荐)
修改generic_subnavigation.html中的菜单渲染判断条件,添加对菜单标签的过滤,让模板跳过「设置和工具」菜单的渲染:
{% if link|common_get_type == "<class 'mayan.apps.navigation.classes.Menu'>" and link.label != "设置和工具" %}
如果项目使用多语言,建议用翻译标签确保兼容性:
{% load i18n %} {% if link|common_get_type == "<class 'mayan.apps.navigation.classes.Menu'>" and link.label != _("设置和工具") %}
方法2:临时注释掉子菜单渲染(快速方案)
如果只是临时隐藏,直接用Django模板注释语法{# ... #}把「设置和工具」对应的菜单块注释掉。或者如果要隐藏所有子菜单,注释掉generic_subnavigation.html中<ul class="dropdown-menu">到</ul>之间的所有内容:
{# <ul class="dropdown-menu"> {% navigation_resolve_menu name=link.name as sub_menus_results %} {% for sub_menu_results in sub_menus_results %} {% for link_group in sub_menu_results.link_groups %} {% with '' as li_class_active %} {% with link_group.links as object_navigation_links %} {% include 'navigation/generic_navigation.html' %} {% endwith %} {% endwith %} {% endfor %} {% endfor %} </ul> #}
方法3:从菜单注册层面移除(规范方案)
从代码结构看这是Mayan EDMS的项目,更规范的做法是在菜单注册的代码中移除「设置和工具」菜单。找到对应app下的menu.py文件,取消该菜单的注册或移除其与父菜单的关联,避免修改模板文件。
内容的提问来源于stack exchange,提问作者Jix Tang
相关产品推荐
相关产品推荐

