Уведомления

Группа в Telegram: @pythonsu

#1 Май 24, 2020 22:42:42

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Django raise forms.ValidationError не работает.

Прошу помощи.
при вводе в форму слова размером меньше три символа должна появляться forms.ValidationError.
У меня в этом случае вообще ничего не происходит.
Просто форма обнуляется.
как сделать чтобы срабатывало?

forms.py

 from django import forms
import re
from django.utils.translation import gettext_lazy as _
class SearchForm(forms.Form):
    bez = forms.CharField(max_length=40, label=_("Search condition / Cross-reference "), required=False)
    def clean(self):
        cleaned_data = super(SearchForm, self).clean()
        bez0 = cleaned_data.get('bez')
        cleaned_bez = re.sub('([^a-zA-Z0-9])',"", bez0)
        cleaned_bez = cleaned_bez.upper()
        cleaned_bez = cleaned_bez.replace("NBR","")
        if len(cleaned_bez) < 3:
            raise forms.ValidationError(_('PLEASE ENTER AT LEAST 3 CHARACTERS'))
        return(cleaned_bez)

views.py
 def search_form(request):
    if request.method == 'POST':
        form = SearchForm(request.POST)
        context = {'form':SearchForm}
        if form.is_valid():
            context = do_search_in_cross_ref(form.cleaned_data)
       
    else:
        cform = SearchForm()
        context = {'form':cform}
    return render(request, 'ael/start_page.html', context)

спасибо

Отредактировано gtlhbkkj (Май 24, 2020 22:44:07)

Офлайн

#2 Май 24, 2020 23:43:54

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Django raise forms.ValidationError не работает.

  from django import forms
import re
from django.utils.translation import gettext_lazy as _
class SearchForm(forms.Form):
    bez = forms.CharField(max_length=40, label=_("Search condition / Cross-reference "), required=False)
    def clean(self):
        cleaned_data = super(SearchForm, self).clean()
        bez0 = cleaned_data.get('bez')
        if len(cleaned_bez) < 3 or cleaned_bez is None:
            raise forms.ValidationError(_('PLEASE ENTER AT LEAST 3 CHARACTERS'))
        cleaned_bez = re.sub('([^a-zA-Z0-9])',"", bez0)
        cleaned_bez = cleaned_bez.upper()
        cleaned_bez = cleaned_bez.replace("NBR","")
        return(cleaned_bez)
  def search_form(request):
    if request.method == 'POST':
        form = SearchForm(request.POST)
        context = {'form':SearchForm}
        if form.is_valid():
            context = do_search_in_cross_ref(form.cleaned_data)
        else:
            print(form.error)
            context = {'error': form.error}
    else:
        cform = SearchForm()
        context = {'form':cform}
    return render(request, 'ael/start_page.html', context)

Офлайн

#3 Май 25, 2020 01:47:00

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Django raise forms.ValidationError не работает.

Romissevd
благодарю вас. Сделал как вы говорите. Ошибка-то генерируется и в терминал выводится принтом так как вы указали. Но она не выходит в темплейте. Извините пожста, не совсем точно сформулировал вопрос. При вводе в форму слова длиной меньше 3-х символов, форма должна в темплейте выдавать ошибку.

разве ошибка не попадает в конт екст темплейта вот этим выражением?
 context = {'form':SearchForm}

вот сам темплейт.
самый последний блок внизу должен выводить эту ошибку вроде.
 {% extends 'base.html' %}
{% load i18n %}
{% block start %}
<div class="p-3 mb-2 bg-secondary text-white"><h6>{% trans "PLEASE ENTER FILTER ELEMENT" %}</h6></div>
{% if missing_data_error %}
  <div class="p-3 mb-2 bg-danger text-white">
  {% trans "Please enter missing data in the bottom of the page if you need a quotation" %}</div>
{% endif %}
<form  action = "{% url 'ael:search_form' %}" method = "post" novalidate>
  {% csrf_token %}
    {% if form.non_field_errors %}
        {% for error in form.non_field_errors %}
        <div class="alert alert-danger" role-"alert">
        {{ error }}
        </div>
        {% endfor %}
      {% endif %}
      {% for hidden_field in form.hidden_fields %}
        {% if hidden_field.errors %}
          <ul>
            {% for error in hidden_field.errors %}
            <li>(Hidden field: {{ hidden_field.name }}) {{error}}</li>
            {% endfor %}
          </ul>
        {% endif %}
        {{ hidden_field }}
      {% endfor %}
        <div class="form-row align-items-center">
          <div class="col-sm-3 my-1">
            {{form.bez.label_tag}}
          </div>
          <div class="col-sm-3 my-1">
            {{form.bez}}
          </div>
          <div class="col-auto my-1" >
            <button type="submit" class="btn btn-info">{% trans "SEARCH" %}</button>
          </div>
        </div>
        {% if form.bez.errors %}
            {% for error in form.bez.errors %}
            <div class="alert alert-warning" role-"alert">
                {{ error }}
            </div>
            {% endfor%}
        {% endif %}
</form>
{% endblock %}

Отредактировано gtlhbkkj (Май 25, 2020 01:49:16)

Офлайн

