在Django Admin中,你可以通過自定義Admin類來自定義哪些按鈕顯示,哪些不顯示。如果你想隱藏“新增”和“刪除”按鈕,可以通過重寫change_list_template或使用ModelAdmin的has_add_permission和has_delete_permission屬性來實現。
方法1:使用has_add_permission和has_delete_permission
你可以在ModelAdmin類中設置has_add_permission和has_delete_permission屬性為False來禁用新增和刪除功能。
from django.contrib import admin
from .models import MyModelclass MyModelAdmin(admin.ModelAdmin):has_add_permission = Falsehas_delete_permission = Falseadmin.site.register(MyModel, MyModelAdmin)
方法2:自定義change_list_template
如果你想要更細粒度的控制,比如在某些情況下顯示新增或刪除按鈕,你可以自定義change list的模板。首先,你需要創建一個自定義的模板,然后在你的ModelAdmin中指定這個模板。
創建一個自定義的模板文件,例如custom_changelist.html,并繼承自admin的base模板。
<!-- custom_changelist.html -->
{% extends "admin/change_list.html" %}
{% block object-tools-items %}{% if not has_add_permission %}<!-- 如果不需要添加按鈕,就不顯示添加按鈕的代碼 -->{% else %}{{ block.super }} <!-- 顯示其他默認按鈕 -->{% endif %}{% if not has_delete_permission %}<!-- 如果不需要刪除按鈕,就不顯示刪除按鈕的代碼 -->{% endif %}
{% endblock %}
在你的ModelAdmin中指定這個模板。from django.contrib import admin
from django.urls import reverse
from django.utils.safestring import mark_safe
from .models import MyModelclass MyModelAdmin(admin.ModelAdmin):change_list_template = 'custom_changelist.html'has_add_permission = False # 根據需要設置has_delete_permission = False # 根據需要設置
# 如果需要在某些情況下才顯示添加或刪除按鈕,可以在模板中根據條件判斷是否顯示。# 這里可以根據request或其他邏輯來設置has_add_permission和has_delete_permission的值。def get_queryset(self, request):qs = super().get_queryset(request)# 這里可以添加邏輯來決定是否顯示添加或刪除按鈕,例如基于用戶的權限等。return qsdef has_add_permission(self, request):# 例如,只有當用戶是超級用戶時才顯示添加按鈕return request.user.is_superuserdef has_delete_permission(self, request, obj=None):# 例如,只有當用戶是超級用戶時才顯示刪除按鈕return request.user.is_superuseradmin.site.register(MyModel, MyModelAdmin)
方法3:使用裝飾器控制權限(不推薦直接在視圖上使用)
如果你想要更靈活地控制權限,可以在視圖的裝飾器中控制,但這通常不推薦用于控制Django Admin的UI元素。更好的做法是使用上面提到的方法來控制權限和UI元素。例如:
from django.contrib.admin.views.decorators import staff_member_required
from django.utils.decorators import method_decorator
from django.contrib import admin
from .models import MyModel@method_decorator(staff_member_required, name='has_add_permission')
class MyModelAdmin(admin.ModelAdmin):pass # 其他配置...
注意:直接在視圖裝飾器上使用通常不是最佳實踐,因為它更多地用于控制訪問權限而非UI元素的顯示隱藏。對于UI元素的顯示隱藏,建議使用上述方法1和方法2。