2010-07-12 37 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註冊很好地解決的問題。它具有可插入的後端系統,可以根據需要儘可能多地或自定義地對其進行自定義。

相關問題