仅允许从管理员中删除模型的某些给定实例

时间:2012-01-26 21:29:37

标签: django admin

在模型的管理员中我想只允许对某些实例执行删除操作(我的模型有一个DateTimeField,我想禁用对该字段设置为当前月份的实例的删除操作)

有人可以帮忙吗?

谢谢

修改

我尝试了克里斯在他下面的anser中提出的方法,但是obj总是无:

class UserProfileAdmin(admin.ModelAdmin):

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

        # obj is always None

        return super(UserProfileAdmin, self).has_delete_permission(request, obj=obj)

2 个答案:

答案 0 :(得分:4)

class MyModelAdmin(admin.ModelAdmin):
     ...
     def has_delete_permission(self, request, obj=None):
         if obj is not None and \
            obj.my_date_field.month == datetime.now().month and \
            obj.my_date_field.year == datetime.now().year:

             return False

         return super(MyModelAdmin, self).has_delete_permission(request, obj=obj)

<强>更新

它不是“总是无”,当可以确定特定对象时,它被设置为特定对象。在更改列表中,特别是在尝试从更改列表中批量删除时,它设置为None,因为显然无法确定单个对象。

如果您需要考虑从更改列表中删除,您必须创建自己的删除操作并替换默认的Django版本。类似的东西:

class MyModelAdmin(admin.ModelAdmin):
    ...
    actions = ['limited_delete_selected']

    # Need to remove the default delete_selected action
    def get_actions(self, request):
        actions = super(MyModelAdmin, self).get_actions(request)
        if actions.has_key('delete_selected'):
            del actions['delete_selected']
        return actions

    def limited_delete_selected(self, request, queryset):
        # filter selected items to only those that are actually deletable
        now = datetime.now()
        queryset = queryset.exclude(date_field__month=now.month, date_field__year=now.year)

        # call Django's delete_selected with limited queryset
        from django.contrib.admin.actions import delete_selected
        delete_selected(self, request, queryset)
    limited_delete_selected.short_description = "Delete selected objects or whatever you want it to say"

您实际上需要操作和原始has_delete_permission,因为可以在change_form视图中单独删除对象。

答案 1 :(得分:1)