回答
基於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)
醜陋的解決方案:從Django中你/admin/index.html override管理指數模板即複製的index.html,並添加這樣的:
{% for for model in app.models %}
{% ifnotequal model.name "NameOfModelToHide" %}
...
得到了同樣的問題,在這裏我想出了。
就像在以前的解決方案 - 複製的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)
的Django 1.2具有新的if語句,這意味着所需的功能,可以通過覆蓋只有獲得管理員/ index.html的
{% if model.name not in "Name of hidden model; Name of other hidden model" %}
...
{% endif %}
這是一個壞的解決方案,因爲它不會在乎多語言管理員。您當然可以在所有支持的語言中添加模型的名稱。這是一個很好的解決方案,因爲它不會覆蓋核心Django函數的多個方面。
但任何更改之前,我認爲人們應該思考這個...
本質的問題是關係到具有一個不希望使用超過增加一個選項,下拉一旦模型等一下。它可以通過爲「不那麼先進」的用戶創建一組權限來有效地解決問題,當模型太多時會驚慌失措。如果需要更改特定型號,只需使用「高級帳戶」即可登錄。
這是在頂部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爲上述工作。
由於Django 1.8,ModelAdmin
已經有了一個新的方法,稱爲has_module_permission()
它負責在管理索引中顯示模型。
要從管理索引隱藏模型,只需在您的ModelAdmin
類中創建此方法並返回False
。例如:
class MyModelAdmin(admin.ModelAdmin):
...
def has_module_permission(self, request):
return False
不幸的是,'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
@Fabian我認爲這是一個錯誤。我在Django的IRC頻道上問過這個問題,那裏的一些人同意這種行爲是不希望的。 – xyres 2016-07-26 14:09:58
@Fabian假設管理索引頁仍然鏈接到_/admin/_,可以通過'return request.path!='/ admin /''這樣的東西來繞過這個錯誤。不幸的是,在應用模型列表中重新啓用了這些模型。 – ecp 2016-08-22 15:21:16
我有很多模型管理員的登記和隱藏,如果你想要一個更乾的解決方案,這個工作對我來說(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)
我想你可以如果您想跨應用程序重新使用它,請將其滾動到實用程序課程中。
截至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)
- 1. Django動態模型註冊管理員
- 2. Django管理員內聯父模型
- 3. Django管理員註銷模型保存
- 4. 在Django的組模型管理員
- 5. 模型不顯示在Django管理員
- 6. 從django管理員訪問其他模型管理
- 7. Django管理員。上改變選擇字段隱藏場
- 8. 隱藏燒瓶管理員路線
- 9. 隱藏/更改WooCommerce管理員通知
- 10. 隱藏管理員在Structr的結果
- 11. AuthLogic管理員用戶和隱藏非管理員的管理鏈接
- 12. Django的:隱藏模型類型與管理頁面上沒有實例
- 13. Django管理員DoesNotExist在/管理員/
- 14. 模型內的Django管理模型
- 15. Django管理員url.py
- 16. 從django模型中隱藏字段
- 17. Django隱藏模型中的假字段
- 18. 在django中隱藏模型字段
- 19. Django:更新模板 - 通知管理員
- 20. Django管理員:內聯2個外鍵Many2Many模型
- 21. 查找管理員更改任意Django模型的網址
- 22. Django更新模型已經破壞了管理員
- 23. django管理員 - 選擇一個模型發佈到網站
- 24. Django管理員導致一個模型的高負載
- 25. 如何在Django管理員中顯示模型名稱?
- 26. Django管理員頁面:模型方法的幫助文本?
- 27. Django管理員:ManytoMany模型過濾器,另一種方式
- 28. Django管理員提供模型的組編輯嗎?
- 29. Django,在管理員中設置用戶模型的角色
- 30. Django模型權限未在管理員身上拾取
好看又簡潔。謝謝! – 2011-02-22 03:55:34
同意。只有當我不想更改代碼時,這是個問題。我的意思是,我有一個基本應用程序,我想保持從其他應用程序的依賴清除。我將這些依賴關係保存在派生項目特定的應用程序中。現在我想讓管理界面只顯示派生的應用程序,而不是基本的應用程序。 Django需要將基本應用程序列在設置/ INSTALLED_APPS中才能使派生應用程序正常工作。顯然,基本應用程序不應該顯示,但同時我不希望保持它不被修改和可重用。請參閱[這裏]([se]/questions/13923968 /)。 – Sven 2012-12-20 20:56:12
更簡短的方法:'get_model_perms = lambda self,req:{}' – 2013-08-19 12:53:28