【问题标题】:Django : Inline editing of related model using inlineformsetDjango:使用 inlineformset 对相关模型进行内联编辑
【发布时间】:2011-04-22 07:59:15
【问题描述】:

我仍然坚持使用同一页面上相关模型的内联树状编辑。 我有三个模型,A、B 和 C。

Class A

Class B
    fb = foreignkey(A)

Class C
    fc = foreignkey(B)

在 admin.py 我正在做类似的事情

AdminA
    inlines = [inlineB]

AdminB
    inlines = [inlineC]

我希望当我编辑/添加模型 A 时,我应该能够内联添加模型 B,并添加模型 B 的相关模型 C 条目。我正在尝试内联表单集,但不知道如何将它们用于我的目的。此外,我找到了this old discussion on same problem。但同样,由于我是 Django 新手,我不知道如何让它工作。

【问题讨论】:

  • 到目前为止,您实际尝试了什么?您在 12 小时前提出了一个相关问题,您说模型 B 仅定义了 A 和 C 之间的关系。我曾经与来自 d​​jango-tagging 的模型有类似的设置,它基本上使用TaggedItemGenericInlineAdminForm 工作,它还主要定义标签、标记对象和内容类型之间的关系。但是,如果您只陈述相当抽象的问题,您就不能期望在这里得到有用的答案。
  • 12 小时前,是的,B 是一个抽象类。但不再是,我对课程进行了一些更改。早些时候我希望找到一些内置的解决方案,比如如果你想创建一个foreginkey对象就会出现的弹出窗口。现在我正在尝试创建一种 inlineformset 类型的结构。所以在内联行中,我希望除了 B 的字段之外,我还能够添加实例类 C 对象。因此,寻找使用模型表单、内联表单集等的定制表单集解决方案。事实上,我的问题与我提到的链接中的问题完全相同。你能告诉我它的解决方案的细节吗?
  • 请看docs.djangoproject.com/en/1.2/ref/contrib/admin/…。如果您为模型 B 定义 InlineAdminForm,例如从 admin.TabularInline 派生,您应该获得一个提供 + 按钮的表单显示,该按钮应该使您能够在弹出窗口中创建 C 的实例。如果这不起作用,请检查您的外键。您链接到的问题基本上对您的问题有合理的答案。
  • Bernd,感谢您的回复。但我想你误解了这个问题。我需要从 A 的添加/编辑页面编辑/添加 C 实例。显然,正如您提到的,将 C 作为模型 B 的内联编辑/添加与“+”一起使用。但这是一个树问题,在 A 的页面中编辑 C。我以抽象的方式编写问题以抓住问题的要点,即添加 A 的新实例并同时添加 B( 及其 C 对象)。最初的问题,有一个很好的解决方案,但很多部分是不完整的,特别是因为它使用了较旧的 django。一旦我弄清楚了,我会发布一个完整的解决方案。
  • 不完全。我的意思是在 A 的页面内以表格形式内联显示 B,并可以从 B 的内联显示中添加 C 的实例。在我的例子中,B 是文章 A 的标签列表,带有用于从现有标签中选择标签的选择框和用于创建和分配新标签 (C) 的加号按钮。但是,在 A 的页面中 C 的内联显示 - 绕过 B 的任何显示 - 可能更难以实现。

标签: django django-admin inline-formset


【解决方案1】:

回答您自己的问题有点奇怪,但是没有其他人站出来。感谢 Bernd 为我指明了正确的方向。该解决方案需要制作一个中间模型。就我而言,BC级。

class A(models.Model):                                        
a = models.IntegerField()                                 


class B(models.Model):                                        
    fb = models.ForeignKey(A)                                 
    b = models.IntegerField()                                 

class C(models.Model):                                        
    fc = models.ForeignKey(B)                                 
    c = models.IntegerField()                                 

class BC(models.Model):                                       
    fc = models.ForeignKey(A)                                 
    fb = models.ForeignKey(B)                                 

并且不要在模型 A 的 Admin 中使用 InlineB,而是使用 BC 的内联。所以完整的 admin.py 看起来像。

class InlineC(admin.TabularInline):
    model = C
    extra = 1

class BCInline(admin.TabularInline):
    model = BC
    extra = 1

class AdminA(admin.ModelAdmin):
    fieldsets = [
        (None, {
            'fields': ('a',)
            }),
        ]
    inlines = [BCInline]

class AdminB(admin.ModelAdmin):
    fieldsets = [
        (None, {
            'fields': ('b',)
            }),
        ]
    inlines = [InlineC]

瞧,我在模型 A 的添加页面中获得了 popus 的按钮来创建 B 的完整对象。

【讨论】:

  • 在 B 和 C 模型中有 IntegerFields 的对象是什么?
  • 这真的是弹出窗口吗?我不这么认为。
猜你喜欢
  • 2011-09-13
  • 2014-09-27
  • 1970-01-01
  • 2011-11-23
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2020-07-18
相关资源
最近更新 更多