Должен ли я размещать пользовательский регистрационный код в представлениях, моделях или менеджерах?
Я запускаю свой собственный модуль регистрации в Django на основе django.contrib.auth
, Мой регистрационный модуль будет иметь некоторые дополнительные функции и поможет мне уменьшить мою зависимость от других модулей django, которые я сейчас использую, таких как django-registration и django-emailchange. Я столкнулся с проблемой "что делать лучше всего".
Примечание. Все учетные записи пользователей основаны на django.contrib.auth.models.User
модель.
Когда пользователь нажимает ссылку "зарегистрироваться", запрос передается в мое представление с именем register
, У меня есть пользовательская форма, которая имеет четыре поля - имя пользователя, адрес электронной почты, пароль1 и пароль2. Форма основана на django.forms.Form
, Форма обеспечивает базовую проверку, например, passoword1 и password2 - это электронная почта; адрес электронной почты / имя пользователя не существует.
Когда данные возвращаются в мой регистр, я вызываю is_valid()
метод формы, после которого я создаю нового пользователя, вызывая метод Manager с именем create_user()
в django.contrib.auth.models.UserManager
, На этом этапе мне нужно добавить больше пользовательских функций, таких как отправка электронных писем об активации и т. Д. В качестве метода наилучшей практики, где должна быть эта логика? Должно ли это быть в методе User
Модель? Должен ли он быть там, где он сейчас - менеджер модели? Или это должно быть помещено в обычай save()
метод моей формы регистрации?
Благодарю.
2 ответа
В отличие от Криса, я верю в философию толстых моделей, тонких взглядов.
Чем больше кода вы можете включить в модели, тем больше будет возможность использовать ваш код. Проблемы представлений должны заключаться в простом управлении циклом запроса / ответа и работе с параметрами GET/POST.
В этом случае отправка электронных писем активации связана с событием создания нового пользователя. Для этих случаев Django уже предоставляет эту абстракцию через сигналы.
http://docs.djangoproject.com/en/1.2/topics/signals/
Так, например, вы можете иметь в своем models.py:
from django.contrib.models import User
from django.db.models.signals import post_save
def send_welcome_email(self):
# Reusable email sending code
User.send_welcome_email = send_welcome_email
def welcome_emails(sender, instance, created, **kwargs):
if created:
instance.send_welcome_email() # `instance` is User
post_save.connect(welcome_emails, sender=User)
Точно так же вы можете иметь это, когда пользователь удаляется, или каждый раз, когда пользователь сохраняется и т. Д. Сигналы являются хорошей абстракцией для задач, управляемых событиями.
Я не рекомендую повторно решать проблему, которую django-регистрация решает довольно хорошо. Он имеет подключаемую серверную систему, которая позволяет настраивать ее столько, сколько нужно.