Django 1.11 - 有没有办法将models.Model的字段组合到auth.models?

Posted

技术标签:

【中文标题】Django 1.11 - 有没有办法将models.Model的字段组合到auth.models?【英文标题】:Django 1.11 - is there a way to combine fields from models.Model to auth.models? 【发布时间】:2018-07-05 18:41:09 【问题描述】:

我最终的目标是将 所有 用户列表(来自 auth.models)与来自另一个模型(model.Model)的 DateTimeField 结合起来。这样做的最佳方法是什么?

我的代码:

survey/models/response.py

from django.contrib.auth.models import User
from django.db import models

class Response(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, null=True, blank=True)

在 admin.py 中,我可以创建一个自定义用户类,其中列出所有注册用户的用户名,如下所示:

survey/admin.py

from django.contrib.auth.models import User

admin.site.unregister(User)

class UserAdmin(admin.ModelAdmin):
    list_display = ('username',)

admin.site.register(User, UserAdmin)

基本上我想将 UserAdmin 扩展为 list_display = ('username', 'created') - 使用 username 来自 auth.modelscreated 来自 models.Model

目前我可以在 admin.py 中创建一个类,该类向我显示所有已提交响应的用户的列表。问题是,如果您有 200 个用户,那么从所有用户列表中查看谁没有提交比仅列出已提交响应的用户更有用。

【问题讨论】:

如果您的用户有多个响应对象,您希望如何在管理页面的列表显示中显示它? 我只想在 UserAdmin 中显示 latest 响应对象。我可以使用内联创建每个响应对象响应的用户列表或每个用户对象的响应列表。我对此没有意见。如果需要,我还可以生成每个用户和每个响应的 csv。这更多是为了创建一个简单的用户界面,您可以过滤该用户界面以确定谁仍需要在最后一段时间内做出响应。 【参考方案1】:

您可以编写一个函数来获取相关数据以显示在管理员列表页面中。

在你的 admin.py 中

from django.contrib.auth.models import User

admin.site.unregister(User)

class UserAdmin(admin.ModelAdmin):
    list_display = ('username', 'latest_response')

    def latest_response(self, obj):
        return obj.response_set.latest('created')  # Or any other logic you want to apply here to return a string or boolean that can be shown on the admin

admin.site.register(User, UserAdmin)

【讨论】:

太棒了,这正是我所需要的。完美工作。我正要尝试通过 abstractUser 模型扩展用户模型。谢谢! 如果您正在建立一个新项目,我强烈建议您扩展 AbstractUser 模型来创建您自己的用户(因为这只能在项目开始时完成)。这将允许您轻松地向用户模型添加更多列(字段) 当我将它投入生产时,我将这样做,但现在它是一个概念证明,我不想清除我的数据库。这就是我现在需要的,实际上是一个很好理解的概念。再次感谢。

以上是关于Django 1.11 - 有没有办法将models.Model的字段组合到auth.models?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 1.11 admin 中创建新对象时评估只读字段

Django 1.11 - 无法在管理面板中编辑我的模型

Django 1.11 模型迁移操作不适用

通过 ForeignKey 模型计算项目,Django 1.11

扩展 Django 1.11 用户模型

Django 1.11 admin list_filter 在另一个模型中包含字段