Django admin: могу ли я определить порядок полей?

Я использую абстрактные модели в 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:
...

Есть ли способ поместить их (поля из абстрактных классов) в конец списка?
Или более общий способ определения порядка полей?

Ответ 1

Вы можете заказать поля, как хотите, с помощью параметра ModelAdmin.fields.

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

Ответ 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, поэтому он добавляет "родительский" ключ в конец. Затем добавьте этот админ для любых классов, в которых вы хотите, чтобы родительский элемент появился в конце:

class GenreAdmin(BaseAdmin):
    pass

Ответ 3

Построение ответа rbennell Я использовал немного другой подход, используя новый метод get_fields, представленный в Django 1.7. Здесь я переопределил это (код был бы в определении родительского ModelAdmin) и удалил и повторно добавил поле "parent" в конец списка, чтобы оно появилось в нижней части экрана. Использование .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

Это предполагает, что ваши поля являются списком, если честно, я не уверен, что это правильное предположение, но до сих пор оно работало нормально для меня.