我想在Django的默认用户模型中添加一个新函数,用于检索模型类型的相关列表.
这样的Foo模型:
class Foo(models.Model):
owner = models.ForeignKey(User, related_name="owner")
likes = models.ForeignKey(User, related_name="likes")
Run Code Online (Sandbox Code Playgroud)
........
#at some view
user = request.user
foos= user.get_related_foo_models()
Run Code Online (Sandbox Code Playgroud)
怎么能实现这一目标?
contrib.auth 中的 admin.py 定义了在管理界面为用户显示的字段:
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
Run Code Online (Sandbox Code Playgroud)
我想在这里看到每个用户的组:

仅用于测试目的,当您尝试添加“组”字段时,它会失败:
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'group')
Run Code Online (Sandbox Code Playgroud)
出现此错误: : (admin.E109) 'list_display[5]' 的值不能是 ManyToManyField。
搜索后,我只找到了将应用程序添加到管理界面或创建自定义用户模型的方法,但我想我错过了一些东西。
那么,该怎么做呢?
已解决--- 感谢@{Alexis No} 的回答
编辑 /usr/local/lib/pyton2.7/dist-packages/django/contrib/auth/admin.py
就在 list_display 之前添加这个寻找组的定义:
def group(self, user):
groups = []
for group in user.groups.all():
groups.append(group.name)
return ' '.join(groups)
group.short_description = 'Groups'
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'group')
Run Code Online (Sandbox Code Playgroud)
然后同步数据库,并在 admin 检查更改,注意最后一列:

从 Django 1.6.11 升级到 1.7 时,我遇到了一个有趣的问题。这似乎是基于我目前分割文件的方式。目前,由于方法数量庞大,模型方法与模型存储在单独的文件中。
例如,它被拆分如下:
help
|_ modelmethods
| |_ __init__.py
| |_ thread_methods.py
|_ __init__.py
|_ models.py
Run Code Online (Sandbox Code Playgroud)
帮助应用程序文件夹中的内容__init__.py如下所示:
""" __init__.py for help app."""
from help.modelmethods.thread_methods import *
Run Code Online (Sandbox Code Playgroud)
thread_methods.py 看起来像这样:
"""Methods for the Thread model."""
from help.models import Thread
class ThreadMethods:
"""Adds methods on to the Thread model."""
def do_the_thing(self):
pass
Thread.__bases__ += (ThreadMethods,)
Run Code Online (Sandbox Code Playgroud)
我从中看到的错误如下:
Migrations for 'help':
0001_initial.py:
- Create model Thread
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File …Run Code Online (Sandbox Code Playgroud) class MyUser(User):
class Meta:
proxy = True
def do_something:
...
Run Code Online (Sandbox Code Playgroud)
有了上述内容,我使用代理模型技术扩展了Django用户模型的行为.我希望我可以以某种方式自定义request.user,以便每次都为其分配MyUser实例而不是User实例.如果可能的话,我怎么能实现呢?