В общем нашёл интересный метод. Не скажу, что решение оптимальное, но оно выполняет свою задачу, хотя и является некоторыми "костылями" (на мой взгляд).
Метод этот я назвал "Метод провоцирования ошибки, ну или назначения ошибки" :-). При этом (как мне кажется) этот метод будет работать во всех расширениях и в том числе и в чистом варианте Django.
Суть в чём. Как бы говорим "а вот на этом поле ошибка". И бац всё срабатывает. Кстати вывод ошибки через raise вообще можно в этом случае отключить, а можно и оставить по желанию. В коде это всё выглядит очень просто. Вот так:
def clean(self):
username = self.cleaned_data['username']
password = self.cleaned_data['password']
password_check = self.cleaned_data['password_check']
if User.objects.filter(username=username).exists():
from django.forms.utils import ErrorList
self._errors['username'] = ErrorList()
self._errors['username'].append('Пожалуйста выберите другое имя пользователя, т.к. пользователь с таким логином уже зарегистрирован в системе!')
# raise forms.ValidationError('Пользователь с данным логином уже зарегистрирован в системе!', code='user exists',)
if password != password_check:
from django.forms.utils import ErrorList
self._errors['password'] = ErrorList()
self._errors['password'].append(' ')
self._errors['password_check'] = ErrorList()
self._errors['password_check'].append('Вы ошиблись при вводе паролей, они не совпадают, введите повторно!')
И так можно какие угодно свои правила придумывать. Да, кстати стандартные правила тоже срабатывают.
Но всё-таки, как я уже сказал, метод не совсем оптимален, поэтому ищутся и другие варианты решения.
p.s. да кстати, поле не будет выделяться, если не прописать в append ничего. Поэтому я там ставил пробел.
p.s.2
Решение 2. На мой взгляд оптимальное.
и вот тут как говорить "за спрос денег не берут". Я через гугл переводчик всё это дело спросил на гитхабе у разработчика дополнения django-bootstrap3. И какая же была моя радость, что ответили быстро и точно. Единственное, чего в нём нельзя (ну или я пока не нашёл), так это сразу использовать и POP-up сообщение с красной формой. Но это уже совсем для искушённых. А решение такое:
def clean(self):
username = self.cleaned_data['username']
password = self.cleaned_data['password']
password_check = self.cleaned_data['password_check']
if User.objects.filter(username=username).exists():
raise forms.ValidationError({'username':'Пожалуйста выберите другое имя пользователя, т.к. пользователь с таким логином уже зарегистрирован в системе!'}, code='user exists')
if password != password_check:
raise forms.ValidationError({'password': '',
'password_check': 'Вы ошиблись при вводе паролей, они не совпадают, введите повторно!'}, code='passwords do not match',)
кстати я не знаю вообще зачем вставлять code , но в документации зачем-то так требуют, ну я и вставил.