所以我試圖爲Django Admin創建一個模板。我無法顯示的是安裝了所有應用程序的列表(將成爲菜單)。幾乎和django管理模板的index.html完全一樣。我發現了一篇關於如何在this link上重新創建此列表的文章。我不是100%,這個代碼將與Django 1.7 rc1一起工作(也試用1.6但仍然沒有),但我想我可以試試看。Django,在管理中的應用程序列表模板標籤base.html
主要問題是我無法管理如何使用菜單顯示模板標籤。我已創建自定義模板標籤,在過去,所以我仔細檢查了以下內容:
- 初始化的.py內templatetags文件夾
- 應用程序和模板標籤無論是在設置註冊
我得到的錯誤是'custom_menu'不是一個有效的標籤庫:ImportError提出加載djangobackend.apps.djangonicebackend.templatetags.custom_menu:無法導入名稱驗證.....。
下面你可以找到我的代碼。
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(應用/模板/ 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>
也
在之上我有{% load custom_menu %}
,在菜單應該顯示的地方,我得到了{% custom_app_list request %}
。
您的錯誤似乎與您提供的代碼不符。你確定你正在使用'{%load custom_menu%}'而不是'{%load custom_app_list%}'嗎?如果您更改了它,請確保您已重新加載服務器,並用實際錯誤更新您的問題。 – Alasdair
是的你是對的@Alasdair!我更新了我的代碼和錯誤。我剛剛改變了你說的話,忘了更新錯誤。 – manosim
您可能可以在沒有太多更改的情況下讓代碼在Django 1.6中工作。在Django 1.7中,應用程序已經發生了很大的變化,因此可能會更棘手。 – Alasdair