Sté*_*ane 23
作为Googol解决方案的替代方案,并且等待在当前Django版本中实现 delete_model(),我建议使用以下代码.
它仅禁用当前AdminForm的默认删除操作.
class FlowAdmin(admin.ModelAdmin):
    actions = ['delete_model']
    def get_actions(self, request):
        actions = super(MyModelAdmin, self).get_actions(request)
        del actions['delete_selected']
        return actions
    def delete_model(self, request, obj):
        for o in obj.all():
            o.delete()
    delete_model.short_description = 'Delete flow'
admin.site.register(Flow, FlowAdmin)
Joe*_*ska 21
您可以禁止使用此代码显示操作.
from django.contrib import admin
admin.site.disable_action('delete_selected')
如果您选择,则可以使用以下方法在单个模型上恢复它:
class FooAdmin(admin.ModelAdmin):
    actions = ['my_action', 'my_other_action', admin.actions.delete_selected]
Dom*_*ger 12
不确定这种猴子修补是不是一个好主意,但是在我的admin.py一件作品中把它推给我:
from django.contrib.admin.actions import delete_selected
delete_selected.short_description = u'How\'s this for a name?'
这将更改所有管理站点的详细名称.如果您只想为一个特定型号的管理员更改它,我认为您需要编写自定义管理操作.
使用Django 1.1版进行测试:
>>> import django
>>> django.VERSION
(1, 1, 0, 'beta', 1)
对于全局更改delete_selected的简短描述,多米尼克·罗杰的答案似乎是最好的。
\n然而,为了更改单个模型的管理上的short_description,我认为St\xc3\xa9phane \ 的答案的替代方案更好:
\ndef get_actions(self, request):\n    actions = super().get_actions(request)\n    actions[\'delete_selected\'][0].short_description = "Delete Selected"\n    return actions\n小智 5
为了替换delete_selected,我执行以下操作:
将函数复制delete_selected到contrib/admin/actions.py您的admin.py并重命名。还将模板复制contrib/admin/templates/delete_selected_confirmation.html到模板目录并重命名。我的看起来像这样:
def reservation_bulk_delete(modeladmin, request, queryset):
    """
    Default action which deletes the selected objects.
    This action first displays a confirmation page whichs shows all the
    deleteable objects, or, if the user has no permission one of the related
    childs (foreignkeys), a "permission denied" message.
    Next, it delets all selected objects and redirects back to the change list.
    """
    opts = modeladmin.model._meta
    app_label = opts.app_label
    # Check that the user has delete permission for the actual model
    if not modeladmin.has_delete_permission(request):
        raise PermissionDenied
    # Populate deletable_objects, a data structure of all related objects that
    # will also be deleted.
    # deletable_objects must be a list if we want to use '|unordered_list' in the template
    deletable_objects = []
    perms_needed = set()
    i = 0
    for obj in queryset:
        deletable_objects.append([mark_safe(u'%s: <a href="%s/">%s</a>' % (escape(force_unicode(capfirst(opts.verbose_name))), obj.pk, escape(obj))), []])
        get_deleted_objects(deletable_objects[i], perms_needed, request.user, obj, opts, 1, modeladmin.admin_site, levels_to_root=2)
        i=i+1
    # The user has already confirmed the deletion.
    # Do the deletion and return a None to display the change list view again.
    if request.POST.get('post'):
        if perms_needed:
            raise PermissionDenied
        n = queryset.count()
        if n:
            for obj in queryset:
                obj_display = force_unicode(obj)
                obj.delete()
                modeladmin.log_deletion(request, obj, obj_display)
            #queryset.delete()
            modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % {
                "count": n, "items": model_ngettext(modeladmin.opts, n)
            })
        # Return None to display the change list page again.
        return None
    context = {
        "title": _("Are you sure?"),
        "object_name": force_unicode(opts.verbose_name),
        "deletable_objects": deletable_objects,
        'queryset': queryset,
        "perms_lacking": perms_needed,
        "opts": opts,
        "root_path": modeladmin.admin_site.root_path,
        "app_label": app_label,
        'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME,
    }
    # Display the confirmation page
    return render_to_response(modeladmin.delete_confirmation_template or [
        "admin/%s/%s/reservation_bulk_delete_confirmation.html" % (app_label, opts.object_name.lower()),
        "admin/%s/reservation_bulk_delete_confirmation.html" % app_label,
        "admin/reservation_bulk_delete_confirmation.html"
    ], context, context_instance=template.RequestContext(request))
正如你所看到的,我注释掉了
queryset.delete()
而是使用:
obj.delete()
这还不是最佳的 - 您应该将某些内容应用于整个查询集以获得更好的性能。
在 admin.py 中,我禁用整个管理站点的默认操作 delete_selected:
admin.site.disable_action('delete_selected')
相反,我在需要时使用我自己的函数:
class ReservationAdmin(admin.ModelAdmin):
    actions = [reservation_bulk_delete, ]
在我的模型中,我定义了该delete()函数:
class Reservation(models.Model):
    def delete(self):
        self.status_server = RESERVATION_STATUS_DELETED
        self.save()
| 归档时间: | 
 | 
| 查看次数: | 19603 次 | 
| 最近记录: |