更改列表
假设你有一个简单的 myblog
应用程序,其中包含以下型号:
from django.conf import settings
from django.utils import timezone
class Article(models.Model):
title = models.CharField(max_length=70)
slug = models.SlugField(max_length=70, unique=True)
author = models.ForeignKey(settings.AUTH_USER_MODEL, models.PROTECT)
date_published = models.DateTimeField(default=timezone.now)
is_draft = models.BooleanField(default=True)
content = models.TextField()
Django Admin 的更改列表是列出给定模型的所有对象的页面。
from django.contrib import admin
from myblog.models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
pass
默认情况下,它将使用模型的 __str__()
方法(如果你在 python2 上使用 __unicode__()
)来显示对象 name
。这意味着如果你没有覆盖它,你将看到一个文章列表,所有文章都名为文章对象。要更改此行为,你可以设置 __str__()
方法:
class Article(models.Model):
def __str__(self):
return self.title
现在,你的所有文章都应该具有不同的名称,并且比文章对象更明确。
但是,你可能希望在此列表中显示其他数据。为此,使用 list_display
:
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['__str__', 'author', 'date_published', 'is_draft']
list_display
不仅限于模型字段和属性。它也可以是你的方法:
from django.forms.utils import flatatt
from django.urls import reverse
from django.utils.html import format_html
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'author_link', 'date_published', 'is_draft']
def author_link(self, obj):
author = obj.author
opts = author._meta
route = '{}_{}_change'.format(opts.app_label, opts.model_name)
author_edit_url = reverse(route, args=[author.pk])
return format_html(
'<a{}>{}</a>', flatatt({'href': author_edit_url}), author.first_name)
# Set the column name in the change list
author_link.short_description = "Author"
# Set the field to use when ordering using this column
author_link.admin_order_field = 'author__firstname'