0

我正在基于 Django 在 Django 中滚动我自己的自定义注册模块django.contrib.auth. 我的注册模块将具有一些额外的功能,并帮助我减少对我当前使用的其他 django 模块的依赖,例如 django-registration 和 django-emailchange。我在这里遇到了一个最好的方法来做它的问题。

注意:所有用户帐户均基于django.contrib.auth.models.User模型。

当用户单击“注册”链接时,请求会传递给我名为register. 我有一个自定义表单,它有四个字段——用户名、电子邮件、密码 1 和密码 2。该表格基于django.forms.Form. 该表单提供基本验证,例如 passoword1 和 password2 是电子邮件;电子邮件/用户名不存在。

当数据被 POST 回我的注册视图时,我调用is_valid()表单的方法,之后,我通过调用create_user()in调用的 Manager 方法创建一个新用户django.contrib.auth.models.UserManager。此时我需要添加更多自定义功能,例如发送激活电子邮件等。作为最佳实践方法,这个逻辑应该在哪里?这应该在User模型的方法中吗?它应该是它目前所在的位置 - 模型的经理吗?还是应该将其放入save()我的注册表单的自定义方法中?

谢谢。

4

2 回答 2

2

与克里斯不同,我相信胖模特的哲学,瘦的观点。

您可以在模型中考虑的代码越多,您的代码库的可重用性就越高。视图关注点应该只是管理请求/响应周期和处理 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)

类似地,您可以在删除用户或每次保存用户时使用它。信号是对事件驱动任务的一个很好的抽象。

于 2010-07-12T23:45:46.200 回答
0

我的建议是不要重新解决 django-registration 很好地解决的问题。它有一个可插拔的后端系统,可让您根据需要尽可能多地自定义它。

于 2010-07-12T14:17:22.903 回答