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 или новее: она умеет показывать письма в режиме отладки.