Нужно ли размещать пользовательский регистрационный код в представлениях, моделях или менеджерах? - PullRequest
0 голосов
/ 12 июля 2010

Я запускаю свой собственный модуль регистрации в 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 ]

2 голосов
/ 13 июля 2010

В отличие от Криса, я верю в философию толстых моделей, тонких представлений.

Чем больше кода вы сможете включить в модели, тем больше будет повторно использоваться ваша кодовая база.Проблемы представлений должны заключаться в простом управлении циклом запроса / ответа и работе с параметрами GET / POST.

В этом случае отправка электронных писем об активации связана с событием создания нового пользователя.Для этих случаев Django уже предоставляет эту абстракцию через сигналы.

http://docs.djangoproject.com/en/1.2/topics/signals/#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)

Точно так же вы можете иметь это при удалении пользователя или при каждом сохранении пользователя и т. Д. Сигналы являются хорошей абстракцией для задач, управляемых событиями.

0 голосов
/ 12 июля 2010

Я не рекомендую повторно решать проблему, которую django-регистрация решает довольно хорошо.Он имеет подключаемую серверную систему, которая позволяет настраивать его столько, сколько нужно.

...