django admin (python meeutp)

33
Django admin Python meetup Ines Jelovac Zagreb, 14 June 2016

Upload: ines-jelovac

Post on 09-Jan-2017

180 views

Category:

Technology


0 download

TRANSCRIPT

Django adminPython meetup

Ines JelovacZagreb, 14 June 2016

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)

Default list interface

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: list_display

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: empty_value_display

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: list_filter

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: date_hierarchy

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: search_fields

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']

Customizing objects list: list_editable

Default edit interface

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

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: filter_horizontal

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 edit interface: inlines

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]

Customizing edit interface: actions

Customizing admin interface: actions

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