django学习日志——mydoit之django admin能做些什么(三)

        本人的前端技术很烂,但是不能让这个成为我学习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的一小部分功能,先介绍到这里,未完待续。。。。。

阅读更多
个人分类: Python Django mydoit
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