3

我使用Django Model Formand创建了一个表单autocomplete_lightitem我想根据调用类时传递的论点过滤下拉列表中的建议。

我的表格是

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 ) 通过这个,我知道 category 获取了值none(因为我选择了默认值)并且这种方法似乎也不起作用。

有没有办法可以将 的值category传递给request_for_choices以便细化 serach?

4

1 回答 1

2

Autocomplete 类的self.request.POST(or self.request.GET)不会包含比搜索查询更多的信息,因为它们在创建视图时没有传递(因此将始终返回)。QueryDictself.request.POST.get('category', 'none')'none'

因此,困难的部分是以某种方式将参数 ( category) 传递给完全不同的视图。这可以通过例如修改调用自动完成的 javascript 来完成。意思是,您需要更改getQueryhttp://django-autocomplete-light.readthedocs.org/en/stable-2.xx/script.html#override-autocomplete-js-methods)以附加category=foo到调用然后,在choices_for_request读取self.request.GET QueryDict以获取该值。

另一种方法是将类别参数放入您的会话中,然后在choices_for_request. 例如,在__init__您的视图中,您将执行类似self.request.session['category'] = 'foo'的操作,并且choices_for_request您将获得该值。

于 2014-12-17T19:29:49.400 回答