那些年,我用 django admin 接的案子

29
Big Data, Better Decision Michelle Leu @flywindy PyCon Taiwan 2016 #PyConTW2016 那些年, 我⽤ Django Admin 接的案⼦

Upload: flywindy

Post on 22-Feb-2017

834 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: 那些年,我用 Django Admin 接的案子

Big Data, Better Decision

Michelle Leu @flywindy

PyCon Taiwan 2016 #PyConTW2016

那些年,�我⽤ Django Admin 接的案⼦

Page 2: 那些年,我用 Django Admin 接的案子
Page 3: 那些年,我用 Django Admin 接的案子

Once upon the time…

Facial bed – The story has just begun

•  A chain of SPA (10+ branches) •  Paper work -> Computer record

Page 4: 那些年,我用 Django Admin 接的案子

Why use Django Admin?

Django Admin - the automatic admin interface •  Django 1.9 - big updates after 8 years •  No requirements of design •  It’s all about records

Page 5: 那些年,我用 Django Admin 接的案子

Agenda

•  Django Admin Overview

•  Scenario •  Userpermission

•  FilterBirthday•  Membership

•  Customized UI

Page 6: 那些年,我用 Django Admin 接的案子

Django Admin Overview

AdminSite

ModelAdmin ChangeList

Page 7: 那些年,我用 Django Admin 接的案子

Scenario

Account Branch m n

classAccount(models.Model):name=models.CharField(max_length=50)birthday=models.CharField(max_length=5,blank=True,default='00.00',)mobile=models.CharField(max_length=20)email=models.EmailField(blank=True)…...branches=models.ManyToManyField(Branch,through='Membership')

classBranch(models.Model):name=models.CharField(max_length=50)phone=models.CharField(max_length=15,blank=True)address=models.CharField(max_length=255,blank=True)

Page 8: 那些年,我用 Django Admin 接的案子

User permission

Users: •  Superuser – user management •  Headquarters – all models •  Brand managers – part of models about

records

Page 9: 那些年,我用 Django Admin 接的案子

Custom AdminSite

Why? •  Root and login templates •  Difference Admin URLs

hLp://localhost:8000/admin/

hLp://localhost:8000/

Page 10: 那些年,我用 Django Admin 接的案子

Custom AdminSite

Step: 1. Create an instance of your AdminSite subclass

#core/admin.pyfromdjango.contribimportadminclassMyAdminSite(admin.AdminSite):site_header='MyAdmin'site_url=Noneindex_template='admin/index.html'admin_site=MyAdminSite(name='myadmin')admin_site.disable_acSon('delete_selected')

Page 11: 那些年,我用 Django Admin 接的案子

Custom AdminSite

Step: 2. Register your models and ModelAdmin subclasses with it instead of using the default.

•  admin_site.register(Account,AccountAdmin)•  @admin.register(Account,site=admin_site)

classAccountAdmin(admin.ModelAdmin):…

#account/admin.py#fromdjango.contribimportadmin#admin.site.register(Account)fromcore.adminimportadmin_siteadmin_site.register(Account)

#project/urls.pyfromdjango.contribimportadminfromcore.adminimportadmin_siteurlpaLerns=[url(r'^',admin_site.urls),url(r'^admin/',admin.site.urls),]

3. Update urls.py

Page 12: 那些年,我用 Django Admin 接的案子

Filter Birthday

By months •  SimpleListFilter •  list_filter

#account/admin.pyclassBirthdayListFilter(admin.SimpleListFilter):Stle='Birthdaybymonth'parameter_name='birthday'deflookups(self,request,model_admin):return(('01','Jan'),('02','Feb'),…('12','Dec'),)defqueryset(self,request,queryset):ifself.value():month=self.value()+'.'returnqueryset.filter(birthday__contains=month)classAccountAdmin(admin.ModelAdmin):list_filter=(BirthdayListFilter)

Page 13: 那些年,我用 Django Admin 接的案子

Membership

•  Many-to-many field #account/models.pyclassMembership(models.Model):member_id=models.CharField(max_length=20,default='',blank=True)account=models.ForeignKey(Account)branch=models.ForeignKey(Branch)def__str__(self):returnself.member_id

Account Branch m n

Membership

Page 14: 那些年,我用 Django Admin 接的案子

Membership

•  list_display •  list_display_links

•  A string representing an attribute on the ModelAdmin.

Account Branch m n

Membership

#account/admin.pyclassAccountAdmin(admin.ModelAdmin):list_display=('member_id','name','birthday','mobile')list_display_links=('member_id','name')defmember_id(self,obj):memberships=Membership.objects.filter(account=obj,branch__name=self.request.user.first_name)ifmemberships.count()>0:returnmemberships[0].member_idreturn''

