我有Django的User
模型元類,我用它來添加額外的方法(過於簡化版本):使用代理類,而不是用戶的request.user
# project.models.pie_lover.py
from django.contrib.auth.models import User
class PieLover(User):
class Meta:
app_label = "core"
proxy = True
def likes_pie(self):
return True
在我看來,我想得到登錄PieLover
,看看他是否喜歡餡餅(因爲PieLover
總是喜歡餡餅,所以很可笑,但在現實世界中情況可能並非如此)。我的問題在於Django登錄用戶的方式,我使用內置的login(request)
函數,因此存儲在request.user
中的對象是User
對象,而不是PieLover
。
# project.views.like_pie.py
from ..models.pie_lover import PieLover
def index(request):
pie_lover = request.user
if pie_lover.likes_pie():
print "Try pie, try!"
else:
print "BLASPHEMER!"
如果我嘗試這樣做的Django告訴我,User
對象有沒有方法likes_pie
這是可以預料的是request.user
不是PieLover
實例。
作爲一種快速解決方法,我只需要獲得與User
具有相同ID的PieLover
,但這意味着額外的數據庫命中。
我該如何讓Django默認在請求中使用PieLover
? 我在想,不是讓另一個數據庫查詢得到正確的PieLover
對象來創建一個新的PieLover
對象,並在初始化時將request.user
傳遞給它,但我不知道這是什麼意思。
研究OSQA的擴展用戶中間件。 – osa 2014-06-16 10:17:34