Django list_display 数据库字段不在 model 注册也可以加入 admin

Django list_display 数据库字段不在 model 注册也可以加入 admin

Django list_display 数据库字段不在 model 注册也可以加入 admin

在使用 Django 进行 web 开发的过程中,我们经常会遇到需要在 admin 界面中展示数据库中的数据的情况。Django 提供了方便的 admin 后台管理界面,让我们可以通过简单的配置就能实现对数据库中的数据的管理。通常情况下,我们会在 model 中定义需要展示的字段并注册到 admin 中,然后通过 list_display 属性来控制在 admin 界面中显示哪些字段。但是有时候,我们需要在 admin 界面中显示的字段并不在已注册的 model 中,此时该如何处理呢?本文将详细介绍如何在 Django 中实现这个需求。

方案

要在 admin 界面中显示数据库字段但不在 model 中注册,我们可以通过继承 admin.ModelAdmin 类并重写 get_queryset 方法来实现。具体步骤如下:

  1. 创建一个自定义的 ModelAdmin 类,继承自 admin.ModelAdmin。
  2. 重写 get_queryset 方法,在方法中添加需要显示的数据库字段。
  3. 在 admin.site.register 中将 model 和自定义的 ModelAdmin 类绑定。

下面我们通过一个示例来演示具体的实现过程。

示例

假设我们有一个简单的数据库模型,只包含了一个 name 字段,并且我们想在 admin 界面中显示一个额外的字段 description,该字段不在 model 中注册。首先,我们需要在 models.py 中定义我们的模型:

from django.db import models

class Item(models.Model):
    name = models.CharField(max_length=50)

然后,我们可以创建一个自定义的 ModelAdmin 类,在该类中重写 get_queryset 方法,并加入 description 字段的逻辑。在 admin.py 中编写代码如下:

from django.contrib import admin
from .models import Item

class ItemAdmin(admin.ModelAdmin):
    list_display = ('name', 'description')

    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        # 添加 description 字段到 queryset 中
        return queryset.extra(select={'description': 'SELECT \'This is a description\' as description'})

admin.site.register(Item, ItemAdmin)

在上面的代码中,我们定义了一个 ItemAdmin 类,并且指定了 list_display 包含 name 和 description 两个字段。在 get_queryset 方法中,我们使用了 queryset.extra 方法来添加一个虚拟的 description 字段,值为固定的字符串 ‘This is a description’。这样,在 admin 界面中就能看到该字段的内容了。

最后,我们需要在 admin.site.register 中将 Item 和 ItemAdmin 类绑定起来,这样在 admin 界面中就能看到我们添加的 description 字段了。接下来,我们启动 Django 项目,在 admin 界面中查看效果:

$ python manage.py runserver

访问 http://127.0.0.1:8000/admin/ 并登录后,在 Item 列表中就能看到新增的 description 字段了。

通过以上的实例,我们可以看到,即使数据库字段不在 model 注册中,我们也可以通过自定义 ModelAdmin 类来在 admin 界面中显示这些字段。这为我们的开发工作提供了更大的灵活性和定制化的空间。

总结

本文详细介绍了如何在 Django 中实现在 admin 界面中显示数据库字段但不在 model 中注册的情况。通过自定义 ModelAdmin 类并重写 get_queryset 方法,我们可以实现对数据库字段的灵活控制。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程