2010-07-12 41 views
0

我在Django中根据django.contrib.auth来滚动我自己的自定义注册模块。我的注册模块将有一些额外的功能,并帮助我减少我目前使用的其他django模块的依赖,如django-registration和django-emailchange。我已经遇到了一个什么最好的方式来做它的问题。我应该在视图,模型还是管理器中放置自定义注册码?

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

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

当数据被恢复到我的注册视图时,我调用表格的is_valid()方法,之后,我通过调用中的名为create_user()的管理器方法创建新用户。在这一点上,我需要添加更多的自定义功能,比如发送激活邮件等。作为一种最佳实践方法,这种逻辑应该放在哪里?这是否应该在User模型的方法中?它应该是现在的位置 - 模型的经理?或者应该将其放入我的注册表单的自定义save()方法中?

谢谢。

回答

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) 

同样,你可以有这样的当用户被删除,或者每次用户被保存等等。信号对于事件驱动的任务是一个很好的抽象。

+0

很好的答案。我真的在想“不要把它放在保存方法中”,但重新阅读我的答案后,我没有这样解释。而不是重写它,我正在收回那部分。 – 2010-07-13 15:37:40

0

我的建议是不重新解决django注册很好地解决的问题。它具有可插入的后端系统,可以根据需要尽可能多地或自定义地对其进行自定义。

相关问题