使用Django的User表时实现auto_current_user_add

时间:2010-01-04 08:42:09

标签: django google-app-engine django-models django-admin

我有一个AppEngine应用程序,我正在迁移到Django中运行,使用app-engine-patch来获得Django的所有优点 - 尤其是Admin界面。

我的一个模型看起来像(部分)这样:

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

当我显示基于此模型的表单时,我不显示请求者字段,因此当我调用模型的put()方法时,我正在保存的实体没有设置请求者属性。这会触发auto_current_user_add魔术,并自动添加创建请求的用户。

在Django下,我正在使用提供的Users表。我希望它显示为我的应用程序的用户列表,因此模型变为:

from ragendja.auth.google_models import User

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

然而,这打破了管理界面中的auto_current_user_add魔法 - 如果管理界面的用户没有输入请求者属性的值,Django将属性设置为None,当我真的喜欢请求自动插入用户名。

我怎样才能恢复神奇?

1 个答案:

答案 0 :(得分: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的新手,所以也许有更好的方法来实现这一点。