Django管理员:我可以定义字段顺序吗?

Django管理员:我可以定义字段顺序吗?,django,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 Gen

我在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)
抽象模型中的所有字段首先进入Django的管理面板:

parent:
abstract_field2:
title:
model_field2:
...
有没有办法将它们(抽象类中的字段)放在列表的末尾?

或者用一种更通用的方法来定义字段的顺序?

您可以使用该选项根据需要对字段进行排序


我知道这是一个老问题,但我想用我的两分钱来思考,因为我的用例与此完全相同,但我有很多模型继承自一个类,所以不想为每个管理员写出字段。相反,我扩展了get_表单模型并重新排列了字段,以确保在add/change视图的管理面板中,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
base_fields是OrderedDict,因此这会在末尾附加“parent”键。 然后,将此管理员扩展到希望父级出现在末尾的任何类:

class GenreAdmin(BaseAdmin):
    pass

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


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

还想提到,如果您需要树结构,字段的顺序将取决于您在模型中声明它们的顺序。因此,您也可以按照希望在管理中显示的方式对字段进行排序。@larry在问题中,
parent
来自父模型
title
来自子模型
流派
,因此,不可能通过更改模型中的顺序来更改管理中的顺序。我猜这只适用于正常的模型情况。由于某种原因(不知道为什么),包括我的时间戳字段(
在创建时和更新时
)会在尝试编辑时导致崩溃(错误500)如果它们未包含在
只读字段中。也许是因为
auto\u add\u now=True
?哦,我应该补充一点,这是python 2.7。在Python3中,使用form.base\u fields.move\u to_end('parent')对于
get\u fields
say“…应该返回一个字段列表…”更容易,所以我想您的假设是可以的。
class GenreAdmin(BaseAdmin):
    pass
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