【发布时间】:2014-09-13 18:19:10
【问题描述】:
所以我正在尝试为 Django Admin 创建一个模板。我无法显示的是安装了所有应用程序的列表(将成为菜单)。与 django 管理模板的 index.html 几乎完全相同。我在this link 上找到了一篇关于如何重新创建此列表的文章。我不是 100% 认为这段代码可以与 Django 1.7 rc1 一起使用(也尝试过 1.6 但仍然没有),但我想我可以试一试。
主要问题是我无法管理如何使用菜单显示模板标签。我过去创建了自定义模板标签,所以我仔细检查了以下内容:
- init模板标签文件夹中的.py
- 应用和模板标签都在设置中注册
我得到的错误是 'custom_menu' 不是有效的标签库:ImportError raise loading loading djangobackend.apps.djangonicebackend.templatetags.custom_menu: cannot import name validate.....。
您可以在下面找到我的代码。
custom_menu.py(在模板标签目录内)
from django.utils.text import capfirst
from django.db.models import get_models
from django.utils.safestring import mark_safe
from django.contrib.admin import ModelAdmin
from django.contrib.admin.validation import validate
from django.template.loader import get_template
from django import template
register = template.Library()
IGNORE_MODELS = (
"sites",
"sessions",
"admin",
"contenttypes",
)
def custom_app_list(request):
# Get all models and add them to the context apps variable.
user = request.user
app_dict = {}
admin_class = ModelAdmin
for model in get_models():
validate(admin_class, model)
model_admin = admin_class(model, None)
app_label = model._meta.app_label
if app_label in IGNORE_MODELS:
continue
has_module_perms = user.has_module_perms(app_label)
if has_module_perms:
perms = model_admin.get_model_perms(request)
# Check whether user has any perm for this module.
# If so, add the module to the model_list.
if True in perms.values():
model_dict = {
'name': capfirst(model._meta.verbose_name_plural),
'admin_url': mark_safe('%s/%s/' % (app_label, model.__name__.lower())),
}
if app_label in app_dict:
app_dict[app_label]['models'].append(model_dict)
else:
app_dict[app_label] = {
'name': app_label.title(),
'app_url': app_label + '/',
'has_module_perms': has_module_perms,
'models': [model_dict],
}
app_list = app_dict.values()
app_list.sort(key=lambda x: x['name'])
for app in app_list:
app['models'].sort(key=lambda x: x['name'])
return {'apps': app_list}
t = get_template('templatetags/custom_menu.html')
register.inclusion_tag(t)(custom_app_list)
custom_menu.html (app/templates/templatetags/custom_menu.html)
<ul class="nav">
{% for app in custom_apps %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
{% trans app.name %}<b class="caret"></b>
</a>
<ul class="dropdown-menu">
{% for model in app.models %}
<li><a href="/{{ model.admin_url }}">{{ model.name }}</a></li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
也
在templates/admin/base.html 的顶部我有{% load custom_menu %},在应该显示菜单的地方我有{% custom_app_list request %}。
【问题讨论】:
-
您的错误似乎与您提供的代码不匹配。您确定您使用的是
{% load custom_menu %}而不是{% load custom_app_list %}?如果您已更改它,请确保您已重新加载服务器,并使用实际错误更新您的问题。 -
是的,你是对的@Alasdair!我更新了我的代码和错误。我刚刚改了你说的,忘记更新错误了。
-
您可能无需太多更改就可以让代码在 Django 1.6 中工作。应用程序在 Django 1.7 中发生了很大变化,所以这可能会更棘手。
标签: python django django-admin django-templates django-apps