Django内联不保存

4 投票
1 回答
1608 浏览
提问于 2025-04-17 23:00

我有几个应用程序,它们通过 ForeignKey 连接在一起,并且可以通过内联的方式在同一页面上进行编辑。问题是,虽然模型可以正常保存,但内联对象却无法保存。

people/models.py

在这里,我创建了我的类,一个角色和一个配音演员,然后这个角色通过 ForeignKey 关联到一个节目。

from django.db import models

class VoiceActor(models.Model):   
   first_name     =     models.CharField(max_length=200)
   last_name      =     models.CharField(max_length=200, blank=True)

class Characters(models.Model):
   first_name     =     models.CharField(max_length=200)
   last_name      =     models.CharField(max_length=200, blank=True)
   voice_actor    =     models.ManyToManyField(VoiceActor, blank=True)

class ShowCharacters(models.Model):
   show           =     models.ForeignKey('info.Show')
   character      =     models.ForeignKey(Characters)
   role           =     models.ForeignKey('metadata.Roles', blank=True)

info/admin.py

在这里,我的内联被展示出来,内联创建得很好,并且显示正常,但在编辑后,无法与节目模型一起保存。

from django.contrib import admin
from info.models import *
from people.models import *

class CharactersInline(admin.TabularInline):
   model = ShowCharacters
   extra = 0

class ShowAdmin(admin.ModelAdmin):
   fieldsets = (...)
   inlines = [CharactersInline]

admin.site.register(Show, ShowAdmin)

我大约有四个类似的内联,其中两个内联是在 info 应用程序内部处理的,但它们仍然无法保存。

编辑:根据我发现的情况,可能是因为没有调用 formset_save。不过我不太确定怎么强制调用这个。

任何帮助或批评都很受欢迎,可能这是处理这个问题的错误方式。谢谢!

编辑 2 所以在与 #Django IRC 讨论后,我把 CharactersInline 改成了 extra = 1。这样就显示了两个字段。我尝试编辑这两个字段,第一个字段成功保存,而第二个没有。

深入查看后,我注意到模板渲染第一个 <tr>(可以保存的那个)时使用了 id='episodelist_set-0',而第二个则使用了 id='episodelist_set-empty'。目前我可以通过在我的 CSS 中隐藏 set-empty 行来解决这个问题。

1 个回答

1

这是一个老问题,但我想提一下我发现的事情,因为我也遇到过同样的问题(不过是在我修改了内联模板的样式后才出现的)。

我用Firebug这个工具检查了页面,发现默认模板的样式下,django会隐藏最后一个空表单(你提到的临时解决方案)。对我来说,问题出在我给所有内联表单所属的inline-related类设置了display: inline-block。为了修复这个问题,我把只有最后一个内联表单使用的empty-form类的样式改成了display: none

我知道你可能已经做过这些,因为你在问题中提到了,但根据以上信息,这样做可能更合理,看起来也不那么“黑科技”。希望这对你有帮助!

撰写回答