我在这里撕扯头发试图做一些感觉应该很简单的事情,但我无法解决如何在Django中做到这一点。
我有三种型号。
class Survey()
name = models.CharField(max_length=100)
class Reference()
field = models.ForeignKey(Survey)
class SurveyItem()
field = models.ForeignKey(Survey)
reference = models.ForeignKey(Reference, blank=True, null=True)
我希望能够在单个表单上显示这些内容,因此当用户创建调查并为其调查添加一些参考时,他们就可以选择在表单的内联部分添加带有该Reference的SurveyItems
class SurveyInfoItemInline(admin.TabularInline):
model = SurveyInfoItem
extra = 3
class ReferenceItemInline(admin.TabularInline):
model = Reference
extra = 2
class StaticSurveyAdmin(admin.ModelAdmin):
inlines = [ReferenceItemInline, SurveyItemInline]
我目前创建了这个表单,而且很笨重,但是人们可以用它成功提交。
但是,我无法看到一种内联表单范围的方法,因此当用户使用SurveyInfoItemInline小部件在 Survey 上创建 SurveyInfoItems 时,他们只选择之前添加到此调查中的引用,而不是在应用中的表格中显示所有引用。
我查看了stackoverflow,发现了一些类似的问题:
但我所尝试的几乎所有内容都未能影响有多少参考资料可供选择。
答案 0 :(得分:0)
这可能不是您正在寻找的答案,但我认为您最好的选择是为管理页面编写一个小型JavaScript函数,以根据当前选定的参考文献隐藏不需要的SurveyItem选项。之后,您可以在admin save()方法中进行验证/清理。
如果您想要在服务器端执行所有操作,则用户体验必须至少执行两个请求(页面加载):第一个用于设置调查引用,第二个用于使用这些引用过滤调查项目。即使这样,当用户在页面上添加/删除调查引用时,选项仍然不会实时调整。尽管如此,这是一个很好的问题 - 没有一种明显的方法可以在tabularInline中获取父模型数据(例如Prepopulating inlines based on the parent model in the Django Admin) - 但我认为总体上它可能是最难以接近这一点的JS。