2010-10-07 80 views
1

我仍然坚持在同一页面上使用相关模型的内联树样式。 我有三个型号,A,B和CDjango:使用inlineformset对相关模型进行内联编辑

Class A 

Class B 
    fb = foreignkey(A) 

Class C 
    fc = foreignkey(B) 

在admin.py我做这样的事情

AdminA 
    inlines = [inlineB] 

AdminB 
    inlines = [inlineC] 

我想,当我编辑/添加模型A,I应该能够在线添加ModelB,并添加模型B的相关模型C条目。我正在尝试使用inlineformsets,但无法找到如何将它们用于我的目的。此外,我发现this old discussion on same problem。但是,再次,因为我是新来的Django,我不知道如何使它工作。

+0

_What的添加页面你真的到目前为止试试吗?_你做了一个相关的问题12小时前,其中你说模型B仅仅定义了A和C之间的关系。我曾经与django-tagging中的模型有类似的设置,它基本上使用'TaggedItem'的'GenericInlineAdminForm'工作,它也主要定义标签,标签对象和内容类型之间的关系。但是,如果您仅指出相当抽象的问题,则无法期望在此得到有用的答案。 – 2010-10-07 13:39:23

+0

12小时前,是B是抽象类。但没有更长的时间,我对班上做了一些改变。早些时候,我希望找到一些内置的解决方案,比如如果你想创建一个foreginkey对象就会出现的弹出窗口。现在我正在尝试创建一个inlineformset类型的结构。所以在Inline行中,我希望除了B的字段外,我还能够添加C类对象的实例。所以寻找一个使用模型,inlineformsets等自定义的formset解决方案。事实上,我的问题是完全一样的,我提到的链接。你可以填写我的解决方案的细节吗? – Neo 2010-10-07 13:53:04

+1

请查看http://docs.djangoproject.com/en/1.2/ref/contrib/admin/#inlinemodeladmin-objects。如果您为模型B定义了InlineAdminForm,例如派生自admin.TabularInline,你应该得到一个表单显示,它提供了** + ** - 按钮,它们可以让你在弹出窗口中创建C的实例。如果这不起作用,请检查您的外键。您链接的问题基本上对您的问题有合理的答案。 – 2010-10-07 14:34:06

回答

2

它有点奇怪的回答你自己的问题,但嘿没有人加强。并感谢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的管理中有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] 

瞧,我得到popus按钮来创建B的完整对象,在模型A

+1

在B和C模型中使用IntegerFields的目的是什么? – antihero 2012-06-20 09:45:04

+0

这是真的弹出?我不这么认为。 – andi 2014-03-25 10:08:05

相关问题