Arm*_*ués 8 django django-admin inline-formset
给定一个名为MainModela和a 的模型RelatedModel,其中后者有一个ForeignKey字段MainModel:
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)
Run Code Online (Sandbox Code Playgroud)
和相应的ModelAdmin类:
class RelatedModel1InlineAdmin(admin.TabularInline):
model = RelatedModel1
class RelatedModel2InlineAdmin(admin.TabularInline):
model = RelatedModel2
class MainModel(admin.ModelAdmin):
inlines = [RelatedModel1, RelatedModel2]
Run Code Online (Sandbox Code Playgroud)
这是默认行为,你得到两个内联,每个相关模型一个.现在的问题是如何完全隐藏所有的内联的时候MainModel正在创建实例(ModelAdmin的add_view),并显示了内联RelatedModel1时type的现场MainModel实例True,并显示了内联RelatedModel2时False.
我打算为属性创建一个描述符ModelAdmin.inline_instances,但我意识到我需要访问正在编辑的对象实例,但它作为参数传递.
有帮助吗?
谢谢!
从偷看看起来contrib.admin.options.py你可以覆盖ModelAdmin.get_formsets。请注意,管理站点self.inline_instances在 处填充__init__,因此您可能希望遵循而不是一遍又一遍地实例化您的内联。我不知道它有多贵:)
def get_formsets(self, request, obj=None):
if not obj:
return [] # no inlines
elif obj.type == True:
return [MyInline1(self.model, self.admin_site).get_formset(request, obj)]
elif obj.type == False:
return [MyInline2(self.model, self.admin_site).get_formset(request, obj)]
# again, not sure how expensive MyInline(self.model, self.admin_site) is.
# the admin does this once. You could instantiate them and store them on the
# admin class somewhere to reference instead.
Run Code Online (Sandbox Code Playgroud)
原来的管理员get_formsets使用生成器 - 你也可以更接近地模仿原来的:
def get_formsets(self, request, obj=None):
for inline in self.inline_instances:
yield inline.get_formset(request, obj)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3492 次 |
| 最近记录: |