使用内联formset和Model表单在Admin中进行表单验证

时间:2009-06-08 21:08:50

标签: python django django-admin django-forms

我有一个模型OrderedList,它是一个用户订购的内容对象列表。 OrderedList有几个属性,包括它所属的站点。

内容对象通过OrderedListRow类附加到它上面,该类通过admin中的内联formset进入OrderedList的管理员。

class OrderedList(GenericList):

    objects = models.Manager()
    published = GenericListManager()

class OrderedListRow(models.Model):

    list = models.ForeignKey(OrderedList)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveSmallIntegerField()
    content_object = generic.GenericForeignKey("content_type", "object_id")
    order = models.IntegerField('order', blank = True, null = True)

(OrderedList从较大的GenericList摘要继承站点字段)。

这是我的问题;当用户保存管理表单时,我想验证每个OrderedListRow映射到的每个内容对象是否属于OrderedList所执行的同一站点(该列表只能属于1个站点;内容对象可以属于多个)。 / p>

我可以覆盖OrderedList的管理表单的clean(),但它不包含包含OrderedListRows的内联formset,因此它无法访问该数据。我可以覆盖OrderedListRows的内联formset的干净,但它无法到达列表。我需要在表单验证的上下文中使用某种方式来访问OrderedList的表单数据和表单集的表单数据,这样我就可以针对OrderedList的站点检查OrderedListRow的内容对象的所有站点,如果出现问题则抛出验证错误。到目前为止,我还没有找到包含OrderedRow和OrderedListRows的清理数据的函数。

2 个答案:

答案 0 :(得分:5)

在内联formset中,self.instance应该引用父对象,即OrderedList。

答案 1 :(得分:1)

我正在处理同样的问题。不幸的是,我不认为上面的答案完全涵盖了事情。

如果内联formset和admin表单都有变化,访问self.instance将无法提供准确的数据,因为您将验证基于数据库,然后保存覆盖您刚刚用于验证的数据的表单集的东西。基本上这会使您的验证豁免。

我想这里真正的问题是首先得到保存。在挖掘源代码之后,似乎管理站点首先保存了表单。这意味着,逻辑上,在formset上进行验证,并从那里访问“父”实例应该获得一致的值。