2

autocomplete-light を使用していますが、何らかの理由でこの特定のクラスが機能していません。それと機能しているオートコンプリートとの間に大きな違いは見られません。私の VirtualHost には、ホストへの fk が含まれています。Host.contain_virtuals=True

これが私のフォームです:

class VirtualHostForm(ServerForm):
    def __init__(self, *args, **kwargs):
        super(VirtualHostForm, self).__init__(*args, **kwargs)

        self.helper.form_id = 'virtual_host_form'

    host = forms.ModelChoiceField(Host.objects.all(),
        widget=autocomplete_light.ChoiceWidget('HostAutocomplete'), 
        label='Associated Host'
    class Meta:
        model = Virtual
        fields = ServerForm.Meta.fields + ['host',]
        widgets = autocomplete_light.get_widgets_dict(Server)

私は2つの方法を試しましたが、それぞれに独自のエラーがあります:

class HostAutocomplete(autocomplete_light.AutocompleteBase):
    #registers autocomplete for hosts that can contain virtuals
    autocomplete_js_attributes = {'placeholder': 'Select a host'}
    widget_template='assets/subtemplates/autocomplete_remove.html',
    choice_template='assets/_autocomplete_choice.html',

    def choices_for_request(self):
        q = self.request.GET.get('q', '')
        hosts = Host.objects.values_list('name', flat=True)
        return hosts.filter(name__icontains=q, contain_virtuals=True).distinct()


autocomplete_light.register(HostAutocomplete)

このようにして、次のエラーが表示されます'NotImplementedType' object is not callable。それはメソッドを持っていないことに関連しているように見えたのでchoices_for_values(私の他のオートコンプリートのいくつかはそうではありませんが)、私は追加しました:

def choices_for_values(self):
    choices = Host.objects.filter(id__in=self.values)
    return choices

(ここで何をしているのかよくわかりません。ドキュメントにはあまり情報がなかったので、最善の推測をしました)。

これはinvalid literal for int() with base 10:、外部キー関係の pk ではなく、名前を見ていることを意味すると思いますか? それは推測です。

上記の試みはすべて、テンプレートの書式設定を正しくレンダリングしなかったことに注意してください。

だから最後に私は試しました:

autocomplete_light.register(
    Host,
    autocomplete_light.AutocompleteModelTemplate,
    name='HostAutocomplete',
    widget_template='assets/subtemplates/autocomplete_remove.html',
    choice_template='assets/_autocomplete_choice.html',
    autocomplete_js_attributes={'placeholder': 'Type associated host'},
    search_fields=['name'],
    )

これは保存します(そして正しいフォーマットを含みます)が、に基づいて選択肢をフィルタリングしませんcontain_virtuals=True; 可能なすべてのホストが含まれているだけです。

編集:

以下の@jpicのヘルプのおかげで、これは機能します:

class HostAutocomplete(autocomplete_light.AutocompleteModelTemplate):
    #registers autocomplete for hosts that can contain virtuals
    autocomplete_js_attributes = {'placeholder': 'Select a host'}
    choice_template='assets/_autocomplete_choice.html',

    def choices_for_request(self):
        q = self.request.GET.get('q', '')
        hosts = Host.objects.filter(contain_virtuals=True,name__icontains=q).distinct()
        return hosts

    def choices_for_values(self):
        choices = Host.objects.filter(id__in=self.values)
        return choices

autocomplete_light.register(Host, HostAutocomplete)
4

1 に答える 1

2

これは、 AutocompleteModelBase ではなく AutocompleteBase を継承しているためです。AutocompleteModelTemplate も使用できます。

オートコンプリートの設計が v2 のドキュメントでどのように説明されているかを確認してください (その部分は v1 から v2 まで変わりません): http://django-autocomplete-light.readthedocs.org/en/v2/autocomplete.html

于 2014-03-19T18:41:04.467 に答える