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 变量获取排序后的学生信息。
阅读全文

相关推荐

优化代码class FileManager_listview(ListView): """利用django的五大视图中的ListView来显示数据 同时添加了排序功能 """ # 查询模型 model = FileManager # 指定模型为UserInfo # TODO 待完善 extra_context待实验 # 设置模型外的数据 # extra_context = {'title': '人员信息表'} # 获取并判断搜索条件 # 设置模版文件 template_name = 'zadmin/pages/File_Manager.html' # 指定模板 # 设置模板上下文,即为模板变量进行命名 context_object_name = 'files' # 指定在模板中使用的变量为customers # 每页的展示多少条数据 paginate_by = 10 # 注意下面一行, 获取智能页码范围,并传递给模板 # page_range = paginator.get_elided_page_range(page, on_each_side=3, on_ends=2) # 可以自定义查询集 # TODO 应该是可以指定一个数据库中的部分数据吧 # queryset = UserInfo.objects.all() # 重写get_queryset方法,对数据进行过滤排序 def get_queryset(self): """ 查询 :return: """ queryset = super().get_queryset() mywhere = [] order_by = self.request.GET.get('order_by', None) search_keyword = self.request.GET.get("search", None) # Q就是或 if search_keyword: # 构造查询条件 kwlist = Q(username__contains=search_keyword) | Q(realname__contains=search_keyword) | Q( phone__contains=search_keyword) # # 保持搜索条件 # mywhere.append('search=' + search_keyword) # 将搜索参数存储在Session中 self.request.session['search_keyword'] = search_keyword messages.success(self.request, '搜索结果') else: # 清除Session中的搜索参数 self.request.session.pop('search_query', None) # return queryset.filter(kwlist) return queryset

最新推荐

recommend-type

django model 条件过滤 queryset.filter(**condtions)用法详解

