代码之家  ›  专栏  ›  技术社区  ›  James Polley

使用django的用户表时实现自动添加当前用户

  •  1
  • James Polley  · 技术社区  · 15 年前

    我有一个Appengine应用程序要迁移到Django运行,使用 app-engine-patch 获取Django的所有优点—尤其是管理界面。

    我的一个模型(部分)如下:

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

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

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

    from ragendja.auth.google_models import User
    
    class Request(db.Model):
      requestor = db.ReferenceProperty(User)
    

    然而,这打破了 auto_current_user_add 管理界面的魔力-如果管理界面的用户没有为请求者属性输入值,Django会将属性设置为无,当我真的希望请求自动插入其用户名时。

    我怎样才能恢复魔法?

    1 回复  |  直到 15 年前
        1
  •  0
  •   James Polley    15 年前

    我的解决方案依赖三个方面:

    • 第一:可以覆盖模型的 put() 方法。
    • 第二: users.get_current_user() 仍然提供正确的用户,以及
    • 第三: ragendja.auth.google_models.User.get_djangouser_for_user() 采取了 google.appengine.api.users.user 对象并返回相应的django用户对象-如果该对象不存在,则首先创建它。

    把这些放在一起,我有:

    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,所以可能有更好的方法来实现这一点。