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 在另一个模型中包含字段