`queryset.filter(**conditions)`是Django ORM(对象关系映射)中用于筛选和检索数据库记录的重要方法。本篇文章将深入探讨`queryset.filter()`的用法及其相关的条件过滤操作。 首先,`queryset.filter(**...
recommend-type

python实现合并多个list及合并多个django QuerySet的方法示例

在Python编程中,合并多个列表或Django的QuerySet是常见的需求。本文将详细介绍如何使用Python的`itertools.chain`函数以及Django中合并QuerySet的不同方法。 首先,让我们来看看如何使用`itertools.chain`来合并多...
recommend-type

django 数据库返回queryset实现封装为字典

在Django框架中,处理数据库查询结果时,通常会返回一个QuerySet对象。QuerySet是Django ORM(对象关系映射)的核心部分,它提供了丰富的查询API和缓存机制。然而,当你需要将这些查询结果转换成更便于处理的数据...
recommend-type

技术资料分享SY8009非常好的技术资料.zip

技术资料分享SY8009非常好的技术资料.zip
recommend-type

技术资料分享ZigBee协议栈的分析与设计非常好的技术资料.zip

技术资料分享ZigBee协议栈的分析与设计非常好的技术资料.zip
recommend-type

IEEE 14总线系统Simulink模型开发指南与案例研究

资源摘要信息:"IEEE 14 总线系统 Simulink 模型是基于 IEEE 指南而开发的,可以用于多种电力系统分析研究,比如短路分析、潮流研究以及互连电网问题等。模型具体使用了 MATLAB 这一数学计算与仿真软件进行开发,模型文件为 Fourteen_bus.mdl.zip 和 Fourteen_bus.zip,其中 .mdl 文件是 MATLAB 的仿真模型文件,而 .zip 文件则是为了便于传输和分发而进行的压缩文件格式。" IEEE 14总线系统是电力工程领域中用于仿真实验和研究的基础测试系统,它是根据IEEE(电气和电子工程师协会)的指南设计的,目的是为了提供一个标准化的测试平台,以便研究人员和工程师可以比较不同的电力系统分析方法和优化技术。IEEE 14总线系统通常包括14个节点(总线),这些节点通过一系列的传输线路和变压器相互连接,以此来模拟实际电网中各个电网元素之间的电气关系。 Simulink是MATLAB的一个附加产品,它提供了一个可视化的环境用于模拟、多域仿真和基于模型的设计。Simulink可以用来模拟各种动态系统,包括线性、非线性、连续时间、离散时间以及混合信号系统,这使得它非常适合电力系统建模和仿真。通过使用Simulink,工程师可以构建复杂的仿真模型,其中就包括了IEEE 14总线系统。 在电力系统分析中,短路分析用于确定在特定故障条件下电力系统的响应。了解短路电流的大小和分布对于保护设备的选择和设置至关重要。潮流研究则关注于电力系统的稳态操作,通过潮流计算可以了解在正常运行条件下各个节点的电压幅值、相位和系统中功率流的分布情况。 在进行互连电网问题的研究时,IEEE 14总线系统也可以作为一个测试案例,研究人员可以通过它来分析电网中的稳定性、可靠性以及安全性问题。此外,它也可以用于研究分布式发电、负载管理和系统规划等问题。 将IEEE 14总线系统的模型文件打包为.zip格式,是一种常见的做法,以减小文件大小,便于存储和传输。在解压.zip文件之后,用户就可以获得包含所有必要组件的完整模型文件,进而可以在MATLAB的环境中加载和运行该模型,进行上述提到的多种电力系统分析。 总的来说,IEEE 14总线系统 Simulink模型提供了一个有力的工具,使得电力系统的工程师和研究人员可以有效地进行各种电力系统分析与研究,并且Simulink模型文件的可复用性和可视化界面大大提高了工作的效率和准确性。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【数据安全黄金法则】:R语言中party包的数据处理与隐私保护

![【数据安全黄金法则】:R语言中party包的数据处理与隐私保护](https://media.geeksforgeeks.org/wp-content/uploads/20220603131009/Group42.jpg) # 1. 数据安全黄金法则与R语言概述 在当今数字化时代,数据安全已成为企业、政府机构以及个人用户最为关注的问题之一。数据安全黄金法则,即最小权限原则、加密保护和定期评估,是构建数据保护体系的基石。通过这一章节,我们将介绍R语言——一个在统计分析和数据科学领域广泛应用的编程语言,以及它在实现数据安全策略中所能发挥的独特作用。 ## 1.1 R语言简介 R语言是一种
recommend-type

Takagi-Sugeno模糊控制方法的原理是什么?如何设计一个基于此方法的零阶或一阶模糊控制系统?

Takagi-Sugeno模糊控制方法是一种特殊的模糊推理系统,它通过一组基于规则的模糊模型来逼近系统的动态行为。与传统的模糊控制系统相比,该方法的核心在于将去模糊化过程集成到模糊推理中,能够直接提供系统的精确输出,特别适合于复杂系统的建模和控制。 参考资源链接:[Takagi-Sugeno模糊控制原理与应用详解](https://wenku.csdn.net/doc/2o97444da0?spm=1055.2569.3001.10343) 零阶Takagi-Sugeno系统通常包含基于规则的决策,它不包含系统的动态信息,适用于那些系统行为可以通过一组静态的、非线性映射来描述的场合。而一阶
recommend-type

STLinkV2.J16.S4固件更新与应用指南

资源摘要信息:"STLinkV2.J16.S4固件.zip包含了用于STLinkV2系列调试器的JTAG/SWD接口固件,具体版本为J16.S4。固件文件的格式为二进制文件(.bin),适用于STMicroelectronics(意法半导体)的特定型号的调试器,用于固件升级或更新。" STLinkV2.J16.S4固件是指针对STLinkV2系列调试器的固件版本J16.S4。STLinkV2是一种常用于编程和调试STM32和STM8微控制器的调试器,由意法半导体(STMicroelectronics)生产。固件是指嵌入在设备硬件中的软件,负责执行设备的低级控制和管理任务。 固件版本J16.S4中的"J16"可能表示该固件的修订版本号,"S4"可能表示次级版本或是特定于某个系列的固件。固件版本号可以用来区分不同时间点发布的更新和功能改进,开发者和用户可以根据需要选择合适的版本进行更新。 通常情况下,固件升级可以带来以下好处: 1. 增加对新芯片的支持:随着新芯片的推出,固件升级可以使得调试器能够支持更多新型号的微控制器。 2. 提升性能:修复已知的性能问题,提高设备运行的稳定性和效率。 3. 增加新功能:可能包括对调试协议的增强,或是新工具的支持。 4. 修正错误:对已知错误进行修正,提升调试器的兼容性和可靠性。 使用STLinkV2.J16.S4固件之前,用户需要确保固件与当前的硬件型号兼容。更新固件的步骤大致如下: 1. 下载固件文件STLinkV2.J16.S4.bin。 2. 打开STLink的软件更新工具(可能是ST-Link Utility),该工具由STMicroelectronics提供,用于管理固件更新过程。 3. 通过软件将下载的固件文件导入到调试器中。 4. 按照提示完成固件更新过程。 在进行固件更新之前,强烈建议用户仔细阅读相关的更新指南和操作手册,以避免因操作不当导致调试器损坏。如果用户不确定如何操作,应该联系设备供应商或专业技术人员进行咨询。 固件更新完成后,用户应该检查调试器是否能够正常工作,并通过简单的测试项目验证固件的功能是否正常。如果存在任何问题,应立即停止使用并联系技术支持。 固件文件通常位于STMicroelectronics官方网站或专门的软件支持平台上,用户可以在这里下载最新的固件文件,以及获得技术支持和更新日志。STMicroelectronics网站上还会提供固件更新工具,它是更新固件的必备工具。 由于固件涉及到硬件设备的底层操作,错误的固件升级可能会导致设备变砖(无法使用)。因此,在进行固件更新之前,用户应确保了解固件更新的风险,备份好重要数据,并在必要时寻求专业帮助。