如何使用自动完成灯创建依赖下拉列表

时间:2014-12-17 14:58:09

标签: django django-models django-forms django-autocomplete-light

我使用Django Model Formautocomplete_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,以便可以改进搜索?

1 个答案:

答案 0 :(得分:2)

自动填充类self.request.POST(或self.request.GETQueryDict不会包含除搜索查询之外的任何其他信息,因为它们不是在创建视图时传递(因此self.request.POST.get('category', 'none')将始终返回'none')。

因此,困难的部分是以某种方式将参数(category)传递给完全不同的视图。这可以通过修改调用自动完成的javascript来完成。这意味着,您需要更改getQueryhttp://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上获得该值。