Django 与 Select2 远程数据示例

Django with Select2 remote data example

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

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

Django-select2 allows me to use Select2 with Django and has a 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 搜索字符串从表单传递到视图。但是,我什至可能没有走上正确的轨道……是吗?有没有更好的方法来做我想做的事?

这其实是微不足道的。

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

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

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

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

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

非常感谢Johannes Hoppe for his help