【问题标题】:Django - grouping columns in django admin sectionDjango - 在 django 管理部分中对列进行分组
【发布时间】:2012-01-29 22:08:15
【问题描述】:

我需要 django admin 中给定 db 表的组列。我将采用具有列 id、first_name、last_name、address1、address2、address3 的示例表“Student”。所以分组会是这样的:

ID -> 标识

名字 -> 名字,姓氏

地址 -> 地址1,地址2,地址3

当我从表中查看数据行时,这样做的目的是获取一组列的标签。因此,当我在 Django 的管理部分检查为 Student 表获取的行时,我应该会看到如下内容:

---------------------------------------------- ---------------------------------- |身份证 |姓名 |地址 | -------------------------------------------------- ------------------------------------------- |身份证 |名字 |姓氏 |地址 1 |地址 2 |地址 3 | -------------------------------------------------- ------------------------------------------- | 1 |罗恩 |库尼亚 |第一个十字架 |瓦伦西亚 |芒格洛尔 | -------------------------------------------------- ------------------------------| | 2 |阿卡什 |阿塔瓦尔 |马克街 |阿塔瓦尔 |芒格洛尔 | -------------------------------------------------- -------------------------------------------

我必须能够在 admins.py 中实现这一点(通过编写一个扩展 admin.ModelAdmin 的类)。使用 list_display 元组我可以列出我想要查看的列。但我不知道如何对列进行分组。请帮帮我...

【问题讨论】:

    标签: django django-models django-admin django-templates


    【解决方案1】:

    为此,您只需在 Model 或 ModelAdmin 上创建一个返回所需显示的方法,然后在 list_display 中使用该方法名称(它需要字段名称​​或可调用)。

    class MyModelAdmin(admin.ModelAdmin):
        ...
        list_display = ('id', 'full_name')
    
        ...
    
        def full_name(self, obj):
            return u'%s %s' % (obj.first_name, obj.last_name)
    

    或在您的Model 中(如果显示在管理员以外的其他场景中有用,则更好,否则使用ModelAdmin):

    class MyModel(models.Model):
        ...
        def get_full_name(self):
            return u'%s %s' % (self.first_name, self.last_name)
    
    class MyModelAdmin(admin.ModelAdmin):
        ...
        list_display = ('id', 'get_full_name')
    

    如果您希望它是可订购的,您需要在方法上定义admin_order_field,但您必须选择一个字段用于订购:

    def full_name(self, obj):
        return u'%s %s' % (obj.first_name, obj.last_name)
    full_name.admin_order_field = 'last_name'
    

    如果需要包含 HTML,请在方法上指定allow_tags=True

    def full_name(self, obj):
        return u'%s %s' % (obj.first_name, obj.last_name)
    full_name.allow_tags = True
    

    最后,Django 会根据方法名自动组成标签;在这种情况下,它将最终成为“全名”。如果你想要不同的东西,你可以使用short_description:

    def full_name(self, obj):
        return u'%s %s' % (obj.first_name, obj.last_name)
    full_name.short_description = "User's Full Name"
    

    【讨论】:

    • 你解释的方式很好。感谢您简洁的解释。它看起来是一个不错的解决方案,但它会创建一个新的单列,其中包含从不同列合并的值。但我只想要一个标签,该标签将放置在一组具有自己标签的列上。如果您使用普通模板,这很容易实现。但我想自己实现这个 django 的管理部分。
    • 通过 admin contrib 包提供的任何方式都无法做到这一点。您也许可以通过对模板和视图代码进行一些严重更改来拼凑出一个解决方案,但这比它的价值更麻烦。
    • 您的解决方案是解决此问题的最佳解决方案。感谢您的回答。如果需要,我将在未来的项目中使用此解决方案。
    【解决方案2】:

    目前无法按照您在管理员列表视图中描述的确切方式对列进行分组。

    实现几乎相同结果的替代方法是 Chris Pratt 给你的答案。

    【讨论】:

    • 我想知道是否有办法显示我问的方式。我能想到的其他方式是使用 jQuery/Javascript 进行 DOM 操作。但是当架构发生变化时将很难管理。
    猜你喜欢
    • 2015-07-03
    • 2020-11-09
    • 2014-01-23
    • 2011-07-09
    • 1970-01-01
    • 2010-12-31
    • 2020-11-16
    • 2011-01-15
    • 2017-03-02
    相关资源
    最近更新 更多