Каковы различия между использованием self.add_error () и повышением ValidationError ()? - PullRequest
1 голос
/ 19 февраля 2020

Вы можете выдать ошибку проверки двумя способами. Первый с self.add_error(), а второй с raise ValidationError().

Я читал, что когда вы используете self.add_error('field1','description here'), field1 также автоматически удаляется из списка cleaned_data, и я предполагаю, что Объект ValidationError также добавлен в список self.errors, это правильно?

Но что произойдет, если вы не решите использовать self.add_error и выберете вместо него raise ValidationError? Этот объект также автоматически добавляется в список errors за кулисами? И как бы вы отобразили это сообщение об ошибке в качестве заголовка под правильным недействительным полем?

Спасибо

1 Ответ

1 голос
/ 19 февраля 2020

Если вы выдаете ошибку, поток управления этого метода и вызывающие стороны этого метода останавливаются, пока не найдется метод, имеющий диапазон try - except, и соответствующим образом перехватит исключение.

Но иногда поле может содержать несколько ошибок. Например, если у вас есть пароль, вы можете добавить ошибки, потому что он слишком короткий, не содержит ди git, строчные буквы и / или верхний регистр.

Тогда вы можете реализовать это с помощью :

def clean_password(self):
    pwd = self.cleaned_data['password']
    if len(pwd) < 10:
        self.add_error('password', 'The password is too short.')
    if not any(c.isupper() for c in pwd):
        self.add_error('password', 'The password should contain an uppercase character.')
    if not any(c.islower() for c in pwd):
        self.add_error('password', 'The password should contain an lowercase character.')
    if not any(c.isdigit() for c in pwd):
        self.add_error('password', 'The password should contain an digit.')
    return pwd

Если вы подняли ValidationError для одного из них, он не может добавить mutliple проблем, которые могут возникнуть с паролем.

Однако вы можете передать список ошибок конструктору данных ValidationError, поэтому вы можете использовать два взаимозаменяемых.

...