2013-04-25 68 views
0

這是寫in the doc說:的Django 1.5自定義用戶模型 - 信號限制

的自定義用戶模型另一個限制是你不能使用django.contrib.auth.get_user_model()作爲發件人或目標信號處理程序。相反,您必須使用生成的用戶模型註冊處理程序。有關注冊發送信號的更多信息,請參閱信號。

我想這意味着你可以做到以下幾點:

from django.contrib.auth import get_user_model 

User = get_user_model() 

@receiver(post_save, sender=User) 
def user_saved(sender=None, instance=None, **kwargs): 
    # something 

不是嗎?我只是想知道我是否理解得很好(我不明白他們爲什麼說這是一個「限制」,但無論如何,只是想檢查)。

回答

3

這應該工作。 我認爲他們的意思是使用相同的功能,發送者

在DOC:

發件人目標的信號處理的。相反,你必須用得到的用戶模型註冊 處理程序

6

這是因爲對象沒有被「安裝」時,正在創建的信號,從而get_user_model()無法找到對象它需要連接信號處理程序。

請參閱this bug瞭解有關如何找到問題以及問題的詳細信息。

你的例子不起作用,因爲get_user_model()調用會因爲這個原因失敗。現在做一個自定義User類的信號處理工作的唯一辦法就是將它命名上,無需使用get_user_model(),如

@receiver(post_save, sender=myapp.MyUserModel) # can't use get_user_model() here 
def user_saved(sender=None, instance=None, **kwargs): 
    # something 

你的編碼風格也可以做一些工作:當您運行User = get_user_model(),創建一個名爲User的變量,其值設置爲get_user_model()函數調用的結果。 Python約定(以及大多數其他語言的約定)用於以小寫字母開頭的普通變量和以大寫字母開頭的類。

因此user = get_user_model()然後在以後使用user變量對任何讀取代碼的人來說都會更有意義,並且有助於避免將來出現混淆。

+0

不知道你,意味着大約小寫字母是什麼,用戶在這種情況下可調用,或者是一類,但是你調用。此外,在使用get_user_model與AUTH_USER_MODEL **相同​​的models.py中,您的觀點是正確的。這是一個很好的觀點,但是你的信息並不清楚 – lajarre 2013-05-14 17:02:33

0

您可以簡單地使用設置AUTH_USER_MODEL或任何模型作爲字符串,例如, 'users.MyCustomUser'

def user_post_save_handler(**kwargs): 
    # do something 
post_save.connect(user_post_save_handler, sender=settings.AUTH_USER_MODEL)