本博客包含多个文档和书籍的翻译,但有能力者推荐阅读英文原版

Django 3网页开发指南第4版 第6章 模型管理

Django Alan 2周前 (05-22) 92次浏览 0个评论

完整目录请见:Django 3网页开发指南 – 第4版

本章中包含如下小节:

  • 在修改列表页中自定义列
  • 创建可排序行内元素
  • 创建后台动作
  • 开发修改列表过滤器
  • 修改每三方应用的应用标签
  • 创建自定义accounts应用
  • 获取用户头像
  • 在修改表单中插入地图

引言

Django框架自带对数据模板的管理后台系统。只需少量修改,就可配置可过滤、可搜索及可排序的列表来用于浏览模型数据,还可以配置表单来添加和管理数据。本章中,我们将学习这些高级托雷斯,来通过开发一些实例安全来自定义管理后台。

技术要求

运行本章的代码要求安装最新稳定版的Python 3、MySQL或PostgreSQL数据库以及通过虚拟环境创建的Django项目。

可在GitHub仓库的Chapter06目录中查看本章的代码。

在修改列表页中自定义列

默认Django后台管理系统中的修改列表视图提供一个对具体模型实例的总览。默认list_display模型属性控制字段的显示。此外,可以实现自定义admin方法来返回关联的数据或显示自定义HTML。本节中,我们创建一个特殊函数,配合list_display属性使用,用于在列表视图的一列中显示图片。我们还会添加list_editable设置来让一个字段可在列表视图中直接进行编辑。

准备工作

本节中我们需要使用Pillow和django-imagekit库。使用如下命令在虚拟环境中进行安装:

确保在配置文件的INSTALLED_APPS中添加了django.contrib.admin和imagekit:

然后,在URL配置文件中配置管理站点,如下:

接下来新建products应用,将其放入INSTALLED_APPS。这个应用会包含Product和ProductPhoto模型。此处一个产品可能会有多张图片。本例中我们还会使用UrlMixin,在第2章 模型和数据库结构中的通过URL相关的方法创建模型mixin一节中进行过定义。

在 models.py中创建Product和ProductPhoto模型如下:

如何实现…

本节中我为Product模型创建简单的管理后,会将ProductPhoto模型的实例作为产品的内联元素。

在list_display属性中,我们将包含模型后台的first_photo()方法,用于从多对一关联中显示第一张图片。下面就开始吧:

  1. 创建包含如下内容的admin.py文件:
  2. 然后,在同一文件中添加产品的管理后台:
  3. 下面,创建用于生成图片预览的模板,如下:

实现原理…

添加几个带图片的产品然后在浏览器中查看产品后台列表,效果类似以下截图:

TODO

list_display属性通常用于定义字段以让它们在管理后台列表视图中显示;例如TITLE和PRICE是Product模型的字段。但除了常规的字段名外,list_display还可以接收以下内容:

  • 函数或其它可调用对象
  • 模型后台类的属性名
  • 模型的属性名

在list_display中使用可调用对象时,都会将模型实例作为第一个参数进行传递。因此,在我们的示例中,在模型后台类中定义了get_photo()方法,它接收Product实例作为obj。该方法尝试从多对多一关联中获取第一个ProductPhoto对象,如果存在,返回以包含<img>模板生成的HTML。通过设置list_display_links,我们让图片和标题链接到Product模型的后台修改表单。

可以对list_display中使用的可调用对象设置一些属性:

  • 可调用对象的short_description定义显示在字段顶部的标题。
  • 默认,可调用对象返回的值在后台中无法进行排序,但可设置admin_order_field属性来定义可使用哪个数据库字段来生成排序。还可以选择在字段前添加减号来表明进行倒序排列。
  • 通过设置boolean = True,可以显示True或False值的图标。

最后,可以添加到list_editable设置中来让PRICE字段可进行编辑。因为现在有可编辑字段了,会在底部出现一个Save按钮来保存整个产品列表。

相关内容

创建可排序行内元素

对于大部分数据库中的模型我们会希望通过创建日期、发生日期或按字母排序。但有时用户需要以自定义排序来显示数据项。这适用于分类、图片集、精选列表等情况。本节中我们将学习如何使用django-ordered-model来允许在后台中进行自定义排序。

准备工作

