如何让Django 3的autocomplete_fields搜索模型字符串表示
实现Django Autocomplete按模型自定义字符串表示搜索
可以实现,核心是通过配置模型的search_fields覆盖默认搜索字段范围,具体步骤如下:
1. 修正模型的字符串表示方法
注意你的Shelf模型中定义的__string__是错误的,Python中模型的字符串表示方法应为__str__,否则自定义显示内容不会生效,修正代码:
# models.py class Shelf(models.Model): name = models.CharField(max_length=256) department = models.ForeignKey(Department, on_delete=models.CASCADE) def __str__(self): # 修正为__str__ return f'{self.department.store.name} {self.department.name} {self.name}'
2. 配置Shelf模型的Admin搜索字段
Django Admin的autocomplete组件搜索逻辑依赖对应模型Admin类的search_fields,默认仅搜索模型自身部分字段。我们需要把自定义字符串表示中包含的所有关联字段都加入search_fields:
# admin.py from django.contrib import admin from .models import Store, Department, Shelf, Product @admin.register(Shelf) class ShelfAdmin(admin.ModelAdmin): # 包含所有参与搜索的字段:货架名、部门名、商店名 search_fields = ['name', 'department__name', 'department__store__name'] @admin.register(Product) class ProductAdmin(admin.ModelAdmin): autocomplete_fields = ('shelf',) list_display = ('name', 'shelf')
效果说明
配置完成后,在Product管理页面的shelf autocomplete组件中,搜索商店名称、部门名称或货架名称时,系统都会匹配对应的Shelf选项,和你自定义的__str__显示内容完全对应。
内容的提问来源于stack exchange,提问作者Oleksandr Khaustovych
相关产品推荐
相关产品推荐

