Loading

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.jschainedm2m.js 解决

// chainedfk.js
// 将所有代码替换成下面的样子

var chainedfk = {  //第一行
    fireEvent: function (element, event) {...},
    dismissRelatedLookupPopup: function (win, chosenId) {...},
    ...
};  //最后一行
                                                         
// 同理,修改 chainedm2m.js
posted @ 2020-08-19 11:00  x0c  阅读(1777)  评论(1编辑  收藏  举报