Ответы пользователя по тегу Bootstrap
  • Django: Как в модуле django-bootstrap3 (django-bootstrap4) закрашивать поле при ошибке?

    JawsIk
    @JawsIk Автор вопроса
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    В общем нашёл интересный метод. Не скажу, что решение оптимальное, но оно выполняет свою задачу, хотя и является некоторыми "костылями" (на мой взгляд).
    Метод этот я назвал "Метод провоцирования ошибки, ну или назначения ошибки" :-). При этом (как мне кажется) этот метод будет работать во всех расширениях и в том числе и в чистом варианте 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('Вы ошиблись при вводе паролей, они не совпадают, введите повторно!')

    5ba79a5457a07845474039.png5ba79a810c0b3754369354.png

    И так можно какие угодно свои правила придумывать. Да, кстати стандартные правила тоже срабатывают.

    5ba79b1c5b278976234283.pngНо всё-таки, как я уже сказал, метод не совсем оптимален, поэтому ищутся и другие варианты решения.

    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 , но в документации зачем-то так требуют, ну я и вставил.
    Ответ написан
    Комментировать