Django 后台级联选择:django-smart-selects 包的使用
$ pip install django-smart-selects
以商品的 大类(水果)、小类(苹果)、SKU(红富士) 为例,大类是小类的外键,大类和小类又同时都是SKU的外键
# 大类
class GoodsCategory(models.Model):
pass
# 小类
class GoodsType(models.Model):
category = models.ForeignKey('GoodsCategory', verbose_name='对应大类', on_delete=models.CASCADE)
# SKU
class GoodsSKU(models.Model):
category = models.ForeignKey('GoodsCategory', verbose_name='商品大类', on_delete=models.CASCADE)
type = models.ForeignKey('GoodsType', verbose_name='商品种类', on_delete=models.CASCADE)
要在 Django 后台管理中实现:选中水果大类后,小类下拉栏中的选项自动变成水果相关
from smart_selects.db_fields import ChainedForeignKey
# 将type属性替换为django-smart-selects包装后的Field类型ChainedForeignKey即可
class GoodsSKU(models.Model):
category = models.ForeignKey('GoodsCategory', verbose_name='商品大类', on_delete=models.CASCADE)
type = ChainedForeignKey(
GoodsType,
verbose_name='商品种类',
chained_field="category",
chained_model_field="category",
show_all=False,
auto_choose=True,
sort=True)
然后 migrate
若后台管理中次级下拉栏中的内容不能随一级下拉栏的选择而变化,打开调试工具发现错误,可以通过修改 site-packages\smart_selects\static\smart-selects\admin\js
中的 chainedfk.js
和chainedm2m.js
解决
// chainedfk.js
// 将所有代码替换成下面的样子
var chainedfk = { //第一行
fireEvent: function (element, event) {...},
dismissRelatedLookupPopup: function (win, chosenId) {...},
...
}; //最后一行
// 同理,修改 chainedm2m.js