вторник, 29 октября 2013 г.

Веб-форма средствами Django

В статье Простейшая форма на Django мы научились создавать и обрабатывать форму сложным путем, прописывая все детали. Там мы выяснили, что при большом количестве полей такой способ чреват ошибками. Поэтому сейчас мы научимся создавать форму обратной связи средствами Django, используя Django forms.


1. Создадим приложение feedback:
manage.py startapp feedback

2. Отредактируем главный файл роутов проекта testsite/urls.py:
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # ...
    url(r'^feedback/', include('feedback.urls')),
)

Здесь мы указали, что при обращении по адресу /feedback/ нужно загружать роуты приложения feedback.

3. Отредактируем роуты приложения, расположенные в feedback/urls.py:
from django.conf.urls import patterns, include, url

urlpatterns = patterns('',

    url(r'^$', 'feedback.views.feedback', name='feedback'),
)

Здесь мы при обращении по адресу /feedback/ будем вызывать функцию feedback() в представлении.

4. Определим функцию представления в feedback/views.py:
# -*- coding:utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from .forms import ContactForm

def feedback(request):
    if request.POST:
        form = ContactForm(request.POST)
        # Если форма прошла валидацию
        if form.is_valid():
            cd = form.cleaned_data
            # ... сохранение в базу, к примеру
            # здесь мы просто выведем результат на экран
            return HttpResponse( 
                'Name: %s, Email: %s, Message: %s' % 
                (cd['name'], cd['email'], cd['message']))
    else:
        form = ContactForm()
    return render(request, 'feedback.html', {'form': form})

Здесь мы импортируем объект нашей формы, создаем экземпляр класса формы и отправляем его в шаблон под именем form. Если форма будет отправлена, то request.POST будет содержать значения, на основе которых мы создадим экземпляр формы, проведем валидацию и используем "очищенные" данные, расположенные в form.cleaned_data

5. В Django принято формы создавать в файле forms.py внутри приложения. Создадим файл feedback/forms.py:
# -*- coding:utf-8 -*-

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(label='Имя')
    email = forms.EmailField(label='Почта', required=False)
    message = forms.CharField(label='Сообщение', widget=forms.Textarea)

Здесь мы определили ярлыки полей формы и указали, что поле email необязательное. Также мы изменили виджет для поля message, благодаря чему оно будет отображаться, как textarea.

6. Теперь создадим шаблон формы в feedback/templates/feedback.html
<!doctype html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Search</title>
</head>
<body>

    {% if form.errors %}
        <p style="color: red;">Пожалуйста, исправьте ошибки.</p>
    {% endif %}

    <form action="" method="post">
        {% for field in form %}
            <p>
                <label>{{ field.label }}</label><br />
                {{ field }}<br />
                {{ field.errors }}
            </p>
        {% endfor %}
        <input type="submit" value="Отправить">
         {% csrf_token %}
    </form>
</body>
</html>

Удобно! Для вывода полей формы мы использовали {{ form }}. И нам не потребовалось заботиться об определении каждого поля в виде html. Django сделал это за нас! При этом
{{ field.label }} - содержит ярлык, а {{ form }} - html поля ввода.

7. Чтобы шаблон определялся, нужно добавить путь к папке с шаблонами приложения в testsite/settings.py:
TEMPLATE_DIRS = (
    # ...
    'feedback/templates',
)

8. Теперь можно перейти по адресу /feedback/ и увидеть форму, созданную средствами Django:
Вы можете скачать и посмотреть, как работает форма на Django:
Скачать Django-проект урока

Комментариев нет:

Отправить комментарий