2014-03-18 86 views
2

我使用的是自動完成燈光,出於某種原因,此特定類別無法正常工作 - 我無法看到它與正在運行的自動完成功能之間的任何主要區別。我的虛擬主機包含FK到主機提供Host.contain_virtuals=True無法使用此自動完成功能保存django表格

這裏是我的形式:

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) 

我已經試過兩種方式,每個都有自己的錯誤:

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) 

回答

1

這是因爲您從AutocompleteBase代替AutocompleteModelBase繼承!您也可以使用AutocompleteModelTemplate。

退房如何自動完成設計的文檔(即部分不從V1改變爲V2)解釋了V2:http://django-autocomplete-light.readthedocs.org/en/v2/autocomplete.html

+0

謝謝你!我知道你會救我,@ jpic。我還必須做一些其他更改 - 我將工作代碼放在未來讀者的原始問題中。 – thumbtackthief

+0

感謝您的好評! – jpic