0

我想要做的是断言start_date子表单start_date的在父表单之后。

例如,如果我有以下模型:

class Parent(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    starts_at = models.DateTimeField(blank=True, null=True)


class Child(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE, related_name='children')
    starts_at = models.DateTimeField(null=True, blank=True)

管理表单设置如下:

class ChildInline(nested_admin.NestedTabularInline):
    model = models.Child
    extra = 0


@admin.register(models.Parent)
class ParentAdmin(nested_admin.NestedModelAdmin):
    inlines = [ChildInline]

我将如何根据父母(反之亦然)验证孩子?

到目前为止,我已经探索过:

  1. Form.clean()- 但这不包括子/父实例。
  2. Formset.clean()- 但是尽管制作了表单集,但似乎django-nested-admin忽略了它们,并且从未使用过它们的干净方法。

有没有人找到解决此类问题的方法?

4

1 回答 1

0

看来您仍然可以使用该model.clean()方法进行表单验证:

from django.core.exceptions import ValidationError


class Child(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE, related_name='children')
    starts_at = models.DateTimeField(null=True, blank=True)

    def clean(self):
        parent_start = self.parent.starts_at
        child_start = self.starts_at
        if parent_start and child_start < parent_start:
            raise ValidationError(f'This group cannot start before the season starts')

这将ValidationError出现在Child表格上。在表单上使用该clean方法Parent也是可能的,并且会给出该级别的错误。

于 2020-01-07T16:49:48.903 回答