Django 1.11如何解决list_filter重复

时间:2018-02-07 10:37:49

标签: django list filter admin

在我的模型中, __ str __(self)创建创建 DateTimeField 中获取季度和年份。

Models.py

class Response(models.Model):

    created = models.DateTimeField(auto_now_add=True)

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

在管理员中,我希望能够根据提交内容的季度过滤记录(实际上,我希望根据没有提交提交针对特定内容的响应进行过滤四分之一,我认为我可以通过一个好位置代替以后实现),所以我有以下内容:

Admin.py

class UserAdmin(admin.ModelAdmin):

    list_display = ('username', 'latest_response')
    list_filter = ('response__created', 'response')

    def latest_response(self, obj):
        return obj.response_set.latest('created')

到目前为止,我已经在测试中提交了四个回复(通过 def __str __ 我有2 x" Q1 2018"和2 x" - " ),结果如下:

UserAdmin table and list_filter result

任何想法为什么我得到3 x" Q1 2018"和1 x" - "?我只想要1 x" Q1 2018"在过滤器列表中

奖金问题 - 任何想法如何设置filter_list中列出的项目数量的限制(通过响应)?我想将它们限制在最新的4,因为我使用字符串可能会有问题。

修改

在控制台日志中注意到过滤器正在使用基于响应ID的GET请求:

"GET /admin/auth/user/?response__id__exact=1 HTTP/1.1" 200 14277
"GET /admin/jsi18n/ HTTP/1.1" 200 3217
"GET /admin/auth/user/?response__id__exact=2 HTTP/1.1" 200 14277
"GET /admin/jsi18n/ HTTP/1.1" 200 3217
"GET /admin/auth/user/?response__id__exact=3 HTTP/1.1" 200 14270
"GET /admin/jsi18n/ HTTP/1.1" 200 3217
"GET /admin/auth/user/?response__isnull=True HTTP/1.1" 200 14599
"GET /admin/jsi18n/ HTTP/1.1" 200 3217

因此,据我了解, by response 过滤器显示四个对象的公用名(Q1 2018)(以ID标识)。

如何根据公共名称/ self过滤对象?我想通过另一个def到Response类?

1 个答案:

答案 0 :(得分:1)

通常我保留def __str__(self):作为我班级的身份证明。 创建一个

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

然后用它来过滤:

list_filter = ('response__created', 'Quarter')