Заказ внешнего ключа django-mptt в админке не работает - PullRequest
2 голосов
/ 15 марта 2011

Я использую django-mptt для создания модели категорий, а затем использую ее в качестве внешнего ключа для модели документов. Администратор категорий работает нормально, и категории отображаются в древовидном порядке, как и ожидалось. Однако у меня есть две проблемы с заказом модели документа в админке.

Документы в списке администратора перечислены в порядке идентификаторов, а не в порядке категорий Раскрывающийся список «Категория» на экране редактирования отображается в порядке идентификатора категории. Обратите внимание, что я использовал абстрактный класс для категории по другой причине.

Почему порядок, указанный в модели, игнорируется?

Models.py

class Category(MPTTModel):
 parent = models.ForeignKey('self', related_name="children")
 name = models.CharField(max_length=100)


  class Meta:
    abstract = True
    ordering = ('tree_id', 'lft')

  class MPTTMeta:
    ordering = ('tree_id', 'lft')
    order_insertion_by = ['name',]

class CategoryAll(Category):

  class Meta:
    verbose_name = 'Category for Documents'
    verbose_name_plural =  'Categories for Documents'


class Document(models.Model):
  title = models.CharField(max_length=200)
  file = models.FileField(upload_to='uploads/library/all', blank=True, null=True)
  category = models.ForeignKey(CategoryAll)

  class Meta:
    ordering = ('category__tree_id', 'category__lft', 'title')

Admin.py

class DocAdmin(admin.ModelAdmin):

  list_display = ('title', 'author', 'category')
  list_filter = ('author','category')
  ordering = ('category__tree_id', 'category__lft', 'title')

ОБНОВЛЕНИЕ ОБНОВЛЕНО:

Models.py

class Category(MPTTModel):
 parent = models.ForeignKey('self', related_name="children")
 name = models.CharField(max_length=100)


  class Meta:
    abstract = True

  class MPTTMeta:
    order_insertion_by = ['name',]

class CategoryAll(Category):

  class Meta:
    verbose_name = 'Category for Documents'
    verbose_name_plural =  'Categories for Documents'
    ordering = ('lft',)

class Document(models.Model):
  title = models.CharField(max_length=200)
  file = models.FileField(upload_to='uploads/library/all', blank=True, null=True)
  category = models.ForeignKey(CategoryAll)

  class Meta:
    ordering = ('category__tree_id', 'category__lft', 'title')

Admin.py

class DocAdmin(admin.ModelAdmin):

  list_display = ('title', 'author', 'category')
  list_filter = ('author','category')
  ordering = ('category__lft',)

1 Ответ

2 голосов
/ 15 марта 2011

ОК - нашли ответы с некоторой настойчивостью:

Почему список отображения не упорядочен правильно?Поскольку он использует только первое поле:

ModelAdmin.ordering Установите порядок, чтобы указать порядок упорядочения списков объектов в представлениях администратора Django.Это должен быть список или кортеж в том же формате, что и параметр порядка модели.

Если это не предусмотрено, администратор Django будет использовать порядок модели по умолчанию.

Примечание. Djangoпочитать первый элемент в списке / кортеже;все остальные будут игнорироваться.

Почему выпадающий список не был правильно упорядочен?Потому что у меня должен был быть порядок в подклассе, а не только абстрактная модель.

...