gpt4 book ai didi

django - 如何根据当前对象字段值显示不同的内联

转载 作者:行者123 更新时间:2023-12-01 21:32:48 24 4
gpt4 key购买 nike

给定一个名为 MainModel 的模型和一个 RelatedModel,其中后者有一个 MainModelForeignKey 字段:

class MainModel(models.Model):
name = models.CharField(max_length=50)
type = models.BooleanField()

class RelatedModel1(models.Model):
main = models.ForeingKey(MainModel):
name = models.CharField(max_length=50)

class RelatedModel2(models.Model):
main = models.ForeingKey(MainModel):
name = models.CharField(max_length=50)

以及相应的 ModelAdmin 类:

class RelatedModel1InlineAdmin(admin.TabularInline):
model = RelatedModel1

class RelatedModel2InlineAdmin(admin.TabularInline):
model = RelatedModel2

class MainModel(admin.ModelAdmin):
inlines = [RelatedModel1, RelatedModel2]

这是默认行为,您将获得两个内联,每个相关模型一个。问题是如何在创建 MainModel 实例(ModelAdminadd_view)时完全隐藏所有内联,并显示当 MainModel 实例的 type 字段为 True 时,内联 RelatedModel1,并显示 的内联当 False 时,RelatedModel2

我要创建一个 descriptor对于 ModelAdmin.inline_instances 属性,但我意识到我需要访问正在编辑的对象实例,但它作为参数传递。

有什么帮助吗?

谢谢!

最佳答案

@Yuji 'Tomita' Tomitayou 这个想法很好,我也有同样的想法,但是一旦尝试,我意识到你还必须从 self.inlines 中删除特定的键,因为在 change_view 中> 和 add_view 方法 self.get_inline_instances(request)get_formsets() 之前调用。因此,我将内联处理移至 get_form() 方法。

这是我成功做到这一点的方法:

class SampleAdmin(ModelAdmin):
inlines = []

def get_inlines(self):
return [SampleInline, SampleInline2]

def get_form(self, request, obj=None, **kwargs):
# due to django admin form fields caching you must
# redefine inlines on every `get_form()` call
if (obj): self.inlines = self.get_inlines()
for inline in self.inlines:
# Here change condition based on your needs and manipulate
# self.inlines as you like (remove, change, etc).
# I used inline.__name__ to detect if this is correct inline
# for my obj
if obj.CONDITION:
self.inlines.remove(inline)
return super(SampleAdmin, self).get_form(request, obj, **kwargs)

关于django - 如何根据当前对象字段值显示不同的内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8074161/

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