Django Проверка вложенных администраторов вложенных строк из родительских форм - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь подтвердить, что 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 игнорирует их и их чистые методы никогда не используются.

Кто-нибудь нашел решение для такого рода проблем?

1 Ответ

0 голосов
/ 07 января 2020

По-видимому, вы все еще можете использовать метод 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 также возможно, что приведет к ошибкам на этом уровне.

...