def delete_selected(modeladmin, request, queryset): """ Default action which deletes the selected objects. This action first displays a confirmation page which shows all the deletable objects, or, if the user has no permission one of the related childs (foreignkeys), a "permission denied" message. Next, it deletes 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 using = router.db_for_write(modeladmin.model) # Populate deletable_objects, a data structure of all related objects that # will also be deleted. deletable_objects, model_count, perms_needed, protected = get_deleted_objects( queryset, opts, request.user, modeladmin.admin_site, using) # 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') and not protected: if perms_needed: raise PermissionDenied n = queryset.count() if n: for obj in queryset: obj_display = force_text(obj) 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) }, messages.SUCCESS) # Return None to display the change list page again. return None if len(queryset) == 1: objects_name = force_text(opts.verbose_name) else: objects_name = force_text(opts.verbose_name_plural) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": objects_name} else: title = _("Are you sure?") context = dict( modeladmin.admin_site.each_context(request), title=title, objects_name=objects_name, deletable_objects=[deletable_objects], model_count=dict(model_count).items(), queryset=queryset, perms_lacking=perms_needed, protected=protected, opts=opts, action_checkbox_name=helpers.ACTION_CHECKBOX_NAME, media=modeladmin.media, ) 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.short_description = ugettext_lazy("Delete selected %(verbose_name_plural)s")
时间: 2024-02-14 10:07:01 浏览: 227
这段代码定义了一个默认的 Django Admin 后台操作,用于批量删除选中的对象。具体来说,这个操作会首先显示一个确认页面,列出所有将被删除的对象,以及与这些对象相关的其他对象(例如外键关联的对象)。如果用户没有删除权限,或者某些对象受到保护,则会显示一个“无权删除”或“不能删除”的消息。如果用户确认删除操作,则会删除所有选中的对象,并重定向到对象列表页面。
在代码中,`delete_selected()` 函数接受三个参数:`modeladmin` 表示 Django admin 后台的管理器对象,`request` 表示当前的 HTTP 请求对象,`queryset` 表示选中的对象的 QuerySet。函数首先获取模型的元数据信息,然后检查当前用户是否有删除权限。如果没有权限,则会引发 `PermissionDenied` 异常。接下来,函数调用 `get_deleted_objects()` 方法获取所有将被删除的对象及相关对象的信息,并根据用户的选择执行删除操作或者显示确认页面。最后,函数返回一个 `TemplateResponse` 对象,用于显示确认页面或者执行删除操作后的重定向。此外,函数还定义了一个 `short_description` 属性,用于在 Django admin 后台中显示操作名称。
相关问题
from django.contrib import admin from django.urls import reverse from django.utils.html import format_html from django.shortcuts import redirect from .models import Drug @admin.register(Drug) class DrugAdmin(admin.ModelAdmin): change_list_template = 'admin/drug/change_list.html' def get_urls(self): urls = super().get_urls() custom_urls = [ path('import-csv/', self.import_csv), ] return custom_urls + urls def import_csv(self, request): if request.method == 'POST': # TODO: import CSV data self.message_user(request, 'CSV data imported successfully') return redirect('..') return render(request, 'admin/drug/import_csv.html') def changelist_view(self, request, extra_context=None): if not request.GET.get('ordering'): # set default ordering request.GET = request.GET.copy() request.GET['ordering'] = 'name' return super().changelist_view(request, extra_context=extra_context) def interaction_display(self, obj): return format_html('<pre>{}</pre>', obj.interaction) interaction_display.short_description = 'Interaction' def get_actions(self, request): actions = super().get_actions(request) del actions['delete_selected'] return actions def delete_model(self, request, obj): # TODO: delete model pass def delete_selected(self, request, queryset): # TODO: delete selected models pass def get_queryset(self, request): qs = super().get_queryset(request) qs = qs.order_by('name') return qs def add_view(self, request, form_url='', extra_context=None): self.change_list_template = None return super().add_view(request, form_url=form_url, extra_context=extra_context) def change_view(self, request, object_id, form_url='', extra_context=None): self.change_list_template = None return super().change_view(request, object_id, form_url=form_url, extra_context=extra_context) def delete_view(self, request, object_id, extra_context=None): self.change_list_template = None return super().delete_view(request, object_id, extra_context=extra_context) 怎么重写ModelAdmin中的特性
可以通过在自定义的ModelAdmin中重写一些特定的方法来改变其行为,例如:
1. get_urls():返回一个包括自定义URL路由的URLconf列表。
2. changelist_view():返回一个HttpResponse对象,它将呈现显示模型对象的更改列表视图。
3. add_view():返回一个HttpResponse对象,它将呈现用于添加新模型对象的视图。
4. change_view():返回一个HttpResponse对象,它将呈现用于更改现有模型对象的视图。
5. delete_view():返回一个HttpResponse对象,它将呈现用于删除现有模型对象的视图。
6. get_queryset():返回一个查询集,该查询集包含ModelAdmin管理的模型对象。
7. get_actions():返回一个字典,其中包含ModelAdmin提供的所有批量操作。
8. delete_model():删除指定的模型对象。
9. delete_selected():批量删除指定的模型对象。
通过重写这些方法,您可以更改ModelAdmin管理的模型对象的默认行为,并添加自定义功能。
def sort(request): if request.POST: post=request.POST stu_list=[] if(post["subject"]=="sum"): stu_list=Student1.objects.order_by("-sum")#order_by 方法将返回一个 QuerySet 对象,该对象包含了按照指定排序规则排序后的数据 elif(post["subject"]=="math"): stu_list=Student1.objects.order_by("-math") elif (post["subject"]=="chinese"): stu_list=Student1.objects.order_by("-chienese") elif (post["subject"]=="english"): stu_list=Student1.objects.order_by("-english") elif (post["subject"]=="physics"): stu_list=Student1.objects.order_by("-physics") elif (post["subject"]=="chemistry"): stu_list=Student1.objects.order_by("-chemistry") elif (post["subject"]=="biology"): stu_list=Student1.objects.order_by("-biology") return render(request,'sort.html',locals())
这段代码是一个 Django 视图函数,用于实现成绩排序功能。具体实现过程如下:
1. 接收一个 POST 请求,从请求参数中获取要排序的科目名。
2. 根据不同的科目名,使用 order_by 方法对 Student1 模型中的数据进行排序,返回一个排序后的 QuerySet 对象。
3. 将排序后的数据传递给模板,渲染成 HTML 页面并返回给客户端。
需要注意的是,这段代码中使用了 locals() 函数将当前作用域中的所有变量打包成一个字典,传递给模板进行渲染。在模板中可以直接访问这些变量,比如可以通过 stu_list 变量获取排序后的学生信息。
阅读全文