更改Django autocomplete_fields标签

时间:2019-04-11 10:05:43

标签: python django django-2.1

我正在尝试为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,)一起使用将导致自动完成取消并显示带有自定义文本的下拉列表。

1 个答案:

答案 0 :(得分:0)

该字段显示普通select小部件的原因是,当您定义自定义字段时,没有将小部件设置为AutocompleteSelect

在您指定ModelAdmin的{​​{1}}类中,导入autocomplete_fieldsCustomDisplay并添加以下方法:

AutocompleteSelect

那只会在您查看现有实例时显示自定义文本。当您查看自动完成下拉列表并选择一个条目时,标签不是从from django.contrib.admin.widgets import AutocompleteSelect class YourModelAdmin(admin.ModelAdmin): autocomplete_fields = ['something'] ... def formfield_for_foreignkey(self, db_field, request, **kwargs): db = kwargs.get('using') if db_field.name == 'something': return CustomDisplay(queryset=Something.object.all(), widget=AutocompleteSelect(db_field.remote_field, self.admin_site, using=db)) return super().formfield_for_foreignkey(db_field, request, **kwargs) 生成的,而是从label_from_instance()内部直接进行的str()调用生成的。

因此,假设您只想更改自动完成窗口小部件中的标签(要全面更改标签,您显然只需更改模型AutocompleteJsonView方法),还需要在{{ 1}}修改了__str()__中的admin.py方法:

get()

现在在自动完成显示结果的AutocompleteJsonView类上设置from django.contrib.admin.options import AutocompleteJsonView from django.http import Http404, JsonResponse class CustomAutocompleteJsonView(AutocompleteJsonView): def get(self, request, *args, **kwargs): if not self.model_admin.get_search_fields(request): raise Http404( '%s must have search_fields for the autocomplete_view.' % type(self.model_admin).__name__ ) if not self.has_perm(request): return JsonResponse({'error': '403 Forbidden'}, status=403) self.term = request.GET.get('term', '') self.paginator_class = self.model_admin.paginator self.object_list = self.get_queryset() context = self.get_context_data() # Replace this with the code below. # # return JsonResponse({ # 'results': [ # {'id': str(obj.pk), 'text': str(obj)} # for obj in context['object_list'] # ], # 'pagination': {'more': context['page_obj'].has_next()}, # }) return JsonResponse({ 'results': [ {'id': str(obj.pk), 'text': 'Some custom text: {}'.format(obj.name)} for obj in context['object_list'] ], 'pagination': {'more': context['page_obj'].has_next()}, }) (不是您指定autocomplete_fields的autocomplete_view类):

ModelAdmin

因此,如果您有一个ModelAdmindef autocomplete_view(self, request): return CustomAutocompleteJsonView.as_view(model_admin=self)(request) 的{​​{1}}类,则可以为{{1 }}模型。