Django内联不保存
Posted
技术标签:
【中文标题】Django内联不保存【英文标题】:Django inlines do not save 【发布时间】:2014-04-26 04:32:36 【问题描述】:我有几个应用程序通过ForeignKey
链接在一起,并且可以通过内联在单个页面上进行编辑。问题是虽然模型可以正确保存,但内联对象却不能。
人/模型.py
>这里是创建我的课程的地方,一个带有配音演员的角色,然后该角色是ForeignKey
'd 参加演出。
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
>在我的内联显示的地方,内联被创建并正确显示,但在编辑时,不与 Show 模型一起保存。
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
的东西未被调用。不过不太确定如何强制执行。
感谢任何帮助或批评,这可能是处理此问题的错误方法。谢谢!
EDIT 2 所以在使用#Django IRC 进行调查后,我将CharactersInline
更改为extra = 1
。这导致显示两个字段。我尝试编辑两者,第一个字段成功保存,而第二个没有。
深入研究后,我注意到模板用id='episodelist_set-0'
渲染第一个<tr>
(保存的那个),用id='episodelist_set-empty'
渲染第二个。现在我可以通过在我的 CSS 中隐藏 set-empty
行来解决这个问题。
【问题讨论】:
很确定您希望在 ShowCharacter 模型中使用 ForeignKeys 而不是 OneToOnes。按照你的方式,每个节目只能有一个角色,每个演员也只能扮演一个角色。 可能是这样,我的三个内联中有一个 OneToOne。打赌这可能会引发错误,并且表单在保存时不会捕获它。让我尝试更新它,看看它是否有效。 看起来这并没有解决保存问题,但从长远来看,这可能仍然有助于模型。 我猜这是一个复制/粘贴问题,而不是真正的问题,但你在模型中的第一行:不应该来自 django.db 导入模型而不是 django.contrib 导入模型? 哦,是的,完全是这样,我会解决的,谢谢。 【参考方案1】:这是一个老问题,但我想我会提到一些我发现的问题,因为我遇到了同样的问题(尽管它只发生在我编辑内联模板的样式之后)。
我使用 Firebug 使用默认模板样式检查页面,结果发现 django 隐藏了最终的空表单(您提出的临时解决方案)。所以对我来说,问题是我在所有内联表单所属的inline-related
类上设置了display: inline-block
(在django 1.6 中)。为了解决这个问题,我在 empty-form
类上设置了 display: none
,只有最终的内联表单属于该类。
我意识到您可能已经按照您在问题中提到的那样完成了此操作,但鉴于上述信息,它可能更有意义,并且看起来像一个不那么“hacky”的解决方案。 希望这会有所帮助!
【讨论】:
以上是关于Django内联不保存的主要内容,如果未能解决你的问题,请参考以下文章