Уведомления

Группа в Telegram: @pythonsu

#1 Май 25, 2020 13:58:18

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

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

FishHook
gtlhbkkj
вроде изначально было сделано именно так как вы пишете и как указано в документации

 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)

то есть требуемое поле очищается, нормализуется и проверяется на условия.
Если длина очищенного поля меньше трех символов - то вызвать ошибку.
Эта ошибка вызывается и вьюха ее видит в переменной form.errors и при желании печатает эту ошибку в терминале.
Значит эта ошибка передается в контекстной переменной в темплейт, который ее уже почему-то не видит.

 def search_form(request):
    if request.method == 'POST':
        form = SearchForm(request.POST)
        context = {'form':SearchForm}
        print(form.errors)
        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 (Май 25, 2020 14:00:57)

Офлайн

#2 Май 25, 2020 14:13:24

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

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

Вы сами себя то слышите или нет?

Цитирую

Эта ошибка вызывается и вьюха ее видит в переменной form.errors

а теперь ваш код

  {% for error in form.bez.errors %}




Офлайн

#3 Май 25, 2020 15:43:34

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

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

FishHook
Вы сами себя то слышите или нет?Цитирую
вы правы, конечно, естественно что я в темплейте также пробовал искать ошибку ValidationError и в
 {{form.errors}}
, но и там ее нет

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

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

Офлайн

#4 Май 25, 2020 16:37:34

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

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

Не могу понять что у вас не получается, вот накидал такую тестовую страничку

 from django.shortcuts import render_to_response
from django import forms
class MyForm(forms.Form):
    name = forms.CharField(label='Name')
    age = forms.IntegerField(label='Age')
    def clean(self):
        data = super(MyForm, self).clean()
        raise forms.ValidationError('Common error')
        return data
    def clean_age(self):
        age = self.cleaned_data['age']
        raise forms.ValidationError('Error in age')
        return age
    def clean_name(self):
        name = self.cleaned_data['name']
        raise forms.ValidationError('Error in name')
        return name
def index(request):
    form = MyForm(data={'age': 10, 'name': 'Ivanushka'}, initial={'age': 10, 'name': 'Ivanushka'})
    form.is_valid()
    print form.errors
    return render_to_response('index.html', {'form': form})

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .non-field-errors {
            display: block;
            background-color: coral;
            color: wheat;
        }
        .field-errors {
            display: block;
            background-color: bisque;
            color: blue;
        }
        .field {
            display: block;
        }
    </style>
</head>
<body>
  {% if form.non_field_errors %}
    <div class="non-field-errors">
        {% for err in form.non_field_errors %}
          <p class="form-error">{{ err }}</p>
        {% endfor %}
    </div>
    <hr>
    <div class="field">
        {{form.age}}
    </div>
    {% for error in form.age.errors %}
        <div class="field-errors">
           {{ error }}
        </div>
    {% endfor %}
    <hr>
    <div class="field">
        {{form.name}}
    </div>
    {% for error in form.name.errors %}
        <div class="field-errors">
          {{ error }}
        </div>
    {% endfor %}
{% endif %}
</body>
</html>



Офлайн

#5 Май 25, 2020 17:03:06

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

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

FishHook
Не могу понять что у вас не получается, вот накидал такую тестовую страничку

глупая непростительная ошибка была. Отловил вдруг.

раньше было неправильно вот так


стало правильно вот так


Благодарю вас за ваше терпение и за вашу поддержку.
Вы мне очень помогли.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version