2015-08-25 2 views
0

Допустим, у меня есть модель данных, например, так: Apple-> фруктовое> ОрганическиеДжанго админ - как реализовать пользовательские поля сортировки

так Apple, имеет внешний ключ к фруктам ... и Organic имеет 3 поля: имя, название, уровень. Я показываю 3 поля в одном столбце как name_title_level. Я хочу, чтобы иметь возможность сортировать результат, нажав на заголовок таблицы. Я посмотрел на: https://djangosnippets.org/snippets/2110/ и попробовал:

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 

Я не получаю сообщение об ошибке и функция сортировки ничего не делает. Метод get_query_set не вызывается. Кто-нибудь знает, как это сделать?


Обновления: Вот обновленный код. Теперь метод вызван, но все еще нет функции сортировки. Я имею в виду, что в заголовке нет ссылки.

models.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 

admin.py:

from django.contrib import admin 
from .models import * 
from django.contrib.admin.views.main import ChangeList 

@admin.register(Organic) 
class OrganicAdmin(admin.ModelAdmin): 
    pass 

@admin.register(Fruit) 
class FruitAdmin(admin.ModelAdmin): 
    pass 


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_queryset(self, request): 
     queryset = super(SpecialOrderingChangeList, self).get_queryset(request) 
     queryset = self.apply_special_ordering(queryset) 
     return queryset 


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

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

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

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

ответ

1

должно быть

get_queryset() 

не

get_query_set() 
Смежные вопросы