我正在尝试为autocomplete_fields
中某个类型的所有项设置自定义标签。
到目前为止,对于下拉列表,人们会使用
...
class CustomDisplay(forms.ModelChoiceField):
def label_from_instance(self, obj):
return "Some custom text: {}".format(obj.name)
...
somethings = CustomDisplay(queryset=Something.object.all())
...
但是在autocomplete_fields = (somethings,)
中使用这个会导致自动完成取消,并向我显示一个带有自定义文本的下拉列表。
2条答案
按热度按时间7hiiyaii1#
字段显示普通
select
小部件的原因是,在定义自定义字段时,没有将小部件设置为AutocompleteSelect
。在指定
autocomplete_fields
的ModelAdmin
类中,导入CustomDisplay
和AutocompleteSelect
并添加以下方法:这将仅在查看现有示例时显示自定义文本。当您查看autocomplete下拉列表并选择一个条目时,标签不是从
label_from_instance()
生成的,而是从AutocompleteJsonView
内部的一个直接的str()
调用生成的。因此,假设您只想更改autocomplete小部件中的标签(要全面更改标签,您显然只需更改模型
__str()__
方法),您还需要在admin.py
中创建一个自定义类,以修改AutocompleteJsonView
中的get()
方法:现在,在自动完成显示结果的
ModelAdmin
类(而不是指定autocomplete_fields的ModelAdmin
类)上设置autocomplete_view
:因此,如果您有一个名为
YourModelAdmin
的ModelAdmin
类,其中包含autocomplete_fields = ['something']
,则可以为Something
模型的相应ModelAdmin
类设置autocomplete_view
。Django 4.2更新:
i5desfxk2#
这就是我最后的工作:
在父管理上使用
autocomplete_fields
:autocomplete_fields
在子管理模型上使用search_fields
,但是,您可以使用get_search_results
进行覆盖,因此我创建了一个mixin,其中解析请求引用者url可以解析父模型:并混合在一起覆盖
get_search_results
,如下所示:为了改变它的显示方式,我在模型中添加了一个自定义的
__str__
。引用: