我在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)
Run Code Online (Sandbox Code Playgroud)
抽象模型中的所有字段都首先出现在Django的管理面板中:
parent:
abstract_field2:
title:
model_field2:
...
Run Code Online (Sandbox Code Playgroud)
有没有办法将它们(抽象类中的字段)放在列表的末尾?
或者更一般的方式来定义字段的顺序?
Ala*_*air 37
您可以使用该ModelAdmin.fields选项根据需要订购字段.
class GenreAdmin(admin.ModelAdmin):
fields = ('title', 'parent')
Run Code Online (Sandbox Code Playgroud)
我知道这是一个老问题,但我想花两分钱,因为我的用例正是这样,但我有很多模型继承自一个类,所以不想为每个管理员写出字段。相反,我扩展了 get_form 模型并重新排列了字段以确保 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
Run Code Online (Sandbox Code Playgroud)
base_fields 是 OrderedDict,因此将“父”键附加到末尾。然后,为您希望父级出现在最后的任何类扩展此管理员:
class GenreAdmin(BaseAdmin):
pass
Run Code Online (Sandbox Code Playgroud)
小智 5
根据 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
Run Code Online (Sandbox Code Playgroud)
这假设您的字段是一个列表,老实说我不确定这是否是一个好的假设,但到目前为止它对我来说效果很好。
| 归档时间: |
|
| 查看次数: |
13550 次 |
| 最近记录: |