我使用的是自動完成燈光,出於某種原因,此特定類別無法正常工作 - 我無法看到它與正在運行的自動完成功能之間的任何主要區別。我的虛擬主機包含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)
謝謝你!我知道你會救我,@ jpic。我還必須做一些其他更改 - 我將工作代碼放在未來讀者的原始問題中。 – thumbtackthief
感謝您的好評! – jpic