Простая проверка данных Django
Наш пример все еще слишком примитивен, особенно в части проверки данных; мы лишь проверяем, что поисковый запрос не пуст. Во многих HTML-формах производится гораздо более полная проверка данных. Все мы видели на сайтах такие сообщения об ошибках:
• Введите допустимый адрес электронной почты, ‘foo’ – недопустимый адрес.
• Введите правильный почтовый индекс США, состоящий из пяти цифр. ’123′ не является почтовым индексом.
• Введите дату в формате ДД.ММ.ГГГГ.
• Пароль должен содержать по меньшей мере 8 символов и хотя бы одну цифру.
Замечание о проверке с помощью JavaScript
Проверка данных с помощью JavaScript-сценария выходит за рамки настоящей книги, однако отметим, что данные можно проверять на стороне клиента, прямо в броузере. Но предупреждаем – даже в этом случае все равно необходимо проверять данные еще и на сервере. Некоторые пользователи отключают JavaScript, а злоумышленники иногда специально подсовывают некорректные данные непосредственно обработчику формы в надежде причинить вред.
Поскольку с этим ничего нельзя поделать, вы всегда обязаны проверять полученные от пользователя данные на сервере (то есть в функциях представления Django). Контроль с помощью JavaScript следует рассматривать как дополнительное средство, повышающее удобство работы, а не как единственный метод проверки правильности данных.
Давайте изменим представление search() и будем проверять, что длина поискового запроса составляет не более 20 символов. (Будем считать, что более длинные запросы выполняются слишком медленно.) Как это сделать? Проще всего включить проверку непосредственно в код представления:
def search(request): error = False if ‘q1 in request.GET: q = request.GET['q'] if not q:
error = True elif len(q) > 20: error = True else:
books = Book, objects.filter(title__icontains=q) return render_to_response(‘search_resuIts.html’, {‘books’: books, ‘query’: q}) return render_to_response(‘search_form.html’, {‘error’: error})
Если теперь отправить запрос длиной более 20 символов, то появится сообщение об ошибке. Но сейчас в шаблоне search_form.html текст сообщения звучит так: «Введите поисковый запрос», поэтому изменим его так, чтобы он был применим к обеим ситуациям (пустой или слишком длинный запрос):
<html> <head>
<title>floncK</title> </head> <body>
{% if error %}
<p style="color: red;">
Введите поисковый запрос не длиннее 20 символов.
</р> {% endif %}
<form actions’/search/" method="get"> <input type="text" name="q"> <input type="submit" уа1ие="Найти"> </form> </body> </html>
Но что-то здесь неправильно. Такое сообщение на все случаи жизни может сбить с толку. Зачем в сообщении о незаполненной форме упоминать об ограничении в 20 символов? Сообщение об ошибке должно ясно указывать на причину.
Проблема в том, что переменная error – булевская, а должна была бы содержать список строк с текстами сообщений. Вот как можно это исправить:
def search(request): errors = [] if ‘q’ in request.GET: q = request.GET['q'] if not q:
errors.append(BBeAHTe поисковый запрос.’) elif len(q) > 20:
errors.аррепй(Введите не более 20 символов.’) else:
books = Book.objects.filter(title__icontains=q) return render_to_response(‘search_resuIts.html’, {‘books’: books, ‘query’: q}) return render_to_response(‘search_form.html’, {‘errors’: errors})
И еще понадобится чуть подправить шаблон search_form.html, отразив тот факт, что мы передаем список errors, а не просто булевское значение
error:
<html> <head>
<title>nonCK</title> </head> <body>
{% if errors %} <ul>
{% for error in errors %} <li>{{ error }}</li> {% endfor %} </ul> {% endif %}
<form actions’/search/" method="get"> <input type="text" name="q"> <input type="submit" уа1ие="Найти"> </form> </body> </html>
Источник: Головатый А., Каплан-Мосс Дж. Django. Подробное руководство, 2-е издание. – Пер. с англ. – СПб.: Символ- Плюс, 2010. – 560 е., ил.
