Django Admin自动补全404报错ApartmentPromotionAdmin需配置search_fields
问题根因
两个报错的触发逻辑如下:
'ManyToOneRel' object has no attribute 'get_limit_choices_to':自定义Form的AutocompleteSelect部件传参错误,你传入了外键字段的remote_field(类型为ManyToOneRel),但该部件要求第一个参数为外键字段实例本身。ApartmentPromotionAdmin must have search_fields for the autocomplete_view:你同时给ApartmentPromotionAdmin配置了autocomplete_fields、又自定义了同字段的AutocompleteSelect部件,参数错误导致Django识别自动补全源异常,误将ApartmentPromotionAdmin当做自动补全的数据源类,而该类未配置search_fields。
修复方案
二选一即可,推荐用方案1更符合Django原生设计,维护成本更低:
方案1:直接使用原生autocomplete_fields
删掉自定义的PromotionApartmentForm全量代码,调整ApartmentPromotionAdmin配置如下:
class ApartmentPromotionAdmin(admin.ModelAdmin): list_display = ("id", "apartment") autocomplete_fields = ["apartment"] # 若要调整下拉框宽度,通过Media引入自定义css即可 class Media: css = { "all": ("css/custom_admin.css",) }
在你项目的静态文件目录下新增css/custom_admin.css,添加样式:
.admin-autocomplete { width: 400px !important; }
注意:请确保Apartment模型已经用ApartmentAdmin注册到Admin站点,你当前的ApartmentAdmin已经配置了符合要求的search_fields,无需调整
方案2:保留自定义Form部件
删除ApartmentPromotionAdmin中的autocomplete_fields配置,同时修正Form中AutocompleteSelect的传参:
class PromotionApartmentForm(forms.ModelForm): class Meta: fields = "__all__" widgets = { "apartment": AutocompleteSelect( # 去掉.remote_field,直接传入字段实例 ApartmentPromotion._meta.get_field("apartment"), admin.site, attrs={"style": "width: 400px"}, ), } class ApartmentPromotionAdmin(admin.ModelAdmin): form = PromotionApartmentForm list_display = ("id", "apartment")
内容的提问来源于stack exchange,提问作者Ryabchenko Alexander
相关产品推荐
相关产品推荐

