django admin - 如何实现自定义字段排序

时间:2015-08-25 22:18:40

标签: python django django-admin

假设我有一个这样的数据模型: &Apple苹果GT;水果 - >有机

因此,Apple拥有Fruit的外键...... 和有3个字段:名称,标题,级别。 我在一列中显示3个字段作为name_title_level。 我希望能够通过单击表头来对结果进行排序。 我看过: https://djangosnippets.org/snippets/2110/ 并试了一下:

import Data.Numbers.Primes
last (primeFactors 600851475143)

我没有收到任何错误,排序功能没有做任何事情。 未调用get_query_set方法。 有谁知道怎么做?

更新: 这是更新的代码。现在调用该方法,但仍然没有排序功能。我的意思是标题中根本没有链接。

models.py:

class SpecialOrderingChangeList(ChangeList):
    def apply_special_ordering(self, queryset):
        order_type, order_by = [self.params.get(param, None) for param in ('ot', 'o')]
        special_ordering = self.model_admin.special_ordering
        if special_ordering and order_type and order_by:
            try:
                order_field = self.list_display[int(order_by)]
                ordering = special_ordering[order_field]
                if order_type == 'desc':
                    ordering = ['-' + field for field in ordering]
                queryset = queryset.order_by(*ordering)
            except IndexError:
                return queryset
            except KeyError:
                return queryset
        return queryset

    def get_query_set(self):
        queryset = super(SpecialOrderingChangeList, self).get_query_set()
        queryset = self.apply_special_ordering(queryset)
        return queryset

@admin.register(Apple)
class AppleAdmin(admin.ModelAdmin):
    list_display = ('x', 'get_name')

    def get_name(self, obj):
        return "{}_{}_{}".format(obj.fruit.organic.name,\
            obj.fruit.organic.title, obj.fruit.organic.level)

    special_ordering = {'name': ('fruit__organic__name', 'fruit__organic__title', 'fruit__organic__level')}

    def get_changelist(self, request, **kwargs):
        return SpecialOrderingChangeList

admin.py:

from django.db import models

class Organic(models.Model):
    name = models.CharField(max_length=30)
    title = models.CharField(max_length=30)
    label = models.CharField(max_length=30)
    def __unicode__(self):
        return self.name

class Fruit(models.Model):
    organic = models.ForeignKey(Organic)
    def __unicode__(self):
        return self.organic.name

class Apple(models.Model):
    fruit = models.ForeignKey(Fruit)
    color = models.CharField(max_length=30)
    def __unicode__(self):
        return self.color

1 个答案:

答案 0 :(得分:1)

应该是

get_queryset()

不是

get_query_set()