【问题标题】:Django admin - sorting list_filterDjango 管理员 - 排序 list_filter
【发布时间】:2013-05-09 17:31:28
【问题描述】:

我在 list_filter 中有“版本”,我希望最新版本位于“所有”列表项之后。 在这种情况下,如何对列表进行降序排序? (全部,3.6.99.108,3.6.99.107...)

【问题讨论】:

标签: django django-admin


【解决方案1】:

在模型Meta 类中定义默认排序:

class MyModel(models.Model):
    # some model fields here
    class Meta:
        ordering = ['-version',]

如果它不能满足您的目的,您可以编写自己的自定义列表过滤器:

from django.utils.translation import ugettext_lazy as _
from django.contrib.admin import SimpleListFilter

class VersionFilter(SimpleListFilter):
    title = _('version')

    parameter_name = 'version'

    def lookups(self, request, model_admin):
        qs = model_admin.queryset(request)
        return [(i, i) for i in qs.values_list('version', flat=True) \
                                  .distinct().order_by('-version')]

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(version__exact=self.value())

class MyModel(ModelAdmin):
    list_filter = (VersionFilter,)

如果您收到以下错误AttributeError: object has no attribute 'queryset',那么您可能正在使用Django 1.5+,请改用.get_queryset(),例如

qs = model_admin.get_queryset(request)

【讨论】:

  • 或创建您自己的filter,如果这不是所需的默认订购行为
  • @Hedde 是的,我为此添加了一个示例。添加自定义过滤器示例后,我看到了您的评论。谢谢!
  • @Aamir Adnan,model_admin 没有 get_queryset 方法 (qs = model_admin.get_queryset(request))。它有queryset 方法。可能需要改变答案。
  • 第一个解决方案没有达到我的目的。第二个有,谢谢!另外,我更改了“查找”以检索不同的值,以避免重复: return [(i, i) for i in qs.values_list('version', flat=True).distinct().order_by('-version ')]
  • @ron 我在您发表评论前 10 分钟在我的回答中添加了 .distinct() :)
猜你喜欢
  • 2011-10-08
  • 2019-03-12
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2012-11-12
  • 2018-02-19
  • 2016-12-05
  • 1970-01-01
相关资源
最近更新 更多