管理员中的内联表单集和模型表单的表单验证

6 投票
2 回答
2390 浏览
提问于 2025-04-15 12:06

我有一个模型,叫做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相同的网站(因为这个列表只能属于一个网站,而内容对象可以属于多个网站)。

我可以重写OrderedList的管理表单中的clean()方法,但这个方法无法访问包含OrderedListRows的内联表单,所以无法获取到那部分数据。我也可以重写OrderedListRows的内联表单的clean方法,但它又无法访问OrderedList。我需要一种方法,在表单验证的过程中,能够同时访问OrderedList的表单数据和表单集的数据,这样我才能检查OrderedListRow的内容对象的网站是否和OrderedList的网站一致,如果有问题就抛出一个验证错误。到目前为止,我还没有找到一个函数可以同时获取OrderedRow和OrderedListRows的清理数据。

2 个回答

1

我也遇到了同样的问题。很遗憾,我觉得上面的回答并没有完全解决这个问题。

如果在内联表单和管理员表单中都有更改,访问 self.instance 可能会得到不准确的数据,因为你会根据数据库中的数据进行验证,然后再保存表单,这样就会覆盖你刚刚用来验证的数据。简单来说,这样会导致你的验证结果滞后一步。

我想这里真正的问题是,哪个先被保存。经过查看源代码,似乎管理员网站是先保存表单的。这意味着,从逻辑上讲,在表单集上进行验证,然后再访问“父”实例,应该能得到一致的值。

6

在这个内联表单集中,self.instance 应该指向父对象,也就是 OrderedList。

撰写回答