我有一个Animal
到ForeignKey
模型的模型(我们称之为Genus
)。我想有一个允许用户选择Animal实例的Modelform
。显然,单个选择列表中有太多动物,因此我希望用户能够按属进行过滤,然后按动物搜索。
Select2有an example of using Ajax request做一些与我想要的相似的事情。我会搜索 genus / animal ,而不是搜索 usr / repo 。用户可能不知道他们想要的确切属或确切的动物,因此两个位都需要是可搜索的。这个UI可以满足我的需求。
Django-select2允许我将Select2与Django一起使用,并且我认为我应该可以使用widget。请注意,urls.py
包含url(r'^heavy_data/$', heavy_data, name='heavy_data'),
,因此我可以正常访问视图方法。
在我ModelForm
的{{1}}中,有:
__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))
搜索字符串传递给视图。但是,我可能甚至没有走在正确的轨道上......我呢?有没有更好的方法来做我想要的?
答案 0 :(得分:2)
这实际上是微不足道的。
首先定义一个新的小部件,如下所示:
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。