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内联不保存的主要内容,如果未能解决你的问题,请参考以下文章

Python/Django 避免保存内联

Django-Admin TabularInline 在保存前修改内联项属性

Django 中的内联表单验证

Django Admin:如何只保存内联模型而不是父模型

带有内联表单集的 Django 表单验证

如何防止 Django 基本内联自动转义