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的数据库实例.
我想要这个但最终决定不使用它.在此发布以供将来参考.
为操作添加额外的属性(如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)
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)
| 归档时间: |
|
| 查看次数: |
11981 次 |
| 最近记录: |