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

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

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

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

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


gtlhbkkj
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.
FishHook
Не могу понять что у вас не получается, вот накидал такую тестовую страничку

 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>
gtlhbkkj
FishHook
Не могу понять что у вас не получается, вот накидал такую тестовую страничку

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

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


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


Благодарю вас за ваше терпение и за вашу поддержку.
Вы мне очень помогли.
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