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

Posted

技术标签:

【中文标题】Django 1.11 admin list_filter 在另一个模型中包含字段【英文标题】:Django 1.11 admin list_filter to include fields in another model 【发布时间】:2018-07-17 20:01:48 【问题描述】:

我有一个显示所有注册用户的 Django 管理类。我想在每个用户旁边添加一列,显示他们的最新回复(这是一个调查应用程序)。

到目前为止我尝试过的是:

响应模型

class Response(models.Model):

    """
        A Response object is a collection of questions and answers with a
        unique interview uuid.
    """

    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    survey = models.ForeignKey(Survey, related_name="responses")
    user = models.ForeignKey(User, null=True, blank=True)
    interview_uuid = models.CharField(_(u"Interview unique identifier"),
                                      max_length=36)

    class Meta(object):
        verbose_name = _('response')
        verbose_name_plural = _('responses')

    def Quarter(self):
        msg = u"Q%d %d" %(((self.created.month-1)//3)+1, self.created.year)
        return msg

Admin.py

class ResponseAdmin(admin.ModelAdmin):
    list_display = ('survey', 'created', 'user', 'Quarter') **works here

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

    def latest_response(self, obj):
    (return "Quarter" from Response Model) **how do I get it to work here too?

admin.site.register(Response, ResponseAdmin)
admin.site.register(User, UserAdmin)

我的一些尝试导致了以下错误:

FieldError: Cannot resolve keyword 'Quarter' into field. Choices are: answers, created, id, interview_uuid, survey, survey_id, updated, user, user_id

所以我可以看到问题是 UserAdmin 出于某种原因没有从响应模型中获取 Quarter 字段。当我将 def Quarter(self) 更改为 __str__(self) 时,它会在 UserAdmin 中按我想要的方式显示,但是我遇到了过滤问题。

在 ResponseAdmin 类下,Quarter 可以按我的意愿工作。如何在 UserAdmin 中也使用 Quarter 字段?

【问题讨论】:

【参考方案1】:
def latest_response(self, obj):
    latest_resp = (
        Response.objects
        .filter(user=obj)
        .order_by('-created')
        .first()
    )

    if latest_resp is not None:
        return latest_resp.Quarter()

【讨论】:

哇,这真的很酷——如果我以后想从不同的模型中提取字段,这非常有用。谢谢你。唯一没有立即意义的是 .filter(user=obj) - 请您详细说明一下吗? @RonaldGreeff 在 UserAdmin 类中,obj 将是一个 User 对象。我们希望获得该用户的最新响应,因此我们首先按用户过滤响应,按创建日期降序排列并获取第一个(最新的)。

以上是关于Django 1.11 admin list_filter 在另一个模型中包含字段的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Django 1.11 使用来自应用程序的模板作为管理模板

在 Django 1.11 中使用 MySQL 连接器/Python 时出错

Django集成TinyMCE(admin后台+前台)

除非输入搜索查询,否则隐藏 Django admin 中的所有记录[关闭]