我有一些相互关联的模型需要在一个管理页面上共存。这是个主意:
剧院制作有演员,演员有指定的角色。剧院制作与给定的书面文本(游戏,改编等)相关,书面文本包含该文本的所有角色的列表。添加制作时,每个演员都需要与其中一个角色相关联。
以下是数据模型的工作原理:
模型:制作,人物,演员,角色,书面文字
关系:生产和人通过CastMember建立M2M关系,后者添加一个“角色”字段 - 一个对象的ForeignKey。角色本身对WrittenText对象有一个ForeignKey。
所以,问题是:在Productions的管理页面中,我有一个TabularInline来添加CastMembers。表中的CastMember条目的“角色”字段应仅限于生产引用的WrittenText中指定的角色。
我通过覆盖模型表单来解决问题:
class CastMemberForm(ModelForm):
class Meta:
model = CastMember
def __init__(self, *args, **kwargs):
super(CastMemberForm, self).__init__(*args, **kwargs)
if 'instance' in kwargs:
self.fields['role'].queryset = Role.objects.filter(source_text=self.instance.production.source_text)
但是,只有从下拉列表中选择一个人,保存,然后选择角色时,这才有效 - 否则您只需获取所有角色的列表。取出“如果'实例'在kwargs中”给了我一个DoesNotExistError。
如果没有像客户端JS这样的东西,这是不是太复杂了,还是有一个我想念的更简单的解决方案?
答案 0 :(得分:0)
Here是通过javascript / ajax链接选择框的示例。它应该基本上是相同的原则,但你应该调整js不更新一个选择框,但所有这些都在内联管理员...也许这给你一个小灵感!