Главная | Архив новостей | Общение | Площадка | Примеры OpenID
Хостинг Django от «Джино»
Оглавление

Усовершенствование примера обработки простой формы

Как и в предыдущих главах, мы показали вам самый простой пример. Теперь рассмотрим некоторые проблемы и покажем как их можно решить.

Во-первых, наша обработка пустой строки в 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.


Увидели ошибку?
Выделите её мышкой и нажмите
Ctrl-Enter
Обработано:
1049 49 130 71

Версия книги
1.0 2.0
Версия 2.0 в процессе перевода!

Мой луч
Многообразие света

Полезное
Актуальные вакансии, Python работа для python-разработчиков.


Скачать в формате
CHM от 2 сентября

Заказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта.
Чем чаще заказываете — тем больше перевожу.

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
R130494980980
Z425285133788
E112528079659
U327380922061

Книга помогла реализовать:
Проект «Мой луч»
АРМ УФМС.


Мой вебсайт стоит666 337,31 руб

© 2008-2009 Ruslan Popov @ gmail.com Powered by Django 1.1 beta 1 SVN-11114
Главная | Архив новостей | Общение | Площадка | Примеры OpenID