【Djnago】admin是什么?

950 阅读9分钟

1. 什么是 Django Admin?

Django Admin 是一个自动生成的管理后台工具。通过极少的代码就可以为开发者提供一个用于管理数据的GUI。你只需要定义好模型(即数据库表),注册,系统就会为你自动生成 管理这些模型(也就是管理这些数据库表啦) 的网页界面。这样你不用亲自开发管理系统,就能白嫖一个🤪。

Django Admin的设计理念 admin.py 文件位于每个app目录下。这是因为每个应用都有自己的数据模型,而admin.py文件的作用就是注册这些模型到Django admin站点中。通过在admin.py中注册模型,你可以定义如何在admin界面上展示这些模型的数据。这包括定制列表视图、表单字段、过滤选项以及搜索功能等。为什么admin.py不是项目级文件?当需要对某个应用进行修改时,只需要更改该应用内部的文件即可。如果所有admin配置都放在一个地方,那么随着项目的增长,这个文件会变得难以管理和维护。而且这样的结构使得应用更容易被其他项目复用。如果一个应用可以独立运作,并且带有自己的admin配置,那么它可以很容易地被集成到另一个Django项目中去。并且可以定制化,即每个应用可以根据自己的需求定制admin界面,比如设置不同的排序方式、过滤器或自定义的管理类。这种定制化在单一的全局admin配置中是很难实现的。

2. 如何使用 Django Admin?

步骤 1:创建超级用户(管理员)

python manage.py createsuperuser # 创建店主账号

步骤 2:在 admin.py 中注册模型

from django.contrib import admin
from .models import Product  # 假设你有个 Product 模型
admin.site.register(Product) # 这就相当于告诉 admin:"我要管理这个 Product 表"。

步骤 3:访问管理后台

启动服务器后,访问 http://你的网站/admin,输入超级用户的账号和密码,就可以看到管理后台了。

3. Django Admin 中的多模型管理

在一个在线商城中,通常会有多个不同的模型,比如:

  1. 产品(Product)
    • 字段:名称、描述、价格、库存、分类
    • 管理需求:添加、编辑和删除产品,管理产品的库存状态。
  2. 订单(Order)
    • 字段:客户、产品、数量、订单状态、订单日期
    • 管理需求:查看和管理订单状态,处理订单的发货和退货。
  3. 客户(Customer)
    • 字段:姓名、电子邮件、电话号码、地址
    • 管理需求:查看客户信息,处理客户的反馈和查询。
  4. 分类(Category)
    • 字段:名称、描述
    • 管理需求:创建和编辑分类,以便对产品进行分类管理。

在 Django 的 admin.py 文件中,我们可以为这些模型分别定义管理逻辑:

from django.contrib import admin
from .models import Product, Order, Customer, Category

# 为产品模型注册管理界面
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'price', 'stock', 'category')
    search_fields = ('name', 'description')
    list_filter = ('category',)

# 为订单模型注册管理界面
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    list_display = ('customer', 'product', 'quantity', 'status', 'order_date')
    list_filter = ('status', 'order_date')
    search_fields = ('customer__name', 'product__name')

# 为客户模型注册管理界面
@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
    list_display = ('name', 'email', 'phone')
    search_fields = ('name', 'email')

# 为分类模型注册管理界面
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('name',)
    search_fields = ('name',)

这样,每个模型都有自己独立的管理界面,但所有这些界面都整合在同一个管理后台中,使得管理更加集中和高效。

4. 定制化admin(1)—— 自定义 Django Admin 界面

下面是admin自带的一些配置字段:

字段名使用频率示例如果未添加可能导致的后果
list_display★★★★★显示商品名称、价格、库存列表页信息缺乏,用户难以快速获取关键信息
list_filter★★★★★根据订单状态(如“已付款”、“未付款”)筛选用户无法方便地过滤和查找所需数据
search_fields★★★★★允许通过用户名或邮箱搜索客户用户无法快速定位目标数据
list_editable★★★★直接在列表中编辑商品价格和库存无法快速修改,影响管理效率
readonly_fields★★★★订单号和创建时间设置为只读关键数据被意外修改,可能导致数据不一致
fields/fieldsets★★★★商品信息分为“基本信息”和“库存信息”界面杂乱无序,用户难以找到所需信息
autocomplete_fields★★★商品选择时使用自动完成选择外键时效率低下,易出错
actions★★★批量标记订单为“已发货”无法进行批量操作,导致繁琐的手动处理
list_per_page★★★每页显示 50 条商品页面加载时间过长,用户体验下降
date_hierarchy★★允许按创建日期浏览订单用户无法按时间快速查找数据
ordering★★默认按创建时间倒序排列商品数据显示顺序混乱,用户难以找到最新或相关信息

4. 定制化admin(2)——深度定制化

1. 基于Django Admin的定制化

  • 定制化主要是基于Django自带的Admin功能,这种定制化主要集中在对特定模型(models)的行为和展示方式的调整。即上述部分展示的admin自带的选项配置,给不同的模型应用加上不同的功能,就是定制化。

