【问题标题】:Implement auto_current_user_add when using Django's User table使用 Django 的 User 表时实现 auto_current_user_add
【发布时间】:2011-01-01 04:18:44
【问题描述】:

我有一个要迁移到 Django 中运行的 AppEngine 应用程序,使用 app-engine-patch 来获得 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 将属性设置为无,而我真的很喜欢请求自动插入他们的用户名。

我怎样才能恢复魔法?

【问题讨论】:

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


    【解决方案1】:

    我的解决方案依赖于三件事:

    • 首先:可以覆盖模型的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 新手,所以也许有更好的方法来实现这一点。

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2018-09-23
      • 2021-06-24
      • 2011-03-14
      • 2011-05-06
      相关资源
      最近更新 更多