【问题标题】:Form Validation in Admin with Inline formset and Model form使用内联表单集和模型表单在管理员中进行表单验证
【发布时间】:2010-11-01 07:25:37
【问题描述】:

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

内容对象通过 OrderedListRow 类附加到它,该类通过管理中的内联表单集被引入 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 个站点;内容对象可以属于多个)。

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

【问题讨论】:

    标签: python django django-admin django-forms


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我正在处理同样的问题。不幸的是,我认为上面的答案并不能完全涵盖所有内容。

      如果内联表单集和管理表单都发生了变化,访问 self.instance 将不会提供准确的数据,因为您将基于数据库进行验证,然后保存覆盖您刚刚用于验证的数据的表单集事物。基本上,这使您的验证落后了。

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

      【讨论】:

      • 最后,我为 OrderedListRow 内联创建了一个表单集,并覆盖了它的 clean() 函数。在其中,我可以通过说 site_id = self.data.get('site') 来提取站点 ID,其中 'site' 是父 OrderedList 使用的站点字段的名称。本质上,我是直接从表单数据访问它。获得提交的站点 ID 后,我可以遍历 OrderedListRow 表单集的所有表单,并将其内容的站点与 OrderedList 的站点进行比较。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2016-03-15
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      相关资源
      最近更新 更多