Django admin:我可以定义字段顺序吗?

Ser*_*gey 21 django

我在Django中使用抽象模型,如:

class Tree(models.Model):
    parent = models.ForeignKey('self', default=None, null=True, blank=True,
                               related_name="%(app_label)s_%(class)s_parent")

    class Meta:
        abstract = True

class Genre(Tree):
    title = models.CharField(max_length=150)
Run Code Online (Sandbox Code Playgroud)

抽象模型中的所有字段都首先出现在Django的管理面板中:

parent:
abstract_field2:
title:
model_field2:
...
Run Code Online (Sandbox Code Playgroud)

有没有办法将它们(抽象类中的字段)放在列表​​的末尾?
或者更一般的方式来定义字段的顺序?

Ala*_*air 37

您可以使用该ModelAdmin.fields选项根据需要订购字段.

class GenreAdmin(admin.ModelAdmin):
    fields = ('title', 'parent')
Run Code Online (Sandbox Code Playgroud)

  • 还想提一下 https://github.com/django-mptt/django-mptt 如果需要树状结构 (2认同)

rbe*_*ell 5

我知道这是一个老问题,但我想花两分钱,因为我的用例正是这样,但我有很多模型继承自一个类,所以不想为每个管理员写出字段。相反,我扩展了 get_form 模型并重新排列了字段以确保 parent 始终位于管理面板中用于添加/更改视图的字段的末尾。

class BaseAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super(BaseAdmin, self).get_form(request, obj, **kwargs)
        parent = form.base_fields.pop('parent')
        form.base_fields['parent '] = parent 
        return form
Run Code Online (Sandbox Code Playgroud)

base_fields 是 OrderedDict,因此将“父”键附加到末尾。然后,为您希望父级出现在最后的任何类扩展此管理员:

class GenreAdmin(BaseAdmin):
    pass
Run Code Online (Sandbox Code Playgroud)


小智 5

根据 rbennell 的回答,我使用了一种稍微不同的方法,使用了Django 1.7 中引入的新get_fields方法。在这里,我覆盖了它(代码将在父级的 ModelAdmin 的定义中)并删除并将“父级”字段重新附加到列表的末尾,因此它会出现在屏幕底部。使用 .insert(0,'parent') 会将它放在列表的前面(如果您熟悉 python 列表,这应该很明显)。

def get_fields (self, request, obj=None, **kwargs):
    fields = super().get_fields(request, obj, **kwargs)
    fields.remove('parent')
    fields.append('parent') #can also use insert
    return fields
Run Code Online (Sandbox Code Playgroud)

这假设您的字段是一个列表,老实说我不确定这是否是一个好的假设,但到目前为止它对我来说效果很好。