django管理员操作没有选择对象

m00*_*000 31 django django-admin

是否可以为django管理员创建一个自定义管理操作,不需要选择一些对象来运行它?

如果您尝试在不选择对象的情况下运行操作,则会收到以下消息:

Items must be selected in order to perform actions on them. No items have been changed.
Run Code Online (Sandbox Code Playgroud)

有没有办法覆盖此行为并让操作仍然运行?

And*_*ity 13

接受的答案在django 1.6中对我不起作用,所以我最终得到了这个:

from django.contrib import admin

class AdvWebUserAdmin(admin.ModelAdmin):

    ....

    def changelist_view(self, request, extra_context=None):
        if 'action' in request.POST and request.POST['action'] == 'your_action_here':
            if not request.POST.getlist(admin.ACTION_CHECKBOX_NAME):
                post = request.POST.copy()
                for u in MyModel.objects.all():
                    post.update({admin.ACTION_CHECKBOX_NAME: str(u.id)})
                request._set_post(post)
        return super(AdvWebUserAdmin, self).changelist_view(request, extra_context)
Run Code Online (Sandbox Code Playgroud)

my_action被调用,什么也没有选择,选择所有MyModel的数据库实例.

  • 注意:django.contrib.admin 中 django.contrib.admin.helpers.ACTION_CHECKBOX_NAME 的兼容性导入在 3.1 中被删除。请改用此导入:````from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME``` (3认同)

Ans*_*son 9

我想要这个但最终决定不使用它.在此发布以供将来参考.


为操作添加额外的属性(如acts_on_all):

def my_action(modeladmin, request, queryset):
    pass
my_action.short_description = "Act on all %(verbose_name_plural)s"
my_action.acts_on_all = True
Run Code Online (Sandbox Code Playgroud)

 

在您的ModelAdmin覆盖中changelist_view,检查您的财产.

如果请求方法是POST,并且指定了操作,并且操作callable将您的属性设置为True,请修改表示所选对象的列表.

def changelist_view(self, request, extra_context=None):
    try:
        action = self.get_actions(request)[request.POST['action']][0]
        action_acts_on_all = action.acts_on_all
    except (KeyError, AttributeError):
        action_acts_on_all = False

    if action_acts_on_all:
        post = request.POST.copy()
        post.setlist(admin.helpers.ACTION_CHECKBOX_NAME,
                     self.model.objects.values_list('id', flat=True))
        request.POST = post

    return admin.ModelAdmin.changelist_view(self, request, extra_context)
Run Code Online (Sandbox Code Playgroud)


Tim*_*lor 7

Yuji走在正确的轨道上,但我使用了一个可能对你有用的更简单的解决方案.如果您按照下面的步骤覆盖response_action,则可以在检查发生之前将空查询集替换为包含所有对象的查询集.此代码还会检查您正在运行的操作,以确保在更改查询集之前已批准在所有对象上运行,因此您可以将其限制为仅在某些情况下发生.

def response_action(self, request, queryset):
    # override to allow for exporting of ALL records to CSV if no chkbox selected
    selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
    if request.META['QUERY_STRING']:
        qd = dictify_querystring(request.META['QUERY_STRING'])
    else:
        qd = None
    data = request.POST.copy()
    if len(selected) == 0 and data['action'] in ('export_to_csv', 'extended_export_to_csv'):
        ct = ContentType.objects.get_for_model(queryset.model)
        klass = ct.model_class()
        if qd:
            queryset = klass.objects.filter(**qd)[:65535] # cap at classic Excel maximum minus 1 row for headers
        else:
            queryset = klass.objects.all()[:65535] # cap at classic Excel maximum minus 1 row for headers
        return getattr(self, data['action'])(request, queryset)
    else:
        return super(ModelAdminCSV, self).response_action(request, queryset)
Run Code Online (Sandbox Code Playgroud)