Простая проверка данных Django

Опубликовал: Пятница, Январь 27, 2012 в категории 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 е., ил.

Похожие посты:

Комментировать

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>