假设有两个 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):
...
当然也可以定义为别的控件
# 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')
...