用于Django框架的AJAX请求链式选择框小部件。
项目描述
这个库受到 django-chained-selectbox 的启发,该库来自 s-block (https://github.com/s-block/django-chained-selectbox)。
它使用AJAX请求为Django框架提供链式选择框小部件。值根据父值变化。
之前提到的库仅适用于Django管理。新库具有前端功能,改进了现有的实例数据初始化,并引入了新的 ChainedModelChoiceField。它还使用自定义TestClient,能够在用户登录时将 request.user 变量传递到AJAX视图。如果您需要根据用户权限过滤结果查询集,例如,这非常有用。
在Django 1.4.5上进行了测试。
要求
Django
jQuery
安装
使用pip安装python库:pip install django-clever-selects
将 clever_selects 添加到您的Django设置文件中的 INSTALLED_APPS
将 clever_selects_extras 添加到您的 {% load %} 语句中,并在关闭 </body> 元素之前放置 {% clever_selects_js_import %} 标签。将clever-selects.js文件加载到内容之后很重要,因此不要将其放在 <head></head> 中!
用法
表单
表单必须继承自 ChainedChoicesMixin(或从 ChainedChoicesForm / ChainedChoicesModelForm 继承,具体取决于您的需求),在存在实例或初始数据时加载选项
from clever_selects.form_fields import ChainedChoiceField from clever_selects.forms import ChainedChoicesForm class SimpleChainForm(ChainedChoicesForm): first_field = ChoiceField(choices=(('', '------------'), (1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'), )) second_field = ChainedChoiceField(parent_field='first_field', ajax_url=reverse_lazy('ajax_chained_view')) class MultipleChainForm(ChainedChoicesForm): first_field = ChoiceField(choices=(('', '------------'), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), )) second_field = ChainedChoiceField(parent_field='first_field', ajax_url=reverse_lazy('ajax_chained_view')) third_field = ChainedChoiceField(parent_field='second_field', ajax_url=reverse_lazy('ajax_chained_view')) fourth_field = ChainedChoiceField(parent_field='third_field', ajax_url=reverse_lazy('ajax_chained_view')) fifth_field = ChainedChoiceField(parent_field='fourth_field', ajax_url=reverse_lazy('ajax_chained_view')) class ModelChainForm(ChainedChoicesModelForm): brand = forms.ModelChoiceField(queryset=CarBrand.objects.all(), required=True, empty_label=_(u'Select a car brand')) model = ChainedModelChoiceField(parent_field='brand', ajax_url=reverse_lazy('ajax_chained_models'), empty_label=_(u'Select a car model'), model=BrandModel, required=True) engine = forms.ChoiceField(choices=([('', _('All engine types'))] + Car.ENGINES), required=False) color = ChainedChoiceField(parent_field='model', ajax_url=reverse_lazy('ajax_chained_colors'), empty_label=_(u'Select a car model'), required=False) class Meta: model = Car
注意,对于不同目的,ajax URL可能因每个字段而异。请参阅示例项目以获取更多用法。
为了预填充子字段,表单可能需要访问当前用户。这可以通过在表单视图的 __init__() 方法的 kwargs 中传递用户来实现。ChainedSelectFormViewMixin 会为您处理这一点。
class CreateCarView(ChainedSelectFormViewMixin, CreateView) template_name = "create_car.html" form_class = ModelChainForm model = Car
视图
每当父字段更改时,都会进行 Ajax 调用。您必须设置返回 json 列表的 ajax URL
class AjaxChainedView(BaseDetailView): """ View to handle the ajax request for the field options. """ def get(self, request, *args, **kwargs): field = request.GET.get('field') parent_value = request.GET.get("parent_value") vals_list = [] for x in range(1, 6): vals_list.append(x*int(parent_value)) choices = tuple(zip(vals_list, vals_list)) response = HttpResponse( json.dumps(choices, cls=DjangoJSONEncoder), mimetype='application/javascript' ) add_never_cache_headers(response) return response
或者,您可以使用 ChainedSelectChoicesView 类辅助器,如下所示
class AjaxChainedView(ChainedSelectChoicesView): def get_choices(self): vals_list = [] for x in range(1, 6): vals_list.append(x*int(self.parent_value)) return tuple(zip(vals_list, vals_list))
或者这样
class AjaxChainedView(ChainedSelectChoicesView): def get_child_set(self): return ChildModel.object.filter(parent_id=self.parent_value)
不要忘记更新您的 urls.py
url(r'^ajax/custom-chained-view-url/$', AjaxChainedView.as_view(), name='ajax_chained_view'),
项目详情
django-clever-selects-1.0.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 13399d844c1097206959313cf940a479ef65d43eb1767d43026fc9ecb9fb2130 |
|
MD5 | ad3b2173ae37d787bc352de4fd3eabfa |
|
BLAKE2b-256 | 8a854a7c9533dbbe5ad039c651ec1d0832f71bd6c11dadd1fb8f873fac005be9 |