Django内联不保存
我有几个应用程序,它们通过 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 个回答
这是一个老问题,但我想提一下我发现的事情,因为我也遇到过同样的问题(不过是在我修改了内联模板的样式后才出现的)。
我用Firebug这个工具检查了页面,发现默认模板的样式下,django会隐藏最后一个空表单(你提到的临时解决方案)。对我来说,问题出在我给所有内联表单所属的inline-related
类设置了display: inline-block
。为了修复这个问题,我把只有最后一个内联表单使用的empty-form
类的样式改成了display: none
。
我知道你可能已经做过这些,因为你在问题中提到了,但根据以上信息,这样做可能更合理,看起来也不那么“黑科技”。希望这对你有帮助!