|
Table of contents
|
Несмотря на то, что мы несколько раз изменяли форму поиска по
книгам и значительно её улучшили, она осталась достаточно
простой: просто одно поле, Это будет форма, которая позволит пользователям отправлять отклик, с необязательным указанием своего адреса электронной почты. После передачи данных формы и их проверки, мы автоматически отправим сообщение по электронной почте сотрудникам сайта.
Начнём с шаблона, <html>
<head>
<title>Contact us</title>
</head>
<body>
<h1>Contact us</h1>
{% if errors %}
<ul>
{% for error in errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
<form action="/contact/" method="post">
<p>Subject: <input type="text" name="subject"></p>
<p>Your e-mail (optional): <input type="text" name="email"></p>
<p>Message: <textarea name="message" rows="10" cols="50"></textarea></p>
<input type="submit" value="Submit">
</form>
</body>
</html>
Мы определили три поля: заголовок, адрес электронной почты и
сообщение. Второе поле необязательное. Следует отметить, что мы
используем method="post", так как форма имеет побочный эффект — она отправляет сообщение. Также мы
скопировали код, отвечающий за отображение ошибки из нашего
предыдущего шаблона
Если продолжать методику, начатую при работе с нашим
представлением from django.core.mail import send_mail
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
def contact(request):
errors = []
if request.method == 'POST':
if not request.POST.get('subject', ''):
errors.append('Enter a subject.')
if not request.POST.get('message', ''):
errors.append('Enter a message.')
if request.POST.get('email') and '@' not in request.POST['email']:
errors.append('Enter a valid e-mail address.')
if not errors:
send_mail(
request.POST['subject'],
request.POST['message'],
request.POST.get('email', 'noreply@example.com'),
['siteowner@example.com'],
)
return HttpResponseRedirect('/contact/thanks/')
return render_to_response('contact_form.html',
{'errors': errors})
(Если вы сразу проверяете наш код в действии, вы можете
заинтересоваться зачем размещать это представление в файле
Рассмотрим отличия:
Данное представление работает, но представьте, что вам придётся обработать форму с дюжиной полей. Вы действительно желаете самостоятельно расписывать проверки для каждого поля? Следующей проблемой является повторное отображение формы. В случае возникновения ошибок при проверке полей, лучше всего будет отобразить форму повторно, внеся в поля переданные данные, так пользователь сможет увидеть, что именно он сделал неправильно (и также ему не потребуется вводить эти данные повторно). Мы можем вручную передать POST данные обратно в шаблон, но нам потребуется отредактировать каждое HTML поле для вставки соответствующего значения на соответствующее место. views.py: def contact(request):
errors = []
if request.method == 'POST':
if not request.POST.get('subject', ''):
errors.append('Enter a subject.')
if not request.POST.get('message', ''):
errors.append('Enter a message.')
if request.POST.get('email') and '@' not in request.POST['email']:
errors.append('Enter a valid e-mail address.')
if not errors:
send_mail(
request.POST['subject'],
request.POST['message'],
request.POST.get('email', 'noreply@example.com'),
['siteowner@example.com'],
)
return HttpResponseRedirect('/contact/thanks/')
return render_to_response('contact_form.html', {
'errors': errors,
'subject': request.POST.get('subject', ''),
'message': request.POST.get('message', ''),
'email': request.POST.get('email', ''),
})
contact_form.html: <html>
<head>
<title>Contact us</title>
</head>
<body>
<h1>Contact us</h1>
{% if errors %}
<ul>
{% for error in errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
<form action="/contact/" method="post">
<p>Subject: <input type="text" name="subject" value="{{ subject }}"></p>
<p>Your e-mail (optional): <input type="text" name="email" value="{{ email }}"></p>
<p>Message: <textarea name="message" rows="10" cols="50">**{{ message }}**</textarea></p>
<input type="submit" value="Submit">
</form>
</body>
</html>
Этот подход очень трудоёмкий и привносит множество возможностей для ошибки. Мы надеемся, что вы начали искать возможность воспользоваться некой высокоуровневой библиотекой, которая будет выполнять такие формо-проверочные задачи. |
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 |
Для версии 1.3.1 подключить:
from django.template.response import TemplateResponse
и заменить:
return render_to_response('contact_form.html', {....})
на:
return TemplateResponse(request ,'contact_form.html', {....})
>{% csrf_token %} - добавил
>'django.middleware.csrf.CsrfViewMiddleware', - расскоментировал
Вопросы - на форуме.
reply to multlurk
так... все предыдущие главы читались запоем и трудностей не возникало. через эту же пробиться не могу.
вопрос: что я должен сделать, чтоб примеры из этой главы заработали на тестовом сервере django 1.2.5?
из комментариев не понял, что для какой версии нужно прописывать и для какой версии джанго эта глава писалась.
вообще за книгу огромное спасибо
и за будущий ответ на мой вопрос тоже :)
Добавить {% csrf_token %} в тело формы.
да... и интересно, как по разумению авторов сейчас должна выглядеть urls.py (ведь пока-что усовершенствованные схемы урлов не изучали ) :)
особенно интересуют импорты (учитывая последовательность обучения)
так... все предыдущие главы читались запоем и трудностей не возникало. через эту же пробиться не могу.
вопрос: что я должен сделать, чтоб примеры из этой главы заработали на тестовом сервере django 1.2.5?
из комментариев не понял, что для какой версии нужно прописывать и для какой версии джанго эта глава писалась.
вообще за книгу огромное спасибо
и за будущий ответ на мой вопрос тоже :)
К тому же render_to не кошерный декоратор - меняет формат ответа.
Там теперь [TemplateResponse](http://docs.djangoproject.com/en/dev/ref/template-response/). Про декоратор render_to можно забыть навсегда.
reply to strider
Учитывая, что в примерах используется render_to_response, стоит добавить, из-за использования в нем Context по умолчанию, решением будет не только добавление мидлвара в настройках, {% csrf_token %} в форму в шаблоне, но и
from django.template import RequestContext, а также затем и дополнительного аргумента в render_to_response - context_instance=RequestContext(request)
Вы правы. Можно использовать django.views.generic.simple.direct_to_template. Не уверен что в осталось 1.3, но там точно есть аналог.
reply to alerion
В 1.2.* нужны. Это глава о старой версии.
Учитывая, что в примерах используется render_to_response, стоит добавить, из-за использования в нем Context по умолчанию, решением будет не только добавление мидлвара в настройках, {% csrf_token %} в форму в шаблоне, но и
from django.template import RequestContext, а также затем и дополнительного аргумента в render_to_response - context_instance=RequestContext(request)
reply to solyony
error at /contact/
(10061, 'Connection refused')
Почему оно может не отправлять сообщения и как это можна исправить??
Для вопросов создан форум.
error at /contact/
(10061, 'Connection refused')
Почему оно может не отправлять сообщения и как это можна исправить??
reply to tv
стоило бы упомянуть, что (как минимум в 1.2.4) для POST-форм нужны доп. телодвижения: "CSRF verification failed. Request aborted."
Решение - добавить в настройки миддлевари 'django.middleware.csrf.CsrfResponseMiddleware'.
В 1.2.* нужны. Это глава о старой версии.
стоило бы упомянуть, что (как минимум в 1.2.4) для POST-форм нужны доп. телодвижения: "CSRF verification failed. Request aborted."
Решение - добавить в настройки миддлевари 'django.middleware.csrf.CsrfResponseMiddleware'.
url.py
...
(r'^contact/thanks/$', views.contact_thanks),
...
book/views.py
def contact_thanks(request):
return render_to_response('thanks.html')
thanks.html
<html>
<body>
Большое спасибо за контакты.
</body>
</html>
должна работать.
Может пришлёте патч на книгу? Нам бы пригодилась ваша помошь.
обработки "/contact/thanks/" нету?
в оригинале нету, но можно было хотя бы сказать об этом.