-
设置
list_display来控制在管理员的变更列表页面上显示哪些字段。例子:
list_display = ('first_name', 'last_name')如果您不设置
list_display,管理站点将显示单个列,其中显示每个对象的__str__()表示。list_display中可以使用四种类型的值。除了最简单的之外,所有的都可以使用装饰器,它用于自定义字段的呈现方式:display()-
模型字段的名称。例如:
class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name') -
接受一个参数的可调用对象,即模型实例。例如:
@admin.display(description='Name') def upper_case_name(obj): return ("%s %s" % (obj.first_name, obj.last_name)).upper() class PersonAdmin(admin.ModelAdmin): list_display = (upper_case_name,) -
表示
ModelAdmin方法的字符串,该方法接受一个参数,即模型实例。例如:class PersonAdmin(admin.ModelAdmin): list_display = ('upper_case_name',) @admin.display(description='Name') def upper_case_name(self, obj): return ("%s %s" % (obj.first_name, obj.last_name)).upper() -
表示模型属性或方法的字符串(没有任何必需的参数)。例如:
from django.contrib import admin from django.db import models class Person(models.Model): name = models.CharField(max_length=50) birthday = models.DateField() @admin.display(description='Birth decade') def decade_born_in(self): return '%d’s' % (self.birthday.year // 10 * 10) class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'decade_born_in')
关于
list_display的一些特殊情况需要注意:-
如果该字段是
ForeignKey,Django 将显示相关对象的__str__()。 -
不支持
ManyToManyField字段,因为这需要为表中的每一行执行单独的 SQL 语句。如果您仍然想这样做,请给您的模型一个自定义方法,并将该方法的名称添加到list_display。 (有关list_display中自定义方法的更多信息,请参见下文。) -
如果该字段是
BooleanField,Django 将显示一个漂亮的 “yes”, “no” 或 “unknown” 图标而不是True、False或None。 -
如果给定的字符串是模型的方法,
ModelAdmin或可调用的,Django 将默认输出HTML-escape。要转义用户输入并允许您自己的未转义标签,请使用。format_html()这是一个完整的示例模型:
from django.contrib import admin from django.db import models from django.utils.html import format_html class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) color_code = models.CharField(max_length=6) @admin.display def colored_name(self): return format_html( '<span style="color: #{};">{} {}</span>', self.color_code, self.first_name, self.last_name, ) class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'colored_name') -
正如一些示例已经展示的那样,当使用可调用对象、模型方法或
ModelAdmin方法时,您可以通过使用装饰器包装可调用对象并传递display()description参数来自定义列的标题。在 Django 3.2 中更改:装饰器的display()description参数相当于在以前的版本中直接在显示函数上设置short_description属性。仍然支持直接设置属性以实现向后兼容性。 -
如果字段的值为
None、空字符串或没有元素的可迭代对象,Django 将显示-(破折号)。您可以使用覆盖它:AdminSite.empty_value_displayfrom django.contrib import admin admin.site.empty_value_display = '(None)'您也可以使用
:ModelAdmin.empty_value_displayclass PersonAdmin(admin.ModelAdmin): empty_value_display = 'unknown'或者在字段级别:
class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'birth_date_view') @admin.display(empty_value='unknown') def birth_date_view(self, obj): return obj.birth_date在 Django 3.2 中更改:装饰器的display()empty_value参数相当于在以前的版本中直接在显示函数上设置empty_value_display属性。仍然支持直接设置属性以实现向后兼容性。 -
如果给定的字符串是模型的方法、
ModelAdmin或返回True、False或None的可调用函数,则 Django 将显示一个漂亮的 “yes”, “no” 或 “unknown” 图标使用装饰器传递display()boolean参数并将值设置为True的方法:from django.contrib import admin from django.db import models class Person(models.Model): first_name = models.CharField(max_length=50) birthday = models.DateField() @admin.display(boolean=True) def born_in_fifties(self): return 1950 <= self.birthday.year < 1960 class PersonAdmin(admin.ModelAdmin): list_display = ('name', 'born_in_fifties')在 Django 3.2 中更改:装饰器的display()boolean参数相当于在以前的版本中直接在显示函数上设置boolean属性。仍然支持直接设置属性以实现向后兼容性。 -
__str__()方法在list_display中与任何其他模型方法一样有效,因此完全可以这样做:list_display = ('__str__', 'some_other_field') -
通常,不是实际数据库字段的
list_display元素不能用于排序(因为 Django 在数据库级别进行所有排序)。但是,如果
list_display的元素表示某个数据库字段,则可以通过在方法上使用装饰器并传递display()ordering参数来指示这一事实:from django.contrib import admin from django.db import models from django.utils.html import format_html class Person(models.Model): first_name = models.CharField(max_length=50) color_code = models.CharField(max_length=6) @admin.display(ordering='first_name') def colored_first_name(self): return format_html( '<span style="color: #{};">{}</span>', self.color_code, self.first_name, ) class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'colored_first_name')上面将告诉 Django 在管理员中尝试按
colored_first_name排序时按first_name字段排序。要使用
ordering参数指示降序,您可以在字段名称上使用连字符前缀。使用上面的例子,这看起来像:@admin.display(ordering='-first_name')ordering参数支持查询查找以按相关模型上的值排序。此示例在列表显示中包含 “author first name” 列,并允许按名字对其进行排序:class Blog(models.Model): title = models.CharField(max_length=255) author = models.ForeignKey(Person, on_delete=models.CASCADE) class BlogAdmin(admin.ModelAdmin): list_display = ('title', 'author', 'author_first_name') @admin.display(ordering='author__first_name') def author_first_name(self, obj): return obj.author.first_name查询表达式可以与
ordering参数一起使用:from django.db.models import Value from django.db.models.functions import Concat class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) @admin.display(ordering=Concat('first_name', Value(' '), 'last_name')) def full_name(self): return self.first_name + ' ' + self.last_name在 Django 3.2 中更改:装饰器的display()ordering参数相当于在以前的版本中直接在显示函数上设置admin_order_field属性。仍然支持直接设置属性以实现向后兼容性。 -
list_display的元素也可以是属性:class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) @property @admin.display( ordering='last_name', description='Full name of the person', ) def full_name(self): return self.first_name + ' ' + self.last_name class PersonAdmin(admin.ModelAdmin): list_display = ('full_name',)请注意,
@property必须高于@display。如果您使用旧方法 - 直接设置与显示相关的属性而不是使用装饰器 - 请注意必须使用display()property()函数而不是@property装饰器:def my_property(self): return self.first_name + ' ' + self.last_name my_property.short_description = "Full name of the person" my_property.admin_order_field = 'last_name' full_name = property(my_property) -
list_display中的字段名称也将在 HTML 输出中显示为 CSS 类,在每个<th>元素上以column-<field_name>的形式出现。例如,这可用于设置 CSS 文件中的列宽。 -
Django 将尝试按以下顺序解释
list_display的每个元素:- 模型的一个字段。
- 一个可调用的。
- 表示
ModelAdmin属性的字符串。 - 表示模型属性的字符串。
例如,如果您将
first_name作为模型字段并作为ModelAdmin属性,则将使用模型字段。
-
本文介绍 django.contrib.admin.ModelAdmin.list_display 的用法。
声明
ModelAdmin.list_display
相关用法
- Python Django ModelAdmin.list_display_links用法及代码示例
- Python Django ModelAdmin.list_select_related用法及代码示例
- Python Django ModelAdmin.list_filter用法及代码示例
- Python Django ModelAdmin.get_changeform_initial_data用法及代码示例
- Python Django ModelAdmin.get_formset_kwargs用法及代码示例
- Python Django ModelAdmin.get_urls用法及代码示例
- Python Django ModelAdmin.formfield_for_choice_field用法及代码示例
- Python Django ModelAdmin.readonly_fields用法及代码示例
- Python Django ModelAdmin.prepopulated_fields用法及代码示例
- Python Django ModelAdmin.empty_value_display用法及代码示例
- Python Django ModelAdmin.get_form用法及代码示例
- Python Django ModelAdmin.formfield_for_foreignkey用法及代码示例
- Python Django ModelAdmin.get_search_results用法及代码示例
- Python Django ModelAdmin.autocomplete_fields用法及代码示例
- Python Django ModelAdmin.date_hierarchy用法及代码示例
- Python Django ModelAdmin.get_formsets_with_inlines用法及代码示例
- Python Django ModelAdmin.save_model用法及代码示例
- Python Django ModelAdmin.view_on_site用法及代码示例
- Python Django ModelAdmin.get_inline_instances用法及代码示例
- Python Django ModelAdmin.formfield_overrides用法及代码示例
- Python Django ModelAdmin.get_changelist_formset用法及代码示例
- Python Django ModelAdmin.get_sortable_by用法及代码示例
- Python Django ModelAdmin.fields用法及代码示例
- Python Django ModelAdmin.get_ordering用法及代码示例
- Python Django ModelAdmin.get_changelist_form用法及代码示例
注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.contrib.admin.ModelAdmin.list_display。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
