Django Admin反向Inline选项过滤:仅展示applicable=False的Test对象
解决方案
你需要重写TestInlineAdmin的formfield_for_foreignkey方法实现过滤,原因是你当前使用的Inline绑定的是多对多关系的中间表,中间表内关联Test的字段是外键类型而非多对多类型,因此之前重写formfield_for_manytomany不会被触发。
实现代码:
class TestInlineAdmin(admin.TabularInline): model = Test.questions.through extra = 0 def formfield_for_foreignkey(self, db_field, request, **kwargs): # 匹配中间表中指向Test模型的外键字段 if db_field.name == "test": # 过滤仅展示applicable=False的Test对象 kwargs["queryset"] = Test.objects.filter(applicable=False) return super().formfield_for_foreignkey(db_field, request, **kwargs)
说明:
- 此方法会直接修改新增/编辑关联条目时Test下拉框的可选范围,同时不会影响已关联条目的正常展示
- 如果你的中间表中指向Test的外键字段名不是默认的
test,请将代码中的db_field.name == "test"替换为实际的字段名 - 你之前遇到的
AttributeError: 'dict' object has no attribute 'widget'报错,是因为错误配置了formfield_overrides参数(比如给字段类型赋值的字典缺少widget属性),使用上述方案不需要配置formfield_overrides,也无需自定义完整Inline表单。
内容的提问来源于stack exchange,提问作者Tomasz Szkudlarek
相关产品推荐
相关产品推荐

