Ответ 1
Вы можете заказать поля, как хотите, с помощью параметра ModelAdmin.fields
.
class GenreAdmin(admin.ModelAdmin):
fields = ('title', 'parent')
Я использую абстрактные модели в 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:
...
Есть ли способ поместить их (поля из абстрактных классов) в конец списка?
Или более общий способ определения порядка полей?
Вы можете заказать поля, как хотите, с помощью параметра ModelAdmin.fields
.
class GenreAdmin(admin.ModelAdmin):
fields = ('title', 'parent')
Я знаю, что это старый вопрос, но мне захотелось зайти в мои два цента, так как мой вариант использования был именно таким, но у меня было много моделей, наследующих от одного класса, поэтому не хотелось писать поля для каждого админ. Вместо этого я расширил модель 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
Построение ответа 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
Это предполагает, что ваши поля являются списком, если честно, я не уверен, что это правильное предположение, но до сих пор оно работало нормально для меня.