【问题标题】:Remove the default delete action in Django admin删除 Django admin 中的默认删除操作
【发布时间】:2016-03-13 03:48:59
【问题描述】:

如何删除 Django admin 中的默认删除操作? 下面的工作吗?

actions = [ ] 

【问题讨论】:

  • 为此,您可以在 django admin 中使用组和权限。

标签: python django django-admin


【解决方案1】:

在您的管理类中,定义 has_delete_permission 以返回 False

class YourModelAdmin(admin.ModelAdmin):
    ...

    def has_delete_permission(self, request, obj=None):
        return False

然后,它不会显示删除按钮,并且不允许您在管理界面中删除对象。

【讨论】:

  • 这将删除删除按钮,但不会从下拉列表中删除删除选项,该选项用于选择多个条目并执行删除操作。
  • @DawnTCherian,你是对的。但不允许删除;尝试将返回 403 禁止响应。
  • @DawnTCherian,仅供参考,您的解决方案将在详细管理页面中显示删除按钮。
  • 是的,但我已经为 has_delete_permission 返回 false。
  • 在 django 2.2 中,这删除了列表显示操作中的删除选项和编辑页面(表单)上的删除按钮。
【解决方案2】:

这行得通:

def get_actions(self, request):
    actions = super().get_actions(request)
    if 'delete_selected' in actions:
        del actions['delete_selected']
    return actions

根据 Django 的以下文档,这也是推荐的方法:

Conditionally enabling or disabling actions

【讨论】:

  • 这种方法只影响列表视图。删除操作在实例编辑页面中仍然可用。
  • @niekas 是的,但是我已经为 has_delete_permission 返回了 false,所以详细页面中有删除按钮。
  • 对于更pythonic的方式,您可以使用try: del actions['delete_selected'] except KeyError: pass,而不是事先检查它是否存在;)
  • 这是一些危险的默认功能。
【解决方案3】:

如果要删除所有操作:

class UserAdmin(admin.ModelAdmin):
    model = User
    actions = None

如果您想要一些特定的操作:

class UserAdmin(admin.ModelAdmin):
    model = User
    actions = ['name_of_action_you_want_to_keep']

【讨论】:

  • 动作 = ['name_of_action_you_want_to_keep'] 不适用于 Django 2.0
【解决方案4】:

您可以在站点范围内禁用“删除选定”操作:

from django.contrib.admin import site
site.disable_action('delete_selected')

当您需要包含此操作时,将'delete_selected' 添加到操作列表中:

actions = ['delete_selected']

Documentation

【讨论】:

    【解决方案5】:

    如果您使用该模型,则作为其他模型中的外键。 然后通过对该外键使用 PROTECT 约束,您可以在 Django 管理员中禁用该模型的删除。

    例如,

    class Exam(models.Model):
        student = models.ForeignKey(User, on_delete=models.PROTECT)
        marks = models.IntegerField(default=0)
    

    通过Exam 模型中存在的外键将PROTECT 约束添加到User 模型,我已禁用(在Django admin 或其他地方)删除参加过笔试的学生(User) 的权力。

    【讨论】:

      【解决方案6】:

      感谢@DawnTCherian、@tschale 和@falsetru

      我用过:

      class YourModelAdmin(admin.ModelAdmin):
      ...
        def get_actions(self, request):
            actions = super(YourModelAdmin, self).get_actions(request)
            try:
                del actions['delete_selected']
            except KeyError:
              pass
            return actions
      
        def has_delete_permission(self, request, obj=None):
            return False
      

      它从列表视图中删除删除操作,从详细视图中删除删除选项。

      【讨论】:

        【解决方案7】:

        您可以全局禁用批量删除操作并仅对选定模型启用。

        来自django website的文档

        # Globally disable delete selected
        admin.site.disable_action('delete_selected')
        
        # This ModelAdmin will not have delete_selected available
        class SomeModelAdmin(admin.ModelAdmin):
            actions = ['some_other_action']
            ...
        
        # This one will
        class AnotherModelAdmin(admin.ModelAdmin):
            actions = ['delete_selected', 'a_third_action']
            ...
        

        【讨论】:

        • 谢谢,在管理员范围内删除它真的很有用!
        猜你喜欢
        • 2010-12-06
        • 2011-01-21
        • 2017-01-22
        • 2019-09-09
        • 1970-01-01
        • 2016-09-21
        • 1970-01-01
        • 2018-09-15
        • 2013-05-18
        相关资源
        最近更新 更多