本节中,我们使用前一节中定义的products应用。按照如下步骤进行操作:

  1. 在虚拟环境中安装 django-ordered-model:
  2. 在配置文件的INSTALLED_APPS中添加ordered_model。
  3. 接着,修改此前定义的products应用中的ProductPhoto模型如下:

OrderedModel类引入了一个order字段。生成并运行迁移来将ProductPhoto的新排序字段添加到数据库中。

如何实现…

要设置可排序的产品图片,我们需要修改products应用的模型管理后台。下面就开始吧:

  1. 在admin文件中修改ProductPhotoInline如下:
  2. 然后修改ProductAdmin如下:

实现原理…

如果打开Change Product表单,会看到如下内容:

TODO

在该模型中,我们设置order_with_respect_to属性来保持对每个产品单独进行排序,而不是笼统地对整个产品图片列表进行排序。

在Django管理后台中,产品图片可以按照行内标签在产品详情本身中进行编辑。在第一列中,有图片预览。我们使用与前一节中相同的photo-preview.html模板来进行生成。第二列中为修改图片的字段。然后一列是ORDER字段,然后接可手动对紧邻图片重新排序的箭头按钮。箭头按钮来自move_up_down_links方法。最后一列为一个复选枉,可以进行行内元素的删除。

readonly_fields属性告诉Django有一些字段或方法为只读。如果希望使用其它方法在修改表单中显示内容,需要将这些方法放到readonly_fields列表中。本例中,get_photo_preview和move_up_down_links就是这类方法。

move_up_down_links在OrderedTabularInline中进行定义,它继承了admin.StackedInline或admin.TabularInline。这渲染出箭头按钮来切换产品图片。

相关内容

  • 在修改列表页中自定义列一节
  • 创建后台动作一节
  • 开发修改列表过滤器一节

创建后台动作

Django后台系统提供可以对列表中指定项进行操作的动作。默认提供了一个用于删除选中实例的动作。本例中,我们将创建用于Product模型列表的其它动作,允许管理员将所选产品导出为Excel表格。

准备工作

我们将使用前面小节中创建的products应用。确认好在虚拟环境中已安装了openpyxl模块,用来创建Excel表格,如下:

如何实现…

后台动作是一个接收三个参数的函数,如下:

  • 当前的ModelAdmin值
  • 当前的HttpRequest值
  • QuerySet值,包含所选项

执行如下步骤创建一个自定义后台动作来导出数据表:

  1. 在products应用的admin.py文件中创建一个用于数据表列配置的ColumnConfig为,如下:
  2. 然后在同一个文件中创建export_xlsx()函数:
  3. 然后,对ProductAdmin添加actions设置如下:

实现原理…

如果在浏览器中查看产品后台列表面,在默认的Delete selected Products动作旁会看到一个名为Export XLSX的动作,如下图所示:

TODO

我们使用openpyxl Python模块来创建与Excel及其它数据表软件相兼容的 OpenOffice XML文件。

首先创建一个工作薄,选中当前工作表,将其标题设置为Products。因为在工作表中有一些通用的样式,所以设置了命名样式来对相应的每个单元格中按名称进行应用。这些样式、列头和列宽都存储为Config对象,column_config字典将列的字母作为键与对象进行映射。然后进行遍历来设置列头和列宽。

我们使用工作表的append()方法来为QuerySet中的每个选中产品添加内容,按ID进行排序,在存在图片时包含产品的第一张图片的URL。然后产品数据通过对刚刚添加行的每个单元格进行遍历单独添加样式,再次引用column_config来连续应用样式。

默认,后台动作通过QuerySet做一些事并将管理员重定向回修改列表页面。但对于更为复杂的动作,可返回HttpResponse。export_xlsx() 函数保存了对应HttpResponse工作薄的虚拟拷贝,包含适用the Office Open XML (OOXML)数据表的相应内容类型和字符集。我们使用Content-Disposition来设置响应,这样可下载为products.xlsx 文件。生成的工作表可通过Open Office打开,类似下面这样:

TODO

相关内容

开发修改列表过滤器

准备工作

如何实现…

实现原理…

相关内容

修改每三方应用的应用标签

准备工作

如何实现…

实现原理…

相关内容

创建自定义accounts应用

准备工作

如何实现…

实现原理…

相关内容

获取用户头像

准备工作

如何实现…

实现原理…

扩展知识…

相关内容

在修改表单中插入地图

准备工作

如何实现…

实现原理…

相关内容

喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址