#4 Май 25, 2020 10:53:38

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Django raise forms.ValidationError не работает.

gtlhbkkj
Внимательно почитайте документацию. В Джанге есть ошибки валидации ассоциированные с полями, а есть ошибки не ассоциированные. Например, если нам надо проверить взаимно разумные данные - вид животного и возраст. Хомячки не живут сорок лет, поэтому вам нужна не ассоциированная ошибка. Не ассоциированные ошибки попадают в https://docs.djangoproject.com/en/3.0/ref/forms/api/#django.forms.Form.non_field_errors. А если вам нужна ассоциированная ошибка, то клинить её надо специальным методом https://docs.djangoproject.com/en/3.0/ref/forms/validation/#cleaning-a-specific-field-attribute, то есть в вашем случае clean_bez



Офлайн

#5 Май 25, 2020 12:34:51

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Django raise forms.ValidationError не работает.

FishHook
gtlhbkkjВнимательно почитайте документацию.
Мне кажется что я именно так его и проверяю в forms.py
 if len(cleaned_bez) < 3:
            raise forms.ValidationError(_('PLEASE ENTER AT LEAST 3 CHARACTERS'))

а этот код в темплейте должен вроде вывести ошибку, но не выводит
         {% if form.bez.errors %}
            {% for error in form.bez.errors %}
            <div class="alert alert-warning" role-"alert">
                {{ error }}
            </div>
            {% endfor%}
        {% endif %}

из вьюхи эта ошибка выводится на терминал путем
 print(form.errors)
а в темплейт то ли не передается, то ли темплейтом не выводится. Как определить вообще во вьюхе, передается ли эта ошибка в темплейт? Как я могу Printом вывести в терминал этот контекст из вьюхи и посмотреть что в нем?
 return render(request, 'ael/start_page.html', context)

Отредактировано gtlhbkkj (Май 25, 2020 12:52:38)

Офлайн

#6 Май 25, 2020 12:52:39

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Django raise forms.ValidationError не работает.

gtlhbkkj
Мне кажется что я именно так его и проверяю в forms.py
Как по вашему, как Джанга дролжна догадаться, что ошибка принадлежит именно полю bez?

 raise forms.ValidationError(_('PLEASE ENTER AT LEAST 3 CHARACTERS'))
Здесь нет никой информации о том, что именно поле bez является источником ошибки.

Однако вот тут
 {% for error in form.bez.errors %}
вы пытаетесь извлечь ошибку именно из поля bez. Её там нет и ей там не откуда взяться.

 def clean_bez(self):
     data = self.cleaned_data['bez']
     raise forms.ValidationError("Ha-ha!")

вот теперь, Джанга знает с каким полем ассоциировать эксепшен.



Офлайн

#7 Май 25, 2020 13:20:48

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Django raise forms.ValidationError не работает.

FishHook
не смею спорить с солнцеликим.
 from django import forms
import re
from django.utils.translation import gettext_lazy as _
class SearchForm(forms.Form):
    bez = forms.CharField(max_length=40, label=_("Search condition / Cross-reference "), required=False)
    def clean(self):
        cleaned_data = super(SearchForm, self).clean()
        bez0 = cleaned_data.get('bez')
        cleaned_bez = re.sub('([^a-zA-Z0-9])',"", bez0)
        cleaned_bez = cleaned_bez.upper()
        cleaned_bez = cleaned_bez.replace("NBR","")
        if len(cleaned_bez) < 3:
            raise forms.ValidationError(_('PLEASE ENTER AT LEAST 3 CHARACTERS'))
        return(cleaned_bez)
     def clean_bez(self):
         data = self.cleaned_data['bez']
         raise forms.ValidationError("Ha-ha!")
Добавил в формз ваш кусочек. Тут же вывалились ошибки и ругань на вот эту строку
 cleaned_bez = re.sub('([^a-zA-Z0-9])',"", bez0)
которая рабочая.
не понимаю для чего вы в переменную data предложили загнать self.cleaned_data, если потом эта переменная не используется.
Не сомневаюсь что вы правы, но сосуд моей мудрости показывает дно.

Отредактировано gtlhbkkj (Май 25, 2020 13:21:18)

Офлайн

#8 Май 25, 2020 13:40:57

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Django raise forms.ValidationError не работает.

gtlhbkkj

gtlhbkkj
не понимаю для чего вы в переменную data предложили загнать self.cleaned_data
У меня нет цели писать за вас код. Я вам показал пример того, как это делается. Вы когда на почте заполняете бланк, вы же не копируете туда “Иванов Иван Иваныч” из примера?
Я вам дал ссылку вот эту
https://docs.djangoproject.com/en/3.0/ref/forms/validation/#cleaning-a-specific-field-attribute
вы её смотрели???



Офлайн

#9 Май 25, 2020 13:41:30

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Django raise forms.ValidationError не работает.

gtlhbkkj
И не надо кривляться, ладно?



Офлайн

#10 Май 25, 2020 13:44:05

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Django raise forms.ValidationError не работает.

FishHook
gtlhbkkjИ не надо кривляться, ладно?
ОК надеюсь всё получится. Благодарю вас

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version