3

Django Model Formと を使用してフォームを作成しました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 ) これにより、カテゴリが値を取得することがわかりnone(選択したデフォルト値のため)、このメソッドも機能しないようです。

検索を洗練できるように値をcategory渡す方法はありますか?request_for_choices

4

1 に答える 1

2

Autocomplete クラスのself.request.POST(またはself.request.GET)には、ビューの作成時に渡されないため、検索クエリ以外の情報は含まれませ(したがって、常に が返されます)。QueryDictself.request.POST.get('category', 'none')'none'

したがって、難しい部分は、何らかの方法で引数 ( category) をまったく別のビューに渡すことです。これは、たとえば、オートコンプリートを呼び出す JavaScript を変更することによって行うことができます。つまり、変更する必要がありますgetQuery( http://django-autocomplete-light.readthedocs.org/en/stable-2.xx/script.html#override-autocomplete-js-methods ) でcategory=fooある URL に追加します。呼び出されてから、その値を取得するために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 に答える