带有 Select2 远程数据示例的 Django

Posted

技术标签:

【中文标题】带有 Select2 远程数据示例的 Django【英文标题】:Django with Select2 remote data example 【发布时间】:2016-05-22 00:29:22 【问题描述】:

我有一个模型(我们称之为Animal),它有一个ForeignKey 到一个Genus 模型。我想要一个Modelform,它允许用户选择一个 Animal 实例。显然,单个选择列表有太多动物,所以我希望用户能够按属过滤,然后按动物搜索。

Select2 有 an example of using Ajax request 做一些与我想要的非常相似的事情。我不会搜索usr/repo,而是搜索genus/animal。用户可能不知道他们想要的确切属或确切动物,因此这两个位都需要可搜索。这个 UI 可以满足我的需求。

Django-select2 允许我在 Django 中使用Select2,并且我认为我应该可以使用widget。请注意,urls.py 包含 url(r'^heavy_data/$', heavy_data, name='heavy_data'),,因此我可以正常访问视图方法。

在我的ModelForm__init__(...) 中,有:

self.fields['animal'] = forms.ModelChoiceField(
    widget=HeavySelect2Widget(data_view='heavy_data'),
    queryset=Animal.objects.all())

而在views

def heavy_data(request):
    filtered_animals = 
    if request.is_ajax():
        import ipdb
        ipdb.set_trace()
        # What next?
    return HttpResponse(json.dumps(filtered_animals))

我不确定如何将整个 genus/animal 搜索字符串从表单传递到视图。然而,我什至可能没有走上正确的轨道……是吗?有没有更好的方法来做我想做的事?

【问题讨论】:

【参考方案1】:

这实际上是微不足道的。

首先像这样定义一个新的小部件:

class MyWidget(ModelSelect2Widget):
    search_fields = ['name__icontains', 'genus__name__icontains']

然后,在您的表单中,使用该小部件:

class AnimalModelForm(ModelForm):
    class Meta:
        model = Animal
        fields = ['animal', ]
        widgets = 'configurator': MyWidget, 

然后,您可以按属、动物或两者进行搜索。没有巧妙的格式,您只需输入搜索字词。

非常感谢Johannes Hoppe his help。

【讨论】:

以上是关于带有 Select2 远程数据示例的 Django的主要内容,如果未能解决你的问题,请参考以下文章

带有远程数据的 select2 多选中的默认选择选项

select2.js 未显示结果,如 Django 示例

已解决:如何在 Django 中的表单错误中重新显示带有选定值的表单集和 Select2 字段

X-editable 和 Select2 远程数据不起作用

select2 - 将获取远程数据与多个选择和预数据相结合

当搜索没有返回结果时,Select2 过滤器值消失