$ 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