本人的前端技术很烂,但是不能让这个成为我学习django的阻碍。所幸的是,django本身提供了一个非常好的admin的后台管理界面。让javascript技术基本为0的我省了很多事情。django受人诟病的一个理由是管得太多,但对于一个初学者来说,管得太多是一件好事。
让我们来看看admin能做些什么。
最简单的是,你把做好的module,直接托管给admin。例如我的mydoit,简单的说就是一个to-do list的小网站。我把最重要的module,task托管到admin后,就有添加、修改和删除数据的功能了。方法很简单,就是添加一个admin.py的文件,代码如下:
from django.contrib import admin
from task.models import *
class TaskInline(admin.StackedInline):
model = Task
extra = 0
class TagInline(admin.TabularInline):#admin.StackedInline):
model = Task.tag.through
extra = 1
class ProjectAdmin(admin.ModelAdmin):
inlines = [TaskInline]
class TaskAdmin(admin.ModelAdmin):
inlines = [TagInline]
class EventAdmin(admin.ModelAdmin):
inlines = [TaskInline]
class ContextAdmin(admin.ModelAdmin):
inlines = [TaskInline]
class TagAdmin(admin.ModelAdmin):
inlines = [TaskInline]
admin.site.register(Task, TaskAdmin)
admin.site.register(Project, ProjectAdmin)
admin.site.register(Context, ContextAdmin)
admin.site.register(Event, EventAdmin)
就可以看到admin界面如下:
homepage:
选择add, 就可以看到,然后添加一个task:
点击保存后我们就可以看到下面的list:
对于上面的页面,我们可以看到,list只有task name这一列,可以通过添加list_display这个属性,来控制显示的列,如下:
class TaskAdmin(admin.ModelAdmin):
inlines = [TagInline]
list_display = ('name', 'project', 'deadline')
显示页面就会变成:
django的文档上还给了一个有趣的例子,例如,根据出生年份,可以在页面上控制显示为几零后,在我的mydoit中,没啥意义,但是这个功能本身很有意义。修改models.py代码如下,在Task的类中,添加:
def decade_born_in(self):
return self.deadline.strftime('%Y')[:3] + "0's"
decade_born_in.short_description = 'Birth decade'
在admin.py中,修改TaskAdmin:
class TaskAdmin(admin.ModelAdmin):
inlines = [TagInline]
list_display = ('name', 'project', 'deadline', 'decade_born_in')
就可以看到显示界面如下,并且还能自动排序(如果字段是一个外键,那么就会显示那个medel类的__unicode__值;如果是manytomany的field,很抱歉,list无法显示):
类似的,你可以让显示变成大写的,这是一个django文档的例子:
class PersonAdmin(admin.ModelAdmin):
list_display = ('upper_case_name',)
def upper_case_name(self, obj):
return ("%s %s" % (obj.first_name, obj.last_name)).upper()
upper_case_name.short_description = 'Name'
又或者把字体变成其他颜色:
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
color_code = models.CharField(max_length=6)
def colored_name(self):
return '<span style="color: #%s;">%s %s</span>' % (self.color_code, self.first_name, self.last_name)
colored_name.allow_tags = True
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'colored_name')
如果字段是一个布尔值,admin甚至会提供一个on/off的图标。
一般来说,如果字段不是数据库字段,admin就不能按该字段自动排序,但是,如果你用的是数据库字段,但是给他指定了另外的名字,例如上面例子的colored_name,你可以通过添加一个 admin_order_field的属性,来指定排序的字段:
class Person(models.Model):
first_name = models.CharField(max_length=50)
color_code = models.CharField(max_length=6)
def colored_first_name(self):
return '<span style="color: #%s;">%s</span>' % (self.color_code, self.first_name)
colored_first_name.allow_tags = True
colored_first_name.admin_order_field = 'first_name'
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'colored_first_name')
在例子中,我们可以看到,只有第一列的字段是蓝色的,是一个link,点击这个link,就好进入编辑页面,如上图的“TestDrive”,但是,如果你想点击其
他字段进入编辑页面,也是可以的,只要添加一个 list_display_links属性:
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'birthday')
list_display_links = ('first_name', 'last_name')
每次到编辑页面编辑很麻烦,一个list_editable的属性搞定,就能让你直接在list那里编辑。
上面只是admin的一小部分功能,先介绍到这里,未完待续。。。。。