Django admin 管理后台进阶使用

假设有两个 model,分别是

# models.py 中

# 商品库存单位 SKU
class SKU(models.Model):

    sid = models.CharField(max_length=30, primary_key=True, verbose_name='物料号')
    name = models.CharField(max_length=30, null=True, verbose_name='物料名称')

    def __str__(self):
        return self.name + '(' + self.sid + ')'

# 订单
class Order(models.Model):
    
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    found_date = models.DateField(blank=False, null=True, verbose_name='订单日期')
    order_no = models.CharField(max_length=30, default='', verbose_name='订单编号')
    sku = models.ForeignKey(SKU, verbose_name="商品", on_delete=models.PROTECT, null=True)
    channel = models.CharField(max_length=50, default='', verbose_name='渠道')
    amount = models.IntegerField(blank=False, null=False, default=0, verbose_name='数量')
    comment = models.CharField(max_length=1000, blank=True, null=True, default='', verbose_name='备注')

设置列表显示的内容

# admin.py 中
from .models import Order
...

class OrderAdmin(admin.ModelAdmin):
	...
    ordering = ['-found_date'] # 定义排序方式
    list_display = ('found_date', 'sku', 'channel', 'amount') # 列表中有哪些
    search_fields = ('order_no', 'sku__sid', 'sku__name') # 支持通过什么来进行搜索,其中 sku 是个外部键,支持通过 sku 的 sid 字段搜索,则设置为 sku__sid

...

admin.site.register(Order, OrderAdmin)

支持数据导出

上述例子中,如果希望支持订单导出:
首先安装插件

pip install django-import-export

settings.py 中设置

# settings.py
INSTALLED_APPS = (
    ...
    'import_export',
)

做一次静态文件收集

# 在项目根目录下
python manage.py collectstatic

admin.py 中设置

...
# 新增引入
from import_export.admin import ExportActionMixin

# 在OrderAdmin 中加继承 ExportActionMixin
class OrderAdmin(ExportActionMixin, admin.ModelAdmin):
	...

自定义编辑页面的空间为 textarea

当然也可以定义为别的控件

# admin.py 中
...
# 引入库
from django import forms

# 定义 1 个 ModelForm 类,用于替换原来的编辑表单
class OrderModelForm( forms.ModelForm ):
	# 定制 comment 字段的控件为 textarea,非必填
    comment = forms.CharField(widget=forms.Textarea, label='备注', required=False)
    class Meta:
        model = Order # 和 Order 模型进行绑定
        exclude = [] # 所有的字段均参与编辑,不排除任何字段

# 更新 OrderAdmin 类
class OrderAdmin(ExportActionMixin, admin.ModelAdmin):
    form = OrderModelForm # 设置编辑表单为 OrderModelForm
    ...

支持范围和日期筛选

Django 自带的比较难用,安装插件

pip install django-admin-rangefilter

配置 settings.py

INSTALLED_APPS = (
    ...
    'rangefilter',
    ...
)

更新 admin.py

from rangefilter.filters import DateRangeFilter, DateTimeRangeFilter, NumericRangeFilter

...

class OppAdmin(admin.ModelAdmin):
	...
	list_filter = (
		('found_date', DateRangeFilter) # 可以通过 found_date 筛选,选择器 DateRangeFilter
	)
	...

支持通过多选来筛选

安装插件

pip install django-admin-multi-select-filter

admin.py配置

...
from django_admin_multi_select_filter.filters import MultiSelectFieldListFilter

...

class OrderAdmin( admin.ModelAdmin):
	...
	list_filter = (
		...
		('channel', MultiSelectFieldListFilter)
		...
	)

支持外部键的编辑、查看、搜索

因为在 models.py 重写了 SKU__str()__ 方法,所以在 admin 后台中,SKU 会显示 name(sid),而不是 SKU objects(...) ,这对于 admin 后台管理 Order 中的 sku 字段会非常方便。
sku 是 order 的外部键,如果我们希望在 order 的编辑页面添加 / 编辑 sku,首先要把 sku 注册到 admin 后台。

# admin.py
...
from .models import SKU

class SKUAdmin(ExportActionMixin, admin.ModelAdmin):
    pass

admin.site.register(SKU, SKUAdmin)

注册后,有权限的用户就可以对 Order 的编辑页面对 SKU 进行管理。如果希望在 Order 编辑页面中支持对 sku 进行搜索:

...
class OrderAdmin(admin.ModelAdmin):
	...
    autocomplete_fields = ('sku')
    ...

你可能感兴趣的:(django,python,后端)