2010-01-04 19 views
1

時實現auto_current_user_add我有我遷移到在Django運行AppEngine應用程序,使用app-engine-patch得到的Django的全部優點 - 尤其是管理接口。使用Django的用戶表

我的一個車型的樣子(部分)如下:

class Request(db.Model): 
    requestor = db.UserProperty(auto_current_user_add=True) 

當我顯示基於此模型的形式,我不顯示請求者領域,所以當我調出模型的put()方法我正在保存的實體沒有請求者屬性集。這會觸發auto_current_user_add魔術,並自動添加創建請求的用戶。

在Django的,我使用的是提供用戶表。我想這顯示爲我的應用程序的用戶的列表,因此模型變爲:

from ragendja.auth.google_models import User 

class Request(db.Model): 
    requestor = db.ReferenceProperty(User) 

然而,這打破在管理界面中auto_current_user_add魔法 - 如果管理界面的用戶沒有輸入爲請求屬性的值,Django的設置屬性設置爲無,當我真的想爲請求將自己的用戶名自動插入。

我怎樣才能恢復魔力?

回答

0

我的解決方案依賴於三個方面:

  • 第一:它可以覆蓋模型的put()方法。
  • 二:users.get_current_user()仍然提供了正確的用戶,並
  • 三:ragendja.auth.google_models.User.get_djangouser_for_user()需要google.appengine.api.users.user對象,並返回相應的Django的User對象 - 首先創建它,如果它不存在。

把這個都在一起,我有:

class Request(db.Model):                       
    requestor = db.ReferenceProperty(User) 

    def put(self): 
    if not self.requestor: 
     self.requestor = User.get_djangouser_for_user(users.get_current_user()) 
    super(Request, self).put() 

這與管理界面很好地工作:管理員可以指定任何現有用戶(或使用提供的+號創建一個新用戶) - 如果他們留空,他們將被分配爲請求者。

後來當我添加一個視圖,方便用戶管理自己的要求,這個值將是「排除」列表上,同樣的方法將自己的用戶名每次創建一個新的請求時添加。

我不知道這是否是雖然最佳的解決方案;我是Django的新手,所以也許有更好的方法來實現這一點。