我有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并且/需要所有重要字段),保存时会刷新内联。
有没有办法做到这一点?我接近这个完全错了吗?
答案 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})]
我不完全确定我的问题是对的,但我希望这可以提供帮助!