Трясогузка: Как проверить отношения модели страницы перед сохранением

У меня есть тип страницы, для которой я хочу автоматически определять заголовок (и slug), основываясь на некоторых других полях и отношениях модели более высокого уровня. Для этого я переопределяю метод full_clean() моего класса страницы.

Единственное, что может пойти не так, это то, что новая страница получит slug, который уже используется среди страниц-родственников. То есть предполагается, что должны существовать только страницы с уникальными комбинациями полей, которые будут влиять на slug. Таким образом, если пользователь пытается сохранить страницу с дублирующейся комбинацией полей данных, я хочу отобразить красивое и читаемое ValidationError.

<<<Насколько я понимаю, метод full_clean() вызывается несколько раз во время редактирования/сохранения страниц, следуя своего рода иерархическому подходу, где процедура очистки начинается с базовых вещей и доходит до отношений модели. Похоже, что ValidationErrors отлавливаются в пользовательском интерфейсе и красиво отображаются только тогда, когда они не вызываются в предположительно последнем вызове full_clean(), сразу после нажатия кнопки сохранения. Когда я поднимаю ValidationError, когда у меня под рукой есть вся информация, он не перехватывается и отображается обратная трассировка. Есть ли способ изящно обработать ValidationError, если я могу поднять его только в последнем вызове?

Мой full_clean() в основном делает примерно следующее:

def full_clean(self, *args, **kwargs):
    if not_all_relevant_model_data_available_yet:
        return super()_full_clean(*args, **kwargs)

    # in this two functions I access the model stuff I need
    self.title = self.set_title()
    self.slug = self.set_slug()
    
    return super()_full_clean(*args, **kwargs)

Если slug не уникален среди братьев и сестер, super().full_clean() вызовет ошибку ValidationError, в результате чего вместо приятного сообщения GUI будет показан неприятный экран ошибки.

Поскольку мне нужны отношения модели, я думаю, что не могу пойти по пути выполнения валидации в форме и использовать метод clean() и делать form.add_error(...) .

Вернуться на верх