Django Admin内联多个字段,可以使用内联添加按钮创建弹出窗口吗?

时间:2013-09-26 15:44:32

标签: python django django-admin

我有3个型号:

class Top(models.Model):
    toptitle = models.CharField(max_length=255, verbose_name='top title')

class Middle(models.Model):
    top = models.ForeignKey(Top)
    middletitle = models.CharField(max_length=255, verbose_name='middle title')
    importantfield1 = models.TextField(verbose_name='important field 1')
    importantfield2 = models.TextField(verbose_name='important field 2')
    ...
    importantfield20 = models.TextField(verbose_name='important field 20')

现在,当我查看Top的管理员页面时,我想查看Middles与它相关的内容(并且能够从此页面或此页面上的链接添加和编辑Middles)。

我可以通过内联轻松地做到这一点。问题是在Middle中有这么多(必需的)字段会变得难以处理。

如果我指定内联仅显示middletitle

class MiddleInline(admin.TabularInline):
    model = MiddleInline
    fields = ('middletitle',)
    extra = 0

我有两个问题。首先是我没有办法进入我可以编辑已经存在的Middles的所有字段的页面(无需进入Admin菜单,选择Middle并且必须在那里找到正确的Middle) 。第二个问题是,如果我尝试从这个内联添加另一个中间,它允许我创建一个只有middletitle的中间,但是留空所有必需的重要字段。

我已经能够通过添加编辑对象的链接来处理第一个问题:

class MiddleInline(admin.TabularInline):
    def changeform_link(self,instance):
        if instance.id:
            changeform_url = reverse(
                'admin:myapp_middle_change', args=(instance.id,)
            )
            return '<a href="'+ changeform_url + '" target="_blank">Details</a>'
        return ''
    changeform_link.allow_tags = True
    changeform_link.short_description = ''   # omit column header

    model = MiddleInline
    fields = ('middletitle','changeform_link')
    extra = 0

但现在我不知道如何处理第二个问题。

理想情况下,我想要“添加另一个中间”部分来打开一个用于创建新中间的弹出窗口(已经设置了Top并且/需要所有重要字段),保存时会刷新内联。

有没有办法做到这一点?我接近这个完全错了吗?

1 个答案:

答案 0 :(得分:0)

我很确定我有一些相同的问题。我的解决方案是为两种不同的情况显示两个不同的字段集。

ModelAdmin类有get_fieldsets(self,request, obj=None)个函数,我在admin.py文件中覆盖。

如下所示:

class MiddleInline(admin.TabularInline):
    '''your stuff'''

    def get_fieldsets(self, request, obj=None):
        if obj is None:
            fields = list(('''tuple of the fields you want to display if it's a new object'''))
        else:
            fields = list(('''tuple of the fields you want to display if it's not a new object'''))
        return [(None, {'fields': fields})]

我不完全确定我的问题是对的,但我希望这可以提供帮助!