4

我有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 的 Admin 页面时,我想查看与它相关的 Middles(并且能够从此页面或此页面上的链接添加和编辑 Middles)。

我可以通过内联轻松做到这一点。问题是中间有这么多(必需)字段,它变得笨拙。

如果我指定内联只显示中间标题

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

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

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

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

但现在我不确定如何处理第二个问题。

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

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

4

1 回答 1

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})]

我不太确定我的问题是对的,但我希望这能有所帮助!

于 2013-11-18T21:33:55.780 回答