2010-03-12 154 views
61

在註冊模型出現的管理站點的根頁面,我想隱藏註冊到Django管理員的幾個模型。Django管理員,隱藏模型

如果我直接取消註冊這些,那麼隨着添加新符號「+」消失,我無法添加新記錄。

這怎麼辦?

回答

87

基於x0nix's answer我做了一些實驗。這似乎是從get_model_perms返回一個空的字典從index.html排除模型,同時仍允許您直接編輯實例。

class MyModelAdmin(admin.ModelAdmin): 
    def get_model_perms(self, request): 
     """ 
     Return empty perms dict thus hiding the model from admin index. 
     """ 
     return {} 

admin.site.register(MyModel, MyModelAdmin) 
+2

好看又簡潔。謝謝! – 2011-02-22 03:55:34

+0

同意。只有當我不想更改代碼時,這是個問題。我的意思是,我有一個基本應用程序,我想保持從其他應用程序的依賴清除。我將這些依賴關係保存在派生項目特定的應用程序中。現在我想讓管理界面只顯示派生的應用程序,而不是基本的應用程序。 Django需要將基本應用程序列在設置/ INSTALLED_APPS中才能使派生應用程序正常工作。顯然,基本應用程序不應該顯示,但同時我不希望保持它不被修改和可重用。請參閱[這裏]([se]/questions/13923968 /)。 – Sven 2012-12-20 20:56:12

+5

更簡短的方法:'get_model_perms = lambda self,req:{}' – 2013-08-19 12:53:28

1

醜陋的解決方案:從Django中你/admin/index.html override管理指數模板即複製的index.html,並添加這樣的:

{% for for model in app.models %} 
    {% ifnotequal model.name "NameOfModelToHide" %} 
    ... 
21

得到了同樣的問題,在這裏我想出了。

就像在以前的解決方案 - 複製的index.html從Django中你/admin/index.html並修改它是這樣的:

{% for model in app.models %} 
    {% if not model.perms.list_hide %} 
    <tr> 
    ... 
    </tr> 
    {% endif %} 
{% endfor %} 

,創造的ModelAdmin子類:

class HiddenModelAdmin(admin.ModelAdmin): 
    def get_model_perms(self, *args, **kwargs): 
     perms = admin.ModelAdmin.get_model_perms(self, *args, **kwargs) 
     perms['list_hide'] = True 
     return perms 

現在,任何使用HiddenModelAdmin子類註冊的模型將不會顯示在管理列表中,但將通過「加號」詳細提供:

class MyModelAdmin(HiddenModelAdmin): 
    ... 

admin.site.register(MyModel, MyModelAdmin) 
+0

非常感謝答案! – Hellnar 2010-05-05 20:44:13

+0

簡單易用。好主意的人! ;) – 2011-05-27 17:36:38

+0

這是一個比公認的更加優雅和多功能的解決方案 – XelharK 2013-12-12 15:23:57

0

的Django 1.2具有新的if語句,這意味着所需的功能,可以通過覆蓋只有獲得管理員/ index.html的

{% if model.name not in "Name of hidden model; Name of other hidden model" %} 
    ... 
{% endif %} 

這是一個壞的解決方案,因爲它不會在乎多語言管理員。您當然可以在所有支持的語言中添加模型的名稱。這是一個很好的解決方案,因爲它不會覆蓋核心Django函數的多個方面。

但任何更改之前,我認爲人們應該思考這個...

本質的問題是關係到具有一個不希望使用超過增加一個選項,下拉一旦模型等一下。它可以通過爲「不那麼先進」的用戶創建一組權限來有效地解決問題,當模型太多時會驚慌失措。如果需要更改特定型號,只需使用「高級帳戶」即可登錄。

1

這是在頂部x0nix的答案的替代建設,只有你很高興隱藏與jQuery的行。

從對方的回答複製粘貼,我重用

class HiddenModelAdmin(admin.ModelAdmin): 
def get_model_perms(self, *args, **kwargs): 
    perms = admin.ModelAdmin.get_model_perms(self, *args, **kwargs) 
    perms['list_hide'] = True 
    return perms 

class MyModelAdmin(HiddenModelAdmin): 
... 

admin.site.register(MyModel, MyModelAdmin) 

然後安裝django-jquery,然後在/admin/index.html模板添加以下塊中的一部分:

{% extends "admin:admin/index.html" %} 

{% block extrahead %} 
    <script type="text/javascript" src="{{ STATIC_URL }}js/jquery.js"></script> 
    {% if app_list %} 
     <script type="text/javascript"> 
     $(function(){ 
      {% for app in app_list %} 
      {% for model in app.models %} 
       {% if model.perms.list_hide %} 
        $('div.app-{{ app.app_label }}').find('tr.model-{{ model.object_name|lower }}').hide(); 
       {% endif %} 
      {% endfor %} 
      {% endfor %} 
     }); 
    </script> 
    {% endif %} 
{% endblock %} 

你並不需要複製粘貼整個模板,只需將其擴展並覆蓋extrahead塊。你需要django-apptemplates爲上述工作。

11

由於Django 1.8,ModelAdmin已經有了一個新的方法,稱爲has_module_permission()它負責在管理索引中顯示模型。

要從管理索引隱藏模型,只需在您的ModelAdmin類中創建此方法並返回False。例如:

class MyModelAdmin(admin.ModelAdmin): 
    ... 
    def has_module_permission(self, request): 
     return False 
+0

不幸的是,'has_module_permission'影響整個應用程序,而不僅僅是一個模型。因此,將此添加到應用程序中的模型會導致應用程序模型列表中的403 Forbidden(/ admin/app_label /)。參見[django/contrib/admin/sites.py](https://github.com/django/django/blob/255fb992845e987ef36e3d721a77747a0b2df620/django/contrib/admin/sites.py#L401)。 – Fabian 2016-07-26 09:51:49

+1

@Fabian我認爲這是一個錯誤。我在Django的IRC頻道上問過這個問題,那裏的一些人同意這種行爲是不希望的。 – xyres 2016-07-26 14:09:58

+0

@Fabian假設管理索引頁仍然鏈接到_/admin/_,可以通過'return request.path!='/ admin /''這樣的東西來繞過這個錯誤。不幸的是,在應用模型列表中重新啓用了這些模型。 – ecp 2016-08-22 15:21:16

0

我有很多模型管理員的登記和隱藏,如果你想要一個更乾的解決方案,這個工作對我來說(Django的1.10,Python的3.5)

# admin.py 

def register_hidden_models(*model_names): 
    for m in model_names: 
     ma = type(
      str(m)+'Admin', 
      (admin.ModelAdmin,), 
      { 
       'get_model_perms': lambda self, request: {} 
      }) 
     admin.site.register(m, ma) 

register_hidden_models(MyModel1, MyModel2, MyModel3) 

我想你可以如果您想跨應用程序重新使用它,請將其滾動到實用程序課程中。

0

截至Django 1.8.18,has_module_permission()還有問題。所以,在我們的情況下,我們也使用get_model_perms()。同樣,我們只需要爲特定用戶隱藏模型,但superuser應該能夠訪問其索引條目。

class MyModelAdmin(admin.ModelAdmin): 
    def get_model_perms(self, request): 
     if not request.user.is_superuser: 
      return {} 
     return super(MyModelAdmin, self).get_model_perms(request) 

admin.site.register(MyModel, MyModelAdmin)