Django Web Framework
● High-level Python Web framework● MVC
Django admin
● Automatic interface● For site administrators● Reads model metadata● Customizing:
○ Layout○ Filters○ Actions
Model example
class Article(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL)
title = models.CharField(max_length=200)
lead_text = models.CharField(max_length=300)
content = models.TextField()
publish_date = models.DateTimeField()
image = models.ImageField()
section = models.ManyToManyField(Section)
def __str__(self):
return self.title
Model metadata
class Article(models.Model):
...
class Meta:
verbose_name = _('Article')
verbose_name_plural = _('Articles')
ordering = ('-publish_date',)
Default admin interface
app/admin.py
from django.contrib import adminfrom articles.models import Article
admin.site.register(Article)
Customizing objects list: list_display
● List objects page○ Default: str() of each object
● list_display option
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date']
● list_display_links option
Customizing objects list: empty_value_display
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date']
empty_value_display = '(unknown)'
Customizing objects list: list_filter
● Model field● Foreign key attribute lookup● Custom querysets● preserve_filters option
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date']
empty_value_display = '(unknown)'
list_filter = ['section', PublishedListFilter]
Customizing objects list: list_filter
class PublishedListFilter(admin.SimpleListFilter):title = 'published'parameter_name = 'publish_date'
def lookups(self, request, model_admin):return (
('published', 'published'),('not_published', 'not published')
)
def queryset(self, request, queryset):if self.value() == 'published':
return queryset.filter(publish_date__isnull=False)if self.value() == 'not_published':
return queryset.filter(publish_date__isnull=True)
Customizing objects list: date_hierarchy
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date']
empty_value_display = '(unknown)'
list_filter = ['section', PublishedListFilter]
date_hierarchy = 'publish_date'
Customizing objects list: search_fields
● Model field● Foreign key attribute lookup● Operators
○ ^ to match starting at the beginning of the field○ = for case-insensitive exact matching○ @ operator to perform a full text match
@admin.register(Article)class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'publish_date']empty_value_display = '(unknown)'list_filter = ['section', PublishedListFilter]date_hierarchy = 'publish_date'search_fields = ['title']
Customizing objects list: list_editable
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'lead_text','publish_date']
empty_value_display = '(unknown)'
list_filter = ['section', PublishedListFilter]
date_hierarchy = 'publish_date'
search_fields = ['title']
list_editable = ['lead_text']
Default edit interface
● Default buttons○ Delete○ Save and add another○ Save and continue editing○ Save
● save_as option: if set to True “Save as new” replaces “Save and add another” button
Customizing edit interface: fields
● fields option ○ List of fields in model edit form○ Change order○ Group in same line
@admin.register(Article)class ArticleAdmin(admin.ModelAdmin):
fields = ['author',('title', 'lead_text'),'content',('publish_date', 'image'),'section'
]
Customizing edit interface
● exclude option○ List of fields not shown in edit form
● readonly_fields option○ Field or method
● fieldsets option○ Group fields
● form option○ Replace default Form with custom
● view_on_site option○ Boolean - calls get_absolute_url○ Callable
Customizing edit interface: many to many
● filter_horizontal option ● filter_vertical option
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
…
filter_horizontal = ['section']
Customizing edit interface: inlines
● TabularInline● StackedInline
class GalleryInline(admin.TabularInline):model = GalleyImageextra = 2
@admin.register(Article)class ArticleAdmin(admin.ModelAdmin):
...
filter_horizontal = ['section']inlines = [GalleryInline]
Customizing admin interface: actions
● Functions that get called with a list of objects selected on the change list page● Simple logic: use function● Complex logic: redirect the user to another view in function
def delete_publish_date(modeladmin, request, queryset):queryset.update(publish_date=None)
delete_publish_date.short_description = "Delete publisheddate for selected articles"
@admin.register(Article)class ArticleAdmin(admin.ModelAdmin):
…
actions = [delete_publish_date]
Optimization
● show_full_result_count option in list view○ Eliminates expensive count
● list_select_related option in list view○ Django will use select_related in query
● raw_id_fields option in edit view
There is more
● Overriding default templates● Overriding methods● History view● Decorator @staff_member_required