Форум сайта python.su
Прошу помощи.
при вводе в форму слова размером меньше три символа должна появляться 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)
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)
Офлайн
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)
Офлайн
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)
Офлайн
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
Офлайн
FishHookМне кажется что я именно так его и проверяю в forms.py
gtlhbkkjВнимательно почитайте документацию.
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)
return render(request, 'ael/start_page.html', context)
Отредактировано gtlhbkkj (Май 25, 2020 12:52:38)
Офлайн
gtlhbkkjКак по вашему, как Джанга дролжна догадаться, что ошибка принадлежит именно полю bez?
Мне кажется что я именно так его и проверяю в forms.py
raise forms.ValidationError(_('PLEASE ENTER AT LEAST 3 CHARACTERS'))
{% for error in form.bez.errors %}
def clean_bez(self): data = self.cleaned_data['bez'] raise forms.ValidationError("Ha-ha!")
Офлайн
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)
Отредактировано gtlhbkkj (Май 25, 2020 13:21:18)
Офлайн
gtlhbkkj
gtlhbkkjУ меня нет цели писать за вас код. Я вам показал пример того, как это делается. Вы когда на почте заполняете бланк, вы же не копируете туда “Иванов Иван Иваныч” из примера?
не понимаю для чего вы в переменную data предложили загнать self.cleaned_data
Офлайн
gtlhbkkj
И не надо кривляться, ладно?
Офлайн
FishHookОК надеюсь всё получится. Благодарю вас
gtlhbkkjИ не надо кривляться, ладно?
Офлайн