django:侧面菜单模板随处可见

时间:2016-10-10 22:38:45

标签: python django

我需要在我的django管理员中创建一个应该出现在所有页面中的侧边菜单。理想情况下,我的模板应该是包含此代码和解析app_list参数的通用navigation.html文件(与填充仪表板的index.html模板中使用的相同):

{% block side_menu %}
{% if app_list %}
    {% for app in app_list %}
        <ul class="sidebar-menu app-{{ app.app_label }} module">
         <li class="treeview">
           <a href="#">
            <i class="fa fa-dashboard"></i> <span>{{ app.name | truncatechars:"25" }}</span>
            <span class="pull-right-container">
              <i class="fa fa-angle-left pull-right"></i>
            </span>
          </a>

        {% for model in app.models %}
        <ul class="treeview-menu">
            {% if model.admin_url %}
                <li><a href="{{ model.admin_url }}"><strong>{{ model.name }}</strong></a></li>
            {% else %}
                <li>{{ model.name }}</li>
            {% endif %}

            {% if model.add_url %}
                <li><a href="{{ model.add_url }}"><i class="fa fa-plus"></i> {% trans 'Add' %}</a></li>
            {% else %}
                <td>&nbsp;</td>
            {% endif %}

            {% if model.admin_url %}
                <li><a href="{{ model.admin_url }}"><i class="fa fa-pencil-square-o"></i> {% trans 'Change' %}</a></li>
            {% else %}
                <td>&nbsp;</td>
            {% endif %}
        </ul>
        {% endfor %}
        </li>
      </ul>
    {% endfor %}
{% else %}
    <p>{% trans "You don't have permission to edit anything." %}</p>
{% endif %}
{% endblock side_menu %}

我的问题是:

1)如何在所有页面中包含新的navigations.html模板?

2)如何将app_list字典传递给此模板?

提前完成

1 个答案:

答案 0 :(得分:1)

1)看起来像you're on the right track - 你有{% block %}。您只需要让其他文件扩展该导航文件(您可能只想将其设为base.html,如链接中的文档,并使其包含所有页面应具有的所有内容)并允许这些页面添加自己的内容

这样navigations.html允许身体:

<html>
    {% block side_menu %}
        ...
    {% endblock side_menu %}
    <body>
        {% block body %}
        {% endblock body %}
    </body>
</html>

然后在每个模板的顶部:

{% extends 'my_app/navigations.html' %}

{% block body %}

中包含该模板内容

2)您可以make a template context processor将上下文传递给每个模板。根据文档,它们非常简单:

  

这是一个Python函数,它接受一个参数,一个HttpRequest对象,   并返回一个添加到模板上下文的字典

所以:

def my_context_processor(request):
    apps = App.objects.all()
    return {'app_list': apps}

并在您的设置中:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # Other context processors....
                'my_app.processors.my_context_processor',
            ],
        },
    },
]

现在,在每个模板中,您都可以执行{% for app in app_list %},而无需您的视图返回该上下文。