我有一个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,当我真的喜欢请求自动插入用户名。
我怎样才能恢复神奇?
答案 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的新手,所以也许有更好的方法来实现这一点。