2014-07-22 45 views
0

所以我試圖爲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 %}

+0

您的錯誤似乎與您提供的代碼不符。你確定你正在使用'{%load custom_menu%}'而不是'{%load custom_app_list%}'嗎?如果您更改了它,請確保您已重新加載服務器,並用實際錯誤更新您的問題。 – Alasdair

+0

是的你是對的@Alasdair!我更新了我的代碼和錯誤。我剛剛改變了你說的話,忘了更新錯誤。 – manosim

+0

您可能可以在沒有太多更改的情況下讓代碼在Django 1.6中工作。在Django 1.7中,應用程序已經發生了很大的變化,因此可能會更棘手。 – Alasdair

回答

1

這個進口是無效的,所以提高ImportError

from django.contrib.admin.validation import validate 

模塊django.contrib.admin.validation不包含功能validate。它有一個BaseValidator對象,它有一個validate方法。

不知道爲什麼你試圖導入validate無論如何。嘗試刪除導入,並從模板標籤中調用validate

對於第二個錯誤,您需要確保request位於模板上下文中。這樣做的最簡單方法是將request template context processor添加到您的TEMPLATE_CONTEXT_PROCESSORS設置中。

+0

嗯做到了這一點,現在我得到''str'對象沒有屬性'user''。 「{%custom_app_list request%}」有問題。我認爲代碼(你可以在這個問題中找到鏈接)有點老,所以我不確定自那以後發生了什麼變化。 – manosim

+0

是的你是對的。謝謝!將該請求添加到模板上下文,現在它可以工作,儘管它仍然不顯示應用程序,但我想我必須解決這兩個問題。有沒有辦法做到這一點,而不改變任何設置(沒有添加請求)? – manosim

+0

模板標籤需要請求對象,以便它可以檢查用戶的權限。你可以改變所有的管理視圖來在模板上下文中包含'request',但使用模板上下文處理器要容易得多。 – Alasdair