在模型的管理员中我想只允许对某些实例执行删除操作(我的模型有一个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)
答案 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)