【问题标题】:Django admin: can I define fields order?Django admin:我可以定义字段顺序吗?
【发布时间】:2014-10-10 23:27:24
【问题描述】:

我在 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:
...

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

【问题讨论】:

    标签: django


    【解决方案1】:

    您可以使用ModelAdmin.fields 选项对字段进行排序。

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

    【讨论】:

    • 如果需要树形结构也想提github.com/django-mptt/django-mptt
    • 字段的顺序取决于您在模型中声明它们的顺序。因此,或者您可以按照您希望它们在管理员中显示的方式对字段进行排序。
    • 问题中的@larry,parent来自父模型Treetitle来自子模型Genre,所以无法在后台更改顺序通过更改模型中的顺序。
    • 猜猜这仅适用于正常模型情况。
    • 由于某种原因(不知道为什么)包括我的时间戳字段(created_at and updated_at)如果它们不包含在read_only-fields 中,则在尝试编辑时会导致崩溃(错误500) .可能是因为auto_add_now=True
    【解决方案2】:

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

    这假设您的字段是一个列表,老实说,我不确定这是否是一个好的假设,但到目前为止它对我来说效果很好。

    【讨论】:

    • docs for get_fields 说“...应该返回一个字段列表...”,所以我猜你的假设是可以的。
    【解决方案3】:

    我知道这是一个老问题,但我想花两分钱,因为我的用例就是这样,但我有很多模型继承自一个类,所以不想为每个类都写出字段行政。相反,我扩展了 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
    

    base_fields 是一个 OrderedDict,因此这会将“父”键附加到末尾。 然后,将此管理员扩展到您希望父级出现在末尾的任何类:

    class GenreAdmin(BaseAdmin):
        pass
    

    【讨论】:

    • 哦,我应该补充一下,这是 python 2.7。在 python 3 中,使用 form.base_fields.move_to_end('parent') 更容易
    【解决方案4】:

    @acquayefrank(在 cmets 中)的这个简单解决方案对我有用:

    字段的顺序取决于您在模型中声明它们的顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 2022-10-05
      • 2010-11-12
      • 2010-11-15
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多