更改列表

假設你有一個簡單的 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'