Перейти к содержимому

Django модуль с нуля

Практический пример: напишем модуль обратной связи для Django и разберём каждый шаг, от создания проекта до отправки почты.

Для тех, кто знаком с Django, эта часть может показаться скучной, поэтому смело пролистывайте её. Мы пишем для тех, кто только интересуется, что за инструмент такой Django.

Мы подразумеваем, что вы знакомы с Python и прочитали вводное руководство по Django, а ваша операционная система это Ubuntu. Почему Ubuntu? На сегодняшний день эта система очень активно развивается, а система на базе Debian весьма удобна для веб разработчика.

Итак, установите Django в качестве системной библиотеки. Это не обязательно, но тогда у вас в консоли появится утилита для работы с проектами. С её помощью можно создавать шаблоны проектов и модулей, этим сейчас и займёмся.

Создание проекта

Прежде всего нужен проект, для которого мы бы написали модуль. Создадим пустой проект стандартной командой Django. В результате появится пустой проект в папке myproject со следующими файлами:

__init__.py  manage.py  settings.py  urls.py

Настроим проект с минимальным функционалом, нам нужно будет лишь проверить работу тэга для шаблонов. В settings.py мы прописали настройки базы данных и путь к папке с шаблонами:

from os.path import abspath, dirname, join

DATABASE_ENGINE = 'sqlite3'

TEMPLATE_DIRS = (
    join(dirname(abspath(__file__)), 'templates')
)

Создание модуля

Мы будем писать модуль обратной связи. Работа модуля будет состоять в отображении формы обратной связи с настраиваемыми полями. Форма отправляет сообщения прямиком менеджерам на электронную почту. Откровенно говоря, мы его уже написали, но будем честно выполнять все шаги вместе с читателем.

В папке проекта запустите ещё раз команду создания приложения, чтобы создать шаблон модуля:

$ python manage.py startapp feedback

Выполненная команда должна создать папку feedback:

__init__.py  models.py  tests.py  views.py

Моделей мы делать не будем, так как наша форма будет только отправлять почту с сайта. В модуле будет одно представление, которое обрабатывает POST запросы из формы, сама форма и немного javascript.

Начнём с формы:

from django import forms
from django.conf import settings
from django.template.loader import render_to_string

class FeedbackForm(forms.Form):
    email = forms.CharField(label='Email', max_length=200)
    topic = forms.CharField(label='Topic', max_length=200)
    response = forms.CharField(
        label='Response text', max_length=500,
        widget=forms.Textarea(attrs={'rows': 5, 'cols': 30}))

Напишем представление:

from django.core.urlresolvers import reverse
from django.shortcuts import render_to_response
from feedback.forms import FeedbackForm

def show_feedback_form(request):
    if request.method == 'POST':
        form = FeedbackForm(request.POST)
        if form.is_valid():
            return render_to_response('thankyou.html', {'form': form})
    else:
        form = FeedbackForm()
    return render_to_response('index.html', {'form': form})

Создадим шаблон index.html:

<h1>Hello!</h1>
<form action="." method="post">
{{ form.as_ul }}
<input type="submit" />
</form>

И шаблон thankyou.html:

<h1>Thank you for reply!</h1>

Установка модуля

Теперь модуль нужно установить в проект. Для этого пропишите модуль в settings.py в списке INSTALLED_APPS:

INSTALLED_APPS = (
    'feedback',
)

И пропишите адрес представления в urls.py:

urlpatterns = patterns('',
    (r'^$', 'feedback.views.show_feedback_form'),
)

Отправка почты

Теперь мы хотим, чтобы форма отправляла почту. Добавим ей метод send_mail:

from django.core.mail import mail_managers

class FeedbackForm(forms.Form):
    def send_mail(self):
        context = {'fields': {}}
        for name, field in self.fields.iteritems():
            context['fields'][name] = self.cleaned_data.get(name, None)
        message = render_to_string('feedback_message.txt', context)
        subject = settings.EMAIL_SUBJECT_PREFIX + 'feedback'
        mail_managers(subject, message, fail_silently=False)

В представлении добавим после валидации отправку почты:

def show_feedback_form(request):
    if request.method == 'POST':
        form = FeedbackForm(request.POST)
        if form.is_valid():
            form.send_mail()
            return render_to_response('thankyou.html', {'form': form})
    else:
        form = FeedbackForm()
    return render_to_response('index.html', {'form': form})

На этом всё, у нас есть форма для обратной связи, которой даже можно пользоваться.

Дальнейшее развитие

Само собой, в этом модуле есть что улучшить:

  • мы сделали шаблонный тэг для отображения формы обратной связи;
  • страница с благодарностью за отзыв загружается с помощью AJAX;
  • в форму обратной связи можно добавить свои поля.

Мы попытались написать про все эти улучшения, но статья получилась слишком большой для новичков и слишком скучной для опытных разработчиков. Поэтому кому интересно, смотрите репозиторий на гитхабе.

Примечание

У вас всё заработает, если вы действительно можете отправлять почту и у вас настроен почтовый сервер. В противном случае установите Django 1.2 или новее: она умеет показывать письма в режиме отладки.