Нашли опечатку?

Выделите её мышкой и нажмите Enter

Ctrl-Enter
Выполнено:
89 1 199 25
Всего пользователей: 1236

Внимание!

Книга написана для очень старой версии Django. Надеемся автор обновит ее и мы сможешь обновить перевод.
Пока советуем читать перевод официальной документации.

Используем формы в представлениях

Вот так можно переписать наше представление contact(), обладая базовыми знаниями о классе Form.

Файл views.py:

from django.core.mail import send_mail
from django.shortcuts import render_to_response
from mysite.books.forms import ContactForm

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            send_mail(
                cd['subject'],
                cd['message'],
                cd.get('email', 'noreply@example.com'),
                ['siteowner@example.com'],
            )
            return HttpResponseRedirect('/contact/thanks/')
    else:
        form = ContactForm()
    return render_to_response('contact_form.html', {'form': form})

Файл contact_form.html:

<html>
<head>
    <title>Contact us</title>
</head>
<body>
    <h1>Contact us</h1>

    {% if form.errors %}
        <p style="color: red;">
            Please correct the error{{ form.errors|pluralize }} below.
        </p>
    {% endif %}

    <form action="" method="post">
        <table>
            {{ form.as_table }}
        </table>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

Посмотрите, как много ненужного можно убрать! Библиотека выполняет вывод формы, её проверку, конвертацию данных и повторное отображение формы в случае ошибок.

Попробуйте запустить это локально. Загрузите форму, отправьте её без данных, отправьте её с неправильным адресом электронной почты, затем заполните её правильными данными и отправьте. (Конечно, в зависимости от конфигурации вашего почтового сервера, вы можете получить ошибку при вызове send_mail, но это уже другая история.)

strider
strider 1 год, 11 месяцев прошло
Ответ | Ссылка

Первой мыслью возникает "а как же моё уютненькое
<textarea name="message" rows="10" cols="50">
куда же оно делось? Такое некрасивое message = forms.Charfield()"
Сразу гуглы, ModelForm, Textarea, стресс...

sva
sva 11 месяцев прошло
Ответ | Ссылка

если по книге - то сообщает
> Forbidden (403)
> CSRF verification failed. Request aborted.

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ref-contrib-csrf

работает, если в форме добавить
{% csrf_token %}
а в view
return render_to_response('contact_form.html', {'form': form},context_instance=RequestContext(request))

sva
sva 11 месяцев прошло
Ответ | Ссылка

упустил -- версия 1.4

Einar
Einar 5 месяцев, 4 недели прошло
Ответ | Ссылка

Ответ на strider
Первой мыслью возникает "а как же моё уютненькое
<textarea name="message" rows="10" cols="50">
куда же оно делось? Такое некрасивое message = forms.Charfield()"
Сразу гуглы, ModelForm, Textarea, стресс...

А при чем тут ModelForm? <textarea> сделать просто: message = forms.CharField(widget=forms.widgets.Textarea()), для 1.4 работает

Nule
Nule 5 дней, 11 часов прошло
Ответ | Ссылка

Не работает конструкция {% if form.errors %}

rad
rad 5 дней прошло
Ответ | Ссылка

Вы просто её готовить не умеете.
P.S. С вопросами на форум.