JawsIk
@JawsIk
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)

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

Сделал я форму регистрации (в forms.py) и там же метод clean для валидации:
class RegistrationForm(forms.ModelForm):
    password_check = forms.CharField(widget=forms.PasswordInput, label='Повтор пароля')
    password = forms.CharField(widget=forms.PasswordInput, label='Пароль')
    class Meta:
        model = User
        fields = ['username', 'password', 'password_check', 'first_name', 'last_name', 'email']
        labels = {
            'username': 'Логин',
            'first_name': 'Ваше имя',
            'last_name': 'Ваша фамилия',
            'email': 'Email',
        }
        help_texts = {
            'password': 'придумайте пароль не совсем простой',
            'email': 'указывайте реальный адрес, т.к. на него придёт подтверждение'
        }

    def clean(self):
        username = self.cleaned_data['username']
        if User.objects.filter(username=username).exists():
            raise forms.ValidationError('Пользователь с данным логином уже зарегистрирован в системе!', code='user exists',)


Сделал шаблон регистрации (registration.html):
{% extends 'base.html' %}
{% load bootstrap3 %}

{% block content %}
    <h3 class="text-center">Регистрация нового пользователя</h3>
    <hr>
<div class="col-xs-offset-3 col-xs-6">
<form method='POST' action='#' class="form-horizontal"> {% csrf_token %}
    {% bootstrap_form form show_label=True layout='horizontal' %}
    {% bootstrap_button "Зарегистрировать" icon="ok" button_type="submit" button_class="btn-success" extra_classes="pull-right" %}
</form>
</div>
{% endblock %}


При появлении ошибки, выскакивает красное сообщение, но поле (где обнаружена ошибка) не окрашивается, а наоборот все поля окрашиваются в зелёный цвет. Как (принудительно, что-то добавить в метод clean или ещё куда и) сделать так, чтобы поле окрашивалось в нужный мне цвет (по сути нужно добавить класс, но как?), а то вот такая картина:
5ba774dc991ab961432770.png
  • Вопрос задан
  • 247 просмотров
Решения вопроса 1
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 , но в документации зачем-то так требуют, ну я и вставил.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы