Upload
flywindy
View
834
Download
4
Embed Size (px)
Citation preview
Big Data, Better Decision
Michelle Leu @flywindy
PyCon Taiwan 2016 #PyConTW2016
那些年,�我⽤ Django Admin 接的案⼦
Once upon the time…
Facial bed – The story has just begun
• A chain of SPA (10+ branches) • Paper work -> Computer record
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
Agenda
• Django Admin Overview
• Scenario • Userpermission
• FilterBirthday• Membership
• Customized UI
Django Admin Overview
AdminSite
ModelAdmin ChangeList
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)
User permission
Users: • Superuser – user management • Headquarters – all models • Brand managers – part of models about
records
Custom AdminSite
Why? • Root and login templates • Difference Admin URLs
hLp://localhost:8000/admin/
hLp://localhost:8000/
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')
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
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)
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
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''
Membership
InlineModelAdmin • TabularInline • StackedInline • options
• extra• max_num• min_num
#account/admin.pyclassMembershipInline(admin.StackedInline):model=Membershipextra=0min_num=1classAccountAdmin(admin.ModelAdmin):inlines=(MembershipInline,)
Customized UI
Before overwriting
• fieldsets
classAccountAdmin(admin.ModelAdmin):fieldsets=((None,{'fields':('name','mobile','birthday',('address','email'),)}),('experience',{'classes':('collapse',),'fields':('start_date','first_branch','source'),}),)
Before overwriting
• date_hierarchy • DateFieldorDateTimeField
#account/admin.pyclassAccountAdmin(admin.ModelAdmin):date_hierarchy='start_date'
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)
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')
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
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…
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…
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",)
django-admin-views
Easily link custom admin views and direct URLs into the Django admin
Django admin packages
https://www.djangopackages.com • Django Suit - Django Girls Website • Django JET
Summary
When to use Django Admin • Design
• writeyouviewandtmeplate
• No design • DjangoAdminpackage• Customizeyourdjangoadmin
Next • Python Web Meetup
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
THANK YOU
[email protected] / 886 2 2752 8851
Unit.3, 11F., No.48, Fuxing N.Rd., Zhongshan Dist., Taipei City 104, Taiwan