我使用Django Model Form
和autocomplete_light
创建了一个表单。我想根据调用类时传递的争论来过滤下拉列表item
中的建议。
我的表单是
class CamenuForm(autocomplete_light.ModelForm):
class Meta:
model = Ca_dispensaries_item
exclude = ('dispensary',)
autocomplete_fields = ('item',)
def __init__(self, *args, **kwargs):
self.category = kwargs.pop('category', None)
super(CamenuForm, self).__init__(*args, **kwargs)
self.fields['item'].queryset=Items.objects.filter(product_type__name=self.category)
我已根据__init__
传递的值在category
中应用了一个过滤器,但似乎没有效果。
注册表是
autocomplete_light.register(Items,search_fields=('item_name',))
表单名为
form = CamenuForm(request.POST or None, category=category)
请建议我一种方法,以便我可以根据调用表单时传递的值来优化搜索。
我尝试使用
修改它class AutoComplete(autocomplete_light.AutocompleteModelBase):
search_fields=('item_name',)
def choices_for_request(self):
category = self.request.POST.get('category', 'none')
print category
choices = self.choices.all()
if category:
choices = choices.filter(product_type__name=category)
return self.order_choices(choices)[0:self.limit_choices]
和注册表为
autocomplete_light.register(Items,AutoComplete)
通过这个,我知道该类别获得值none
(因为我选择的默认值),这种方法似乎也不起作用。
有没有办法可以将category
的值传递给request_for_choices
,以便可以改进搜索?
答案 0 :(得分:2)
自动填充类的self.request.POST
(或self.request.GET
)QueryDict
不会包含除搜索查询之外的任何其他信息,因为它们不是在创建视图时传递(因此self.request.POST.get('category', 'none')
将始终返回'none'
)。
因此,困难的部分是以某种方式将参数(category
)传递给完全不同的视图。这可以通过修改调用自动完成的javascript来完成。这意味着,您需要更改getQuery
(http://django-autocomplete-light.readthedocs.org/en/stable-2.x.x/script.html#override-autocomplete-js-methods)以将category=foo
追加到被调用的网址,然后在choices_for_request
读取self.request.GET
} QueryDict
获得该值。
另一种方法是将category参数放入会话,然后阅读choices_for_request
中的会话。例如,在您视图的__init__
上,您会执行类似self.request.session['category'] = 'foo'
的操作,并在choices_for_request
上获得该值。