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

时间:2014-10-10 23:27:24

标签: 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)

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

parent:
abstract_field2:
title:
model_field2:
...

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

3 个答案:

答案 0 :(得分:32)

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

class GenreAdmin(admin.ModelAdmin):
    fields = ('title', 'parent')

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

基于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

这假设您的字段是一个列表,老实说,我不确定这是否可以,但是到目前为止对我来说还不错。