Как и в предыдущих главах, мы показали вам самый простой пример. Теперь рассмотрим некоторые проблемы и покажем как их можно решить.
Во-первых, наша обработка пустой строки в
search() слишком примитивна — мы
просто отображаем сообщение «Please submit a search term.», требуя от пользователя воспользоваться кнопкой
Назад. Это неприятно и непрофессионально,
и если вы попробуете сделать такое в реальном приложении, вас
отлучат от Django.
Гораздо лучше будет отобразить форму снова, вывести сообщение об ошибке над ней — пользователь сможет немедленно исправить её и сразу отправить данные. Простейшим способом сделать это является повторная обработка шаблона, вот так:
from django.http import HttpResponse
from django.shortcuts import render_to_response
from mysite.books.models import Book
def search_form(request):
return render_to_response('search_form.html')
def search(request):
if 'q' in request.GET and request.GET['q']:
q = request.GET['q']
books = Book.objects.filter(title__icontains=q)
return render_to_response('search_results.html',
{'books': books, 'query': q})
else:
return render_to_response('search_form.html', {'error': True})
(Отметьте, что мы включили сюда
search_form(), чтобы вы могли видеть оба
представления вместе.)
Итак, мы доработали search() для повторного
отображения шаблона search_form.html, если
запрос будет пустым. А раз нам необходимо отображать сообщение
об ошибке в шаблоне, мы передали шаблонную переменную. Теперь мы
может отредактировать search_form.html,
добавив проверку наличия переменной error:
<html>
<head>
<title>Search</title>
</head>
<body>
{% if error %}
<p style="color: red;">Please submit a search term.</p>
{% endif %}
<form action="/search/" method="get">
<input type="text" name="q">
<input type="submit" value="Search">
</form>
</body>
</html>
Мы по-прежнему можем использовать этот шаблон из нашего
оригинального представления, search_form(),
так как оно не передаёт error в шаблон — следовательно, сообщение об ошибке не будет
отображаться.
Учитывая сделанные изменения, появляется вопрос: действительно
ли мы нуждаемся в представлении
search_form()? Действительно, запрос к URL
/search/ (без параметров GET)
отобразит пустую форму (но с ошибкой). Мы можем удалить
представление search_form() вместе с
соответствующей строкой в схеме URL, останется только изменить
search() так, чтобы оно не выдавало
сообщение об ошибке, если кто-то зайдёт по этому URL без
указания GET параметров:
def search(request):
error = False
if 'q' in request.GET:
q = request.GET['q']
if not q:
error = True
else:
books = Book.objects.filter(title__icontains=q)
return render_to_response('search_results.html',
{'books': books, 'query': q})
return render_to_response('search_form.html',
{'error': error})
Теперь, если пользователь посетит /search/ без
указания GET параметров, он увидит поисковую
форму без сообщения об ошибке. Если пользователь передаст форму
с пустым значением q, он увидит форму
c сообщением об ошибке. И, наконец, если
пользователь передаст форму с непустым значением
q, он увидит результаты выполнения поискового
запроса.
Мы можем сделать финальное улучшение этого приложения, удалим избыточность. После свёртывания двух представлений в единое стало необязательным указывать URL, по которому надо отправлять данные формы. Вместо строки:
<form action="/search/" method="get">
можно писать так:
<form action="" method="get">
Параметр action="" означает «Отправь форму по URL текущей страницы.» Учитывая это изменение, больше не требуется изменять action при переходе формы на другой URL.
| Пред. | Уровень выше | След. |
| Пример обработки простой формы | Начало | Простая проверка данных |
0 comments | Make a comment