2. 深度定制化的两个方面

  • a. 整体UI的定制化- - - - - - - - - - - - - -- - - - - - - - - - - - - -

    • 自定义CSS:可以创建自定义CSS文件并在admin模板中引入,以修改界面的样式。
      • (1)定位 Django 安装目录:python -c "import django; print(django.path[0])"找到 admin 静态文件:
      • (2)进入 Django 的安装目录,找到 contrib/admin/static/admin/css 文件夹。
      • (3)修改完 CSS 文件后,重启 Django 开发服务器以使更改生效。
      • 升级问题:直接修改原始文件在升级 Django 版本时可能会被覆盖。
    • 第三方插件:使用如SimpleUI等第三方插件,可以显著提升admin界面的美观度和用户体验。这类插件通常易于安装和配置,提供更现代和用户友好的界面。相关阅读_大江狗的博客
  • b. 新的功能模块- - - - - - - - - - - - - -

    • 功能固定性:Django Admin只能识别内置的配置选项,新增功能模块的难度较大。
    • 自定义逻辑:尽管新增功能模块难以直接实现,但可以通过编写自定义逻辑来扩展内置功能。
    • 利用第三方应用:除了自定义逻辑,借助第三方Django应用可以为Admin添加新功能。许多开发者创建了各种扩展包,能够在Django Admin中实现数据导出、批量操作等功能。

5. 文件上传功能

模型和Admin之间是相辅相成的关系。模型提供了数据结构和文件处理的基础,Admin则是利用这些定义来提供友好的用户界面和管理功能。如果模型中没有定义上传字段,Admin确实无法提供上传功能 要在 Django Admin 后台管理界面中展示上传的图片,你需要在你的模型和 Admin 配置中进行一些简单的设置。

步骤 1: 模型定义

首先,确保你的模型层中定义了 ImageField。例如,定义一个 Product 模型来包含商品名称和图片。

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100)
    image = models.ImageField(upload_to='products/')  # 存储图片的字段

步骤 2: Admin 配置

在 Django Admin 中,你需要配置 ProductAdmin 类,以便在列表页中展示图片。通过设置 list_display 属性,将 image 字段添加到展示列表中。

from django.contrib import admin
from .models import Product

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ['name', 'image']  # 在列表中显示商品名称和图片

步骤 3: 设置媒体文件

确保你已经在 settings.py 文件中正确配置了媒体文件的 URL 和存储路径,以便在开发环境中能访问到上传的图片。

import os
from pathlib import Path

# 其他设置...
BASE_DIR = Path(__file__).resolve().parent.parent

MEDIA_URL = '/media/'  # 媒体文件的 URL 前缀
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 媒体文件的存储路径

步骤 4: URL 配置

在你的项目的 urls.py 中,确保添加了媒体文件的路由,以便在开发环境中访问上传的图片。

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    # 其他 URL 路由...
]

if settings.DEBUG:  # 仅在开发模式下提供媒体文件
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

步骤 5: 在 Admin 中展示

现在,当你通过 Django Admin 上传图片时,上传的图片将会在产品列表页的 image 列中以缩略图的形式显示。你可以进入 Django Admin,添加或编辑产品,上传图片,并查看列表中是否显示了图片。

6. Django Admin 的局限性

虽然 Django Admin 非常方便,但它并不是为普通用户设计的,而是专门为管理员、店主等运营人员提供的工具。它的主要优势是快速开发和功能完备,但如果需要一个面向客户的精美用户界面,仍然需要自行开发前端。

Django Admin 的适用场景

  • 快速开发内部管理系统:比如产品管理、订单管理等内部功能。
  • 小型网站的后台管理:对于不需要复杂定制的小型项目,Django Admin 足以应对。
  • 原型系统的快速搭建:在产品原型阶段,Django Admin 可以用来快速验证概念和功能。

7. 扩展和深度定制 Django Admin

对于需要更复杂功能的项目,Django Admin 也提供了一些扩展方法,例如:

  • 自定义动作(Actions):你可以在列表页添加自定义的批量操作,比如批量修改库存状态。
  • 内嵌模型(Inline Models):如果两个模型有外键关系,可以在一个模型的管理页面中内嵌另一个模型的管理表单。
  • 权限控制:你可以为不同的管理员分配不同的权限,控制他们可以查看或编辑哪些数据。

总结

Django Admin 是一个非常强大的管理工具,它让你无需编写复杂的后台逻辑和页面,就能生成一个功能丰富的管理界面。它尤其适合快速开发、内部管理和原型项目,帮助你专注于业务逻辑,而不是重复的页面开发工作。如果你需要更多定制,Django Admin 也提供了丰富的接口和灵活性,让你可以根据具体需求进行扩展。

换句话说,如果没有 Django Admin,开发者需要投入大量的时间和精力来编写后台管理页面和逻辑。而 Django Admin 帮助我们以最低的成本提供高效的管理解决方案,尤其适合中小型项目和快速原型开发。 记住,Django Admin 是为管理者设计的,而不是为普通客户使用的界面。如果你需要一个更精美、面向顾客的前端界面,仍然需要自己进行开发。