Pit*_*all 4 django django-admin django-rest-framework
我有:
class Person(admin.ModelAdmin):
actions = ['delete_selected']
def delete_selected(modeladmin, request, queryset):
# Show confirmation page.
for obj in queryset:
obj.custom_delete()
Run Code Online (Sandbox Code Playgroud)
我在那里留下的评论是我挣扎的地方。在执行自定义删除之前,我仍然想显示确认页面。
简短回答:您应该覆盖delete_queryset[Django-doc],因为这封装了删除对象的真实逻辑。
你应该不覆盖delete_selected。此操作的定义类似于 [GitHub]:
Run Code Online (Sandbox Code Playgroud)def delete_selected(modeladmin, request, queryset): # ... # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, model_count, perms_needed, protected = modeladmin.get_deleted_objects(queryset, request) # The user has already confirmed the deletion. # Do the deletion and return None to display the change list view again. if request.POST.get('post') and not protected: if perms_needed: raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = str(obj) modeladmin.log_deletion(request, obj, obj_display) modeladmin.delete_queryset(request, queryset) modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { "count": n, "items": model_ngettext(modeladmin.opts, n) }, messages.SUCCESS) # Return None to display the change list page again. return None # ... context = { # ... } request.current_app = modeladmin.admin_site.name # Display the confirmation page return TemplateResponse(request, modeladmin.delete_selected_confirmation_template or [ "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.model_name), "admin/%s/delete_selected_confirmation.html" % app_label, "admin/delete_selected_confirmation.html" ], context) delete_selected.allowed_permissions = ('delete',) delete_selected.short_description = gettext_lazy("Delete selected %(verbose_name_plural)s")
这里的关键部分是此操作将执行适当的检查,但删除本身是通过调用完成的:
Run Code Online (Sandbox Code Playgroud)modeladmin.delete_queryset(request, queryset)
因此delete_queryset,使用以下方法覆盖就足够了:
class PersonAdmin(admin.ModelAdmin):
actions = ['delete_selected']
def delete_queryset(self, request, queryset):
for obj in queryset:
obj.custom_delete()Run Code Online (Sandbox Code Playgroud)
AModelAdmin有[GitHub]的标准实现delete_queryset:
Run Code Online (Sandbox Code Playgroud)class ModelAdmin(BaseModelAdmin): # ... def delete_queryset(self, request, queryset): """Given a queryset, delete it from the database.""" queryset.delete()
我的要求有点不同。我必须拦截 delete_selected 操作并根据条件显示错误。这就是我所做的 -
@admin.register(Model)
class ModelAdmin(model.Admin):
...
def get_actions(self, request):
actions = super().get_actions(request)
self.actions.append(delete_selected)
self.actions.append(...otheractions)
return actions
Run Code Online (Sandbox Code Playgroud)
#Import goes to top of the file
from django.contrib.admin.actions import delete_selected as default_delete_selected
def delete_selected(modeladmin, request, queryset):
response = HttpResponseRedirect(request.get_full_path())
#logic to validate
for obj in queryset:
if obj.name == 'test':
messages.error(request,'error message')
return response
return default_delete_selected(modeladmin, request, queryset)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2495 次 |
| 最近记录: |