可选择django的插件(用于select2用户界面)
django-selectable-select2的Python项目详细描述
警告
这项工作仍在进行中。发布之间可能会发生一些向后不兼容的更改。
这个项目是django-selectable的一种插件。
它提供了用于名为select2的伟大js库的小部件,而不是jquery ui。
目前,只有一个基本的单值自动完成小部件可用于foreignkey(或简单的modelchoicefield)字段。
安装
安装django-selectable(您可以操作jquery ui的相关部分)
安装django-selectable-select2
pip install django-selectable-select2
添加可选择的应用程序。看起来是这样的:
INSTALLED_APPS = ( ... 'selectable', 'selectable_select2', ... )
添加/更改设置SELECTABLE_ESCAPED_KEYS,如下所示:
SELECTABLE_ESCAPED_KEYS = ('label', 'value')
您还可以获得所有静态文件依赖项,如下所示:
pip install django-staticfiles-jquery pip install django-staticfiles-select2
并将它们添加到INSTALLED_APPS:
INSTALLED_APPS = ( ... 'jquery', 'staticfiles_select2', ... )
用法
定义您的lookup class
在您的表单中,您可以使用selectable_select2.widgets.AutoCompleteSelect2Widget,就像这样:
from selectable_select2.widgets import AutoCompleteSelect2Widget from django import forms from myapp.models import MyModel # example model with a ForeignKey called ``myfk`` from myapp.lookups import MyModelLookup # the lookup defined in previous step class MyModelForm(forms.ModelForm): class Meta: model = MyModel widgets = { 'myfk' : AutoCompleteSelect2Widget(MyModelLookup, placeholder='select related item') }
如何包含静态资产?
警告
从0.4.0版起,django-selectable-select2不包含select2本身的任何静态文件依赖项。 如果您的项目中没有django-staticfiles-select2和/或django-staticfiles jquery文件,请使用它们。
您可以手动包含这些资产(假设您使用的是django静态文件)。喜欢这样:
<html> <head> <link rel="stylesheet" href="{{ STATIC_URL }}staticfiles_select2/select2/select2.css"> </head> <body> <form action="." method="post"> {{ form.as_p }} <p><button type="submit">Submit</button></p> </form> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}staticfiles_select2/select2/select2.min.js"></script> <script type="text/javascript" src="{{ STATIC_URL }}selectable_select2/js/jquery.dj.selectable.select2.js"></script> </body> </html>
链式选择
有一种方法可以在django selectable中进行链式选择。 检查docs about chained selects以正确准备查找类 对于这个用例(您可以跳过javascript部分)。 django-selectable-select2提供了一个helper类来声明链式选择的依赖关系。 在你的表格上。
所以给定查找,从上面的链接并假设mymodel有foreignkeys 对于city和state,表单类可以从^{tt4}继承$ 定义select2_deps属性如下:
from selectable_select2.forms import Select2DependencyModelForm from django import forms from selectable_select2.widgets import AutoCompleteSelect2Widget class ChainedForm(Select2DependencyModelForm): select2_deps = ( ('city', { 'parents' : ['state'] }), ) class Meta: model = MyModel widgets = { 'city' : AutoCompleteSelect2Widget(CityLookup, placeholder='select city') }
还有适合于非基于模型的表单的Select2DependencyForm。
注意
Select2DependencyModelForm和Select2DependencyForm 在selectable_select2.forms模块中,从名为 Select2DependencyFormMixin,它定义了一个名为apply_select2_deps的方法。 不要犹豫浏览这些类的源代码。
select2_deps是两个元组的元组,格式为('<;fieldname>;':{<;options dict>;}) 其中,选项dict是配置该字段依赖项的python字典。
选项dict的参考
- 家长
- 指定字段的上级字段名列表。 像上面的例子一样,你可以根据你选择的州来选择一个城市。 字段可以依赖于多个父级。默认为:[]
- 清除父变更
- 布尔值(真/假),指示当用户 更改其父级之一的选择/值。默认为:true
- 父名称映射
一个方便的选项(python字典),用于指示通过ajax为哪个父项发送哪个密钥名。 例如,假设字段child依赖于 链式选择。您可以指定:
select2_deps = ( ('child', { parents : ['parent1', 'parent2' ] parents_namemap : { 'parent1' : 'parent', 'parent2' : 'parent' } }), )
然后您的查找可以更清晰,并且只能搜索parent键 而不是在你的^{tt19}中与parent1和parent2杂耍$ 方法。默认为:{}。
查看示例项目以了解更多详细信息。
待办事项
查看todo.rst
关于django可选版本的说明
此应用程序所需的Django可选最低版本为0.7
学分
非常感谢Igor Vaynberg(select2)和Mark Lavin(django-selectable) 对于他们的项目,他们的支持和解决我问题的快速反应时间。