我在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:
...
有没有办法将它们(抽象类中的字段)放在列表的末尾? 或者更一般的方式来定义字段的顺序?
答案 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
这假设您的字段是一个列表,老实说,我不确定这是否可以,但是到目前为止对我来说还不错。