使用 Django 的 User 表时实现 auto_current_user_add
我有一个 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我的解决方案依赖于三件事:
put()
方法。users.get_current_user()
仍然提供正确的用户,ragendja.auth.google_models.User.get_djangouser_for_user()
采用google.appengine。 api.users.user
对象并返回相应的 Django User 对象 - 如果它尚不存在,则首先创建它。将所有这些放在一起,我有:
这与管理界面配合得很好:管理员可以分配任何现有用户(或使用提供的 + 符号创建新用户) - 如果他们将其留空,他们将被分配为请求者。
稍后,当我添加一个视图供用户管理自己的请求时,该值将位于“排除”列表中,并且每次创建新请求时都会在用户名中添加相同的方法。
我不确定这是否是最佳解决方案;我是 Django 新手,所以也许有更好的方法来实现这一目标。
My solutions relies on three things:
put()
method.users.get_current_user()
still provides the correct user, andragendja.auth.google_models.User.get_djangouser_for_user()
takes agoogle.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:
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.