使用 Django 的 User 表时实现 auto_current_user_add

发布于 2024-08-16 16:55:30 字数 778 浏览 4 评论 0原文

我有一个 AppEngine 应用程序,我正在将其迁移到 Django 中运行,使用 app-engine -patch 以获得 Django 的所有优点 - 特别是管理界面。

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

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 。

怎样才能恢复魔力呢?

I have an AppEngine app that I'm migrating to run in Django, using app-engine-patch to get all the goodness of Django - particularly the Admin interface.

One of my models looks like (partially) this:

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

When I display a form based on this model I don't display the requestor field, and so when I call the Model's put() method the entity I'm saving doesn't have the requestor property set. This triggers the auto_current_user_add magic, and the user who created the request is automatically added.

Under Django, I'm using the provided Users table. I want this to display as a list of the users of my app, so the model becomes:

from ragendja.auth.google_models import User

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

However, this breaks the auto_current_user_add magic in the admin interface - if the user of the admin interface doesn't enter a value for the requestor property, Django sets the property to None, when I'd really like for the Request to have their username inserted automatically.

How can I restore the magic?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜唯美灬不弃 2024-08-23 16:55:30

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

  • 第一:可以重写模型的 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 新手,所以也许有更好的方法来实现这一目标。

My solutions relies on three things:

  • First: it's possible to override the model's put() method.
  • Second: users.get_current_user() still provides the correct user, and
  • Third: ragendja.auth.google_models.User.get_djangouser_for_user() takes a google.appengine.api.users.user object and returns the corresponding Django User object - creating it first if it didn't already exist.

Putting this all together, I have:

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()

This works nicely with the admin interface: the admin can assign any existing user (or use the supplied + sign to create a new user) - if they leave it blank, they'll be assigned as the requestor.

Later when I add a view for users to manage their own requests, this value will be on the 'excluded' list, and the same method will add in their username every time they create a new request.

I'm not sure if this is an optimal solution though; I'm new to Django, so maybe there's a better way to achieve this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文