gpt4 book ai didi

django - Django admin 中的条件内联?

转载 作者:行者123 更新时间:2023-12-04 12:38:04 24 4
gpt4 key购买 nike

我试图找出一种方法,仅当 Person.is_member 为 True 时才显示以下 RelativeInline。

当前 admin.py:

class RelativeInline(admin.TabularInline):
model = Relative
fk_name = 'member'

class PersonAdmin(admin.ModelAdmin):
inlines = [RelativeInline,]
ordering = ('first_name',)
list_filter = ('is_member',)
search_fields = ('first_name', 'last_name',)
date_hierarchy = 'member_date'
list_display = ('first_name', 'last_name', 'is_member', 'member_date', 'photo')

admin.site.register(Person, PersonAdmin)

我能找到的唯一提示是我可能能够覆盖 get_formset,但我找不到一个好的例子,所以我的微弱尝试没有奏效。

这是我失败的尝试:
class RelativeInline(admin.TabularInline):
model = Relative
fk_name = 'member'

class PersonAdmin(admin.ModelAdmin):
ordering = ('first_name',)
list_filter = ('is_member',)
search_fields = ('first_name', 'last_name',)
date_hierarchy = 'member_date'
list_display = ('first_name', 'last_name', 'is_member', 'member_date', 'photo')

def get_formset(self, request, obj=None, **kwargs):
if obj.is_member:
inlines = [RelativeInline,]
return super(PersonAdmin, self).get_formset(request, obj, **kwargs)

admin.site.register(Person, PersonAdmin)

这段代码没有产生任何错误,但无论 Person.is_member 是 True 还是 False,都不会出现内联。

更新:
一位 friend 建议我尝试更改:
inlines = [RelativeInline,]

到:
self.inlines = [RelativeInline,]

但无济于事。我也试过:
PersonAdmin.inlines = [RelativeInline,]

但结果是一样的——没有错误,没有内联。

最佳答案

您的原始解决方案非常接近。如果您查看 django/contrib/admin/options.py 附近的第 290 行,您会看到内联类在模型管理员实例化时被实例化,之后 inlines列表被忽略。因此,稍后在 get_formsets() 中设置此列表无效。

但是,您是正确的, get_formsets() 是为了使您的内联有条件而要覆盖的东西。内联实例包含在 self.inline_instances 中,因此要根据对象禁用它们(例如,说我想在“添加”表单上隐藏特定的内联),您可以像这样覆盖它:

class MyAdmin(models.ModelAdmin):

inlines = [MyInline, SomeOtherInline]

def get_formsets(self, request, obj=None):
for inline in self.inline_instances:
if isinstance(inline, MyInline) and obj is None:
continue
yield inline.get_formset(request, obj)

关于django - Django admin 中的条件内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3126098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com