Django - 在django管理部分中对列进行分组

时间:2011-12-29 13:55:34

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

我需要django admin中的组列用于给定的db表。我将采用样本表'Student',其中包含列id,first_name,last_name,address1,address2,address3。所以分组将是这样的:

ID - > ID

NAME - > first_name,last_name

ADDRESS - > address1,address2,address3

当我查看表中的数据行时,此目的是获取列集的标签。所以当我在Django的管理部分中检查为Student表获取的行时,我应该看到类似这样的内容:

---------------------------------------------------------------------------------
| ID   | NAME                   | ADDRESS                                       |
---------------------------------------------------------------------------------
| ID   | First Name | Last Name | Address 1       | Address 2       | Address 3 |
---------------------------------------------------------------------------------
| 1    | Ron        | DCunha    | 1st Cross       | Valencia        | Mangalore |
--------------------------------------------------------------------------------|
| 2    | Akash      | Attavar   | Mark Street     | Attavar         | Mangalore |
---------------------------------------------------------------------------------

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

2 个答案:

答案 0 :(得分:1)

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

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中的OR(如果显示在除管理员之外的其他方案中有用,则更好,否则使用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"

答案 1 :(得分:0)

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

克拉普拉特给你的答案是你获得几乎相同结果的替代方案。