0 Tage Serie
python / expert
Snippet

Django Admin Erweiterte Anpassung mit ModelAdmin Hooks und List Display

Djangos ModelAdmin Klasse bietet umfangreiche Anpassungshooks für die Admin-Oberfläche. list_display definiert welche Spalten in der Listenansicht erscheinen, einschließlich benutzerdefinierter Methoden die Daten formatieren. list_filter erstellt eine Seitenleiste mit Filteroptionen nach angegebenen Feldern. search_fields ermöglicht globale Suche über angegebene Model- und verknüpfte Felder mit __-Notation für Lookups. readonly_fields markiert Felder als nicht bearbeitbar. fieldsets gruppiert Felder in einklappbare Abschnitte. Benutzerdefinierte Methoden-Attribute wie short_description und admin_order_field steuern Spaltenheader-Anzeige und Sortierverhalten. Die format_html Funktion rendert sicher HTML in Admin-Templates.

snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from django.contrib import admin
from django.utils.html import format_html
from django.utils import timezone
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'author_name', 'status_badge', 'created_at', 'word_count_display')
list_filter = ('status', 'author', 'created_at')
search_fields = ('title', 'content', 'author__name')
readonly_fields = ('created_at', 'updated_at', 'word_count_display')
date_hierarchy = 'created_at'
ordering = ('-created_at',)
fieldsets = (
('Content', {'fields': ('title', 'slug', 'content', 'summary')}),
('Metadata', {'fields': ('author', 'status', 'published_at')}),
('System', {'fields': ('created_at', 'updated_at'), 'classes': ('collapse',)}),
)
def author_name(self, obj):
return obj.author.name
author_name.short_description = 'Author'
author_name.admin_order_field = 'author__name'
def status_badge(self, obj):
colors = {'draft': '#6c757d', 'published': '#28a745', 'archived': '#dc3545'}
return format_html(
'<span style="background:{};color:white;padding:3px 8px;border-radius:3px">{}</span>',
colors.get(obj.status, '#6c757d'), obj.status.upper()
)
status_badge.short_description = 'Status'
def word_count_display(self, obj):
return f"{len(obj.content.split())} words"
word_count_display.short_description = 'Word Count'
django
Erklärung
1
list_display = ('title', 'author_name', 'status_badge', ...)
Definiert Spalten in der Listenansicht; benutzerdefinierte Methoden rendern benutzerdefinierte Spalten
2
list_filter = ('status', 'author', 'created_at')
Erstellt Seitenleisten-Filter-Widgets für angegebene Felder
3
search_fields = ('title', 'content', 'author__name')
Aktiviert Suchleiste; __ ermöglicht Suche über verknüpfte Modellfelder
4
readonly_fields = ('created_at', 'updated_at', 'word_count_display')
Markiert Felder als schreibgeschützt im Bearbeitungsformular
5
fieldsets = (('Content', {'fields': ...}), ...)
Gruppiert Felder in einklappbare Admin-Abschnitte
6
author_name.short_description = 'Author'
Setzt menschenlesbaren Spaltenheader-Text
7
author_name.admin_order_field = 'author__name'
Ermöglicht Sortierung nach verknüpftem Feld author__name
8
format_html(...)
Rendert sicher HTML in Admin ohne XSS-Schwachstellen