Найти - Пользователи
Полная версия: Django raise forms.ValidationError не работает.
Начало » Python для новичков » Django raise forms.ValidationError не работает.
1 2
gtlhbkkj
Прошу помощи.
при вводе в форму слова размером меньше три символа должна появляться 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)

спасибо
Romissevd
  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)
gtlhbkkj
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 %}
FishHook
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
gtlhbkkj
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)
FishHook
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!")

вот теперь, Джанга знает с каким полем ассоциировать эксепшен.
gtlhbkkj
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, если потом эта переменная не используется.
Не сомневаюсь что вы правы, но сосуд моей мудрости показывает дно.
FishHook
gtlhbkkj
gtlhbkkj
не понимаю для чего вы в переменную data предложили загнать self.cleaned_data
У меня нет цели писать за вас код. Я вам показал пример того, как это делается. Вы когда на почте заполняете бланк, вы же не копируете туда “Иванов Иван Иваныч” из примера?
Я вам дал ссылку вот эту
https://docs.djangoproject.com/en/3.0/ref/forms/validation/#cleaning-a-specific-field-attribute
вы её смотрели???
FishHook
gtlhbkkj
И не надо кривляться, ладно?
gtlhbkkj
FishHook
gtlhbkkjИ не надо кривляться, ладно?
ОК надеюсь всё получится. Благодарю вас
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB