|
Table of contents
|
Продолжая наш пример с книгами, авторами и издателями, давайте создадим простое представление, которое позволит пользователям производить поиск по нашей базе книг по их названию. Обычно, разработка форм подразумевает два шага: пользовательский интерфейс в HTML и код сопровождающего представления, которое обрабатывает переданные данные. Первый шаг несложен. Давайте создадим представление, которое отображает поисковую форму: from django.shortcuts import render_to_response
def search_form(request):
return render_to_response('search_form.html')
Как мы уже говорили в главе «Представления и привязки URL», представление может
располагаться где угодно, пока оно находится через
PYTHONPATH. Для порядка разместим его в
Соответствующий шаблон, <html>
<head>
<title>Search</title>
</head>
<body>
<form action="/search/" method="get">
<input type="text" name="q">
<input type="submit" value="Search">
</form>
</body>
</html>
Схема URL в from mysite.books import views
urlpatterns = patterns('',
# ...
(r'^search-form/$', views.search_form),
# ...
)
(Следует отметить, что мы импортируем модуль views напрямую, а не указываем from mysite.views import search_form, поскольку первый метод более краток. Мы рассмотрим этот механизм импортирования более подробно в главе «Усовершенствованные представления и схемы URL».) Если вы запустите runserver и посетите http://127.0.0.1:8000/search-form/, вы увидете поисковый интерфейс. Очень простой. Попробуйте отправить форму, несмотря на то, что вы получите ошибку 404. Форма указывает на URL /search/, обработчик которого ещё не был реализован. Давайте это исправим с помощью второй функции представления: # urls.py
urlpatterns = patterns('',
# ...
(r'^search-form/$', views.search_form),
(r'^search/$', views.search),
# ...
)
# views.py
def search(request):
if 'q' in request.GET:
message = 'You searched for: %r' % request.GET['q']
else:
message = 'You submitted an empty form.'
return HttpResponse(message)
На данный момент, этот код просто отображает пользовательский ввод, таким образом мы можем удостовериться, что данные были переданы корректно и вы можете увидеть как работает поисковая система. Если кратко:
Обратите внимание, мы явно проверяем существование переменной
# BAD!
def bad_search(request):
# The following line will raise KeyError if 'q' hasn't
# been submitted!
message = 'You searched for: %r' % request.GET['q']
return HttpResponse(message)
Параметры строки запросаТак как GET данные передаются в строке запроса (т.е., /search/?q=django), вы можете использовать request.GET для доступа к переменным, переданным в этой строке. В главе «Представления и привязки URL» при ознакомлении со схемой URL, мы сравнивали подход Django к формированию URL с традиционными PHP/Java URL, например, /time/plus?hours=3 и обещали вернуться к этому в этой главе. Теперь вы знаете как получать доступ к параметрам строки запроса в ваших представлениях — просто используйте request.GET.
POST данные обрабатываются аналогично GET — только используйте request.POST вместо request.GET. Какая разница существует между GET и POST? Используйте GET в случаях, когда форма используется для «получения» данных[9]. Используйте POST при обработке форм, которая имеет побочный эффект — изменение данных или при отправке электронных сообщений, в общем для всего, что лежит вне задачи простого отображения данных. В нашем примере мы используем GET, так как запрос не изменяет данные на сервере. (Обратитесь к http://www.w3.org/2001/tag/doc/whenToUseGet.html, если вы желаете узнать больше о GET и POST).
После того как мы проверили переданные данные, давайте
используем их для поиска по базе данных (и снова, в
from django.http import HttpResponse
from django.shortcuts import render_to_response
from mysite.books.models import Book
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 HttpResponse('Please submit a search term.')
Остановимся и опишем, что мы сделали:
|
Found misprint?
Select it with the mouse and hit 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 |
reply to misha.panyushkin
значит, запятая в конце одно элементного кортежа не нужна?
return render_to_response('search_form.html')
Нужна, но с чего вы взяли что там должен быть кортеж: http://docs.djangoproject.com/en/1.3/topics/http/shortcuts/#render-to-response
reply to alerion
Да нет, вроде все правильно
значит, запятая в конце одно элементного кортежа не нужна?
return render_to_response('search_form.html')
reply to misha.panyushkin
здравствуйте,
в самом начале, Вы забыли о том, что render_to_response принимает кортеж! пропущена запятая в конце одно элементного кортежа!
def search_form(request):
return render_to_response('search_form.html',)
Да нет, вроде все правильно
здравствуйте,
в самом начале, Вы забыли о том, что render_to_response принимает кортеж! пропущена запятая в конце одно элементного кортежа!
def search_form(request):
return render_to_response('search_form.html',)
reply to alerion
Или просто request.GET.get('q')
if request.GET.get('q') <> None:
Вот так отрабатывает правильно в обоих случаях.
В других не отрабатывается пустая строка из-за "?q".
reply to kibarabara
При "if request.GET['q']:" и отстуствии ?q будет исключение KeyError.
Именно поэтому ниже идет написано:
if 'q' in request.GET and request.GET['q']:
Или просто request.GET.get('q')
reply to nazavrik
В коде:
if 'q' in request.GET:
message = 'You searched for: %r' % request.GET['q']
else:
message = 'You submitted an empty form.'
есть две баги.
1. При пустом запросе мы будем получать true (/search/?q=). Нужно исправить:
if request.GET['q']:
message = 'You searched for: %r' % request.GET['q']
else:
message = 'You submitted an empty form.'
2. Запрос юникодной строки будет выводить не символы, а коды символов. Нужно изменить формат вывода:
message = 'You searched for: %s(!)' % request.GET['q']
При "if request.GET['q']:" и отстуствии ?q будет исключение KeyError.
Именно поэтому ниже идет написано:
if 'q' in request.GET and request.GET['q']:
В коде:
if 'q' in request.GET:
message = 'You searched for: %r' % request.GET['q']
else:
message = 'You submitted an empty form.'
есть две баги.
1. При пустом запросе мы будем получать true (/search/?q=). Нужно исправить:
if request.GET['q']:
message = 'You searched for: %r' % request.GET['q']
else:
message = 'You submitted an empty form.'
2. Запрос юникодной строки будет выводить не символы, а коды символов. Нужно изменить формат вывода:
message = 'You searched for: %s(!)' % request.GET['q']
Для вопросов создан форум.
По делу: у вас проблемы с кодировками.
def search(request):
if 'q' in request.GET:
message = 'You searched for: %r' % request.GET['q']
else:
message = 'You submitted an empty form.'
return HttpResponse(message)
Если захочу в переменную message вводить на русском к примеру
message = 'Вы искали : %r' % request.GET['q']
то мне выводится этот текст в виде
�� ������
Как это исправить?
так же когда ищу на русском, то в выводятся не буквы а их код, к примеру ввел в поиск "джанго" , на странице пишется вместо "Вы искали: джанго"
�� ������ u'\u0434\u0436\u0430\u043d\u0433\u043e'
Надо использовать {{ csrf_token }} в формах:
http://docs.djangoproject.com/en/1.2/topics/forms/#displaying-a-form-using-a-template
Forbidden (403)
CSRF verification failed. Request aborted.
Help
Reason given for failure:
CSRF token missing or incorrect.
Я поменял GET на POST а оно мне вот ошибку, что это может быть??
Задайте свой вопрос более развёрнуто на форуме.
Подскажите, как сделать чтоб строка ввода (input) переводилась в unicode ?