Django Admin级联选择(Cascader)包django-smart-selects
级联选择(Cascader)是一种选择控件,以分组菜单的形式展示选项,通常包含两个或以上的层级。它适合于有逻辑顺序的场景,如“省、市、区”的选择。Django下django-smart-selects提供级联选择应用。
使用场景:
- 常用于单选,但也可以支持多选。
- 适用于选项之间存在明显的层级关系,如上下级关系或权限的包含关系。
- 与输入框配合使用,可以通过下拉菜单承载。
1.安装django-smart-selects
pip install django-smart-selects
2.在settings.py的INSTALLED_APPS添加smart_selects
3.添加urls路由
urlpatterns = patterns('',url(r'^admin/', include(admin.site.urls)),url(r'^chaining/', include('smart_selects.urls')),)
4.链式选择示例应
models.py
class Continent(models.Model):name = models.CharField(max_length=255)class Country(models.Model):continent = models.ForeignKey(Continent)name = models.CharField(max_length=255)class Location(models.Model):continent = models.ForeignKey(Continent)country = models.ForeignKey(Country)area = models.ForeignKey(Area)city = models.CharField(max_length=50)street = models.CharField(max_length=100)
选择大洲Location后,如果只想该大洲上的国家/地区可用,则可以在模型上使用 ChainedForeignKey
from smart_selects.db_fields import ChainedForeignKeyclass Location(models.Model):continent = models.ForeignKey(Continent)country = ChainedForeignKey(Country,chained_field="continent",chained_model_field="continent",show_all=False,auto_choose=True,sort=True)area = ForeignKey(Area)city = models.CharField(max_length=50)street = models.CharField(max_length=100)
ChainedForeignKey选项
- chained_field (必填)表示同一模型上应链接到的字段。示例是模型中字段的名称。
- chained_model_field(必填)表示与Model链接的模型相对应的链式模型的字段。示例Model中字段的名称。
- show_all(可选)指只显示筛选的结果,还是还想进一步显示其他结果。
- auto_choose(可选)是否在只有一个可用选项时自动选择选项。
- sort排序(可选)指是否应按字典对结果集进行排序。默认Model.ordering为True 。
5.链接 ManyToMany 选择示例
models.py
from smart_selects.db_fields import ChainedManyToManyFieldclass Publication(models.Model):name = models.CharField(max_length=255)class Writer(models.Model):name = models.CharField(max_length=255)publications = models.ManyToManyField('Publication', blank=True, null=True)class Book(models.Model):publication = models.ForeignKey(Publication)writer = ChainedManyToManyField(Writer,chained_field="publication",chained_model_field="publications")name = models.CharField(max_length=255)
from smart_selects.db_fields import ChainedManyToManyFieldclass Publication(models.Model):name = models.CharField(max_length=255)class Writer(models.Model):name = models.CharField(max_length=255)publications = models.ManyToManyField('Publication', blank=True, null=True)class Book(models.Model):publication = models.ForeignKey(Publication)writer = ChainedManyToManyField(Writer,horizontal=True,verbose_name='writer',chained_field="publication",chained_model_field="publications")name = models.CharField(max_length=255)
ChainedManyToManyField 选项
chained_field(必填)表示同一模型上应链接到的字段。示例是模型中字段的名称。
chained_model_field(必填)表示与链接的模型相对应的链式模型的字段。示例是模型中字段的名称。
auto_choose(可选)指是否在只有一个可用选项时自动选择选项。
horizontal(可选)
混合 Django 的,以便在 Django 后台使用FilteredSelectMultiple
6.在模板中的使用
在模板中,像往常一样继续使用 Django 表单或模型表单。只需包含在您的表格中即可。这将自动将以下 Javascript 文件添加到您的页面中:{{ form.media.js }}
<script src="/static/smart-selects/admin/js/chainedfk.js"></script><script src="/static/smart-selects/admin/js/bindfields.js"></script>
下面是一个基本的用法示例:
<form method="post">{% csrf_token %}{{ form.media.js }}{{ form.as_p }}<input type="submit" value="Submit" /></form>
参考文档
项目github:https://github.com/jazzband/django-smart-selects文档:https://django-smart-selects.readthedocs.io/en/latest/installation.html
THE END




