在 Django 中从基本模型实例转换为派生代理模型?
我想为 Django 的默认 User 类定义一个代理模型,类似于这样:
class MyUser(User):
def pretty_username(self):
if self.first_name:
return self.first_name
return self.username
class Meta:
proxy = True
而且,我希望能够从视图代码(理想情况下,甚至从模板)调用 Pretty_username 。是否有一种简单的方法来获取标准用户模型的实例并将其类型转换为 MyUser 的实例?
即使是一些 __init__
魔法对我来说也没什么问题,只要我能说:
my_user = MyUser(request.user)
在我的视图代码中。
I'd like to define a proxy Model for Django's default User class, something kind of like this:
class MyUser(User):
def pretty_username(self):
if self.first_name:
return self.first_name
return self.username
class Meta:
proxy = True
And, I'd like to be able to call pretty_username from view code (and ideally, even from templates). Is there a simple way to take an instance of a standard User Model and type-cast it into an instance of MyUser?
Even some __init__
magic would be okay with me, as long as I can say:
my_user = MyUser(request.user)
in my view code.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为这个问题的实际答案应该是@fhahn 在另一个答案中的评论。通过更改类,我们可以避免额外的数据库调用。以下是示例代码:
我的代理模型,如果设置,则将表示形式从
username
更改为email
:在 shell 中进行简短测试:
I think the actual answer to this question should be the comment by @fhahn in the other answer. And by changing class we can avoid the extra database call. Here is sample code:
My proxy model which change the representation from
username
toemail
if set:A brief test in shell:
如果您确实希望拥有完整的代理对象可用,那么这是一个快速而肮脏的解决方案(以额外的数据库调用为代价)
因此,要在视图中使用它,您可以说:
或者在模板中:
一个更好的解决方案,如果您不受代理模型想法的束缚,将是以下内容:
这将允许以下内容:
或者
If you really want to have the full proxy object available, this is a quick and dirty solution (at the expense of an extra database call)
So to use this in a view you could say:
Or in a template:
A nicer solution, if you're not tied to the proxy model idea, would be the following:
This would allow the following:
Or