在admin.TabularInline中使用时如何限制Django管理员选择选项?

时间:2015-07-08 17:20:24

标签: python django django-admin

我在这里撕扯头发试图做一些感觉应该很简单的事情,但我无法解决如何在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,发现了一些类似的问题:

但我所尝试的几乎所有内容都未能影响有多少参考资料可供选择。

1 个答案:

答案 0 :(得分:0)

这可能不是您正在寻找的答案,但我认为您最好的选择是为管理页面编写一个小型JavaScript函数,以根据当前选定的参考文献隐藏不需要的SurveyItem选项。之后,您可以在admin save()方法中进行验证/清理。

如果您想要在服务器端执行所有操作,则用户体验必须至少执行两个请求(页面加载):第一个用于设置调查引用,第二个用于使用这些引用过滤调查项目。即使这样,当用户在页面上添加/删除调查引用时,选项仍然不会实时调整。尽管如此,这是一个很好的问题 - 没有一种明显的方法可以在tabularInline中获取父模型数据(例如Prepopulating inlines based on the parent model in the Django Admin) - 但我认为总体上它可能是最难以接近这一点的JS。