【问题标题】:Ordering django-mptt foreign key in admin not working在管理员中订购 django-mptt 外键不起作用
【发布时间】:2011-03-15 11:52:26
【问题描述】:

我正在使用 django-mptt 创建一个 Categories 模型,然后将其用作 Documents 模型的外键。类别管理员工作正常,类别按预期以树状顺序显示。但是,我在管理员中订购 Document 模型时遇到了两个问题。

管理列表中的文档按 id 顺序而不是类别顺序列出 编辑屏幕中类别的下拉列表按类别 ID 顺序列出。请注意,我将抽象类用于类别是出于另一个原因。

为什么我在模型中指定的顺序被忽略了?

模型.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')

更新已修复:

模型.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',)

【问题讨论】:

    标签: django django-mptt


    【解决方案1】:

    好的 - 坚持不懈地找到答案:

    为什么显示列表没有正确排序?因为它只使用第一个字段:

    ModelAdmin.ordering 将排序设置为 指定对象列表应该如何 在 Django 管理视图中排序。 这应该是一个列表或元组 与模型订购的格式相同 参数。

    如果没有提供,Django admin 将使用模型的默认值 订购。

    注意 Django 只会尊重第一个 列表/元组中的元素;任何其他 将被忽略。

    为什么选择下拉菜单没有正确排序?因为我必须在子类中有一个顺序,而不仅仅是抽象模型。

    【讨论】:

    • 没试过,看看文档:Changed in Django 1.4: The Django admin honors all elements in the list/tuple; before 1.4, only the first one was respected.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多