Хостинг Django от «Джино»
Table of contents

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

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

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


Ищем Python программистов

Found misprint?
Select it with the mouse and hit Enter
Ctrl-Enter
Processed:
33 1 199 25


The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!

We are glad to hear your questions, comments or suggestions!
(Open in new tab)

Users number: 601

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

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
ЯМ:41001223475816


© 2008-2012 Ruslan Popov @ gmail.com Powered by Django 1.2.5