Page 15: 那些年,我用 Django Admin 接的案子

Membership

InlineModelAdmin •  TabularInline •  StackedInline •  options

•  extra•  max_num•  min_num

#account/admin.pyclassMembershipInline(admin.StackedInline):model=Membershipextra=0min_num=1classAccountAdmin(admin.ModelAdmin):inlines=(MembershipInline,)

Page 16: 那些年,我用 Django Admin 接的案子

Customized UI

Page 17: 那些年,我用 Django Admin 接的案子

Before overwriting

•  fieldsets

classAccountAdmin(admin.ModelAdmin):fieldsets=((None,{'fields':('name','mobile','birthday',('address','email'),)}),('experience',{'classes':('collapse',),'fields':('start_date','first_branch','source'),}),)

Page 18: 那些年,我用 Django Admin 接的案子

Before overwriting

•  date_hierarchy •  DateFieldorDateTimeField

#account/admin.pyclassAccountAdmin(admin.ModelAdmin):date_hierarchy='start_date'

Page 19: 那些年,我用 Django Admin 接的案子

Before overwriting

•  empty_value_display •  NewinDjango1.9

•  Thedefaultvalueis-(adash)

•  format_html

•  raw_id_fields •  ChangeintoanInputwidgetforeitheraForeignKeyor

ManyToManyField

defcolored_name(self):returnformat_html('<spanstyle="color:#{};">{}{}</span>',self.color_code,self.first_name,self.last_name)

Page 20: 那些年,我用 Django Admin 接的案子

Before overwriting

•  list_editable •  Anyfieldinlist_editablemustalsobeinlist_display.Youcan’teditafieldthat’snotdisplayed!•  Thesamefieldcan’tbelistedinbothlist_editableandlist_display_links–afieldcan’tbebothaform

andalink.

#account/admin.pyclassAccountAdmin(admin.ModelAdmin):list_display=('member_id','name','birthday','mobile')list_display_links=('member_id','name')list_editable=('birthday','mobile')

Page 21: 那些年,我用 Django Admin 接的案子

Renaming

•  Model field - verbose_name •  Models - Meta class

•  verbose_name•  verbose_name_plural

•  App - AppConfig (Django 1.7+)

•  A string representing an attribute on the ModelAdmin ex: member_id •  short_descripSon

Page 22: 那些年,我用 Django Admin 接的案子

Template Architecture

https://github.com/django/django/tree/master/django/contrib/admin/templates/admin base.html

base_site.htmlIndex.html

app_index.htmllogin.htmlchange_list.htmlchange_form.html…

Page 23: 那些年,我用 Django Admin 接的案子

Overwrite templates

1.  Set up your projects admin template directories •  templates/admin/

2.  To override an admin template for a specific app •  templates/admin/my_app/

3.  Just overriding not replacing •  block

4.  Templates which may be overridden per app or model •  app_index.html,change_form.htm,change_list.htm,deleteconfirmaSon.html,

object_history.html

5.  Root and login templates – AdminSite •  login_template,logout_template,password_change_template…

Page 24: 那些年,我用 Django Admin 接的案子

How to customize JS and CSS

a.  Overwrite base.html b.  Define assets in ModelAdmin (the Media class)

classArScleAdmin(admin.ModelAdmin):classMedia:css={"all":("my_styles.css",)}js=("my_code.js",)

Page 25: 那些年,我用 Django Admin 接的案子

django-admin-views

Easily link custom admin views and direct URLs into the Django admin

Page 26: 那些年,我用 Django Admin 接的案子

Django admin packages

https://www.djangopackages.com •  Django Suit - Django Girls Website •  Django JET

Page 27: 那些年,我用 Django Admin 接的案子

Summary

When to use Django Admin •  Design

•  writeyouviewandtmeplate

•  No design •  DjangoAdminpackage•  Customizeyourdjangoadmin

Next •  Python Web Meetup

Page 28: 那些年,我用 Django Admin 接的案子

PyCon Taiwan 2016 Talks

R0

Day216:20-16:45Writeyourownmicrodataprocessingframeworkinpython

CEO CTO GM

DjangoGirlsTaipeihLp://djangogirls.org/taipei2016.06.04BoFXPyLadies2016.07.09DjangoGirlsWorkshop#4

Day310:30–10:55Python的 50道陰影

Day311:00–11:25AnalyzingChineseLyricswithPython

Page 29: 那些年,我用 Django Admin 接的案子

THANK YOU

[email protected] / 886 2 2752 8851

Unit.3, 11F., No.48, Fuxing N.Rd., Zhongshan Dist., Taipei City 104, Taiwan