Django笔记 2

一、使用admin模块

django里自带了admin模块,可以使用它来在后台管理数据,如添加或删除数据,还可以添加或删除用户和组等等。

要想使用这个模块,首先需要去掉几个注释:

  1. 在INSTALLED_APP里面添加或者注释掉django.contrib.admin
  2. 在urls里面注释掉 from django.contrib import admin和admin.autodiscover()这两行
  3. 同时注释掉下面的url(r'^admin/',include(admin.site.urls))

到这里,可以先runserver,然后到 http://localhost:8000/admin/ 里登录了。但是还没有任何我们创建的model的信息,所以为了管理polls应用,需要在polls文件夹下添加一个admin.py文件:

from django.contrib import admin
from polls.models import Poll

admin.site.register(Poll)

然后重启一下server就可以看到Poll模块出现在admin界面里了,然后就可以在里面修改。

 

二、自定义admin表单

admin的很多东西都是可以自定义的,比如,这里的polls,即对于"投票"这个模型,我们可以决定在admin的表单里哪些信息可以显示,哪些不行。该怎么办呢?自定义一个admin class就行了,然后作为参数传递给register方法:

#polls/admin.py
from django.contrib import admin
from polls.models import Poll

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
    (None, {’fields’: [’question’]}),
    (’Date information’, {’fields’: [’pub_date’]}),
    ]

admin.site.register(Poll, PollAdmin)

上面的代码通过传入fieldsets变量,确定了显示的内容:question和pub_date,其中pub_date这一部分还有一个标题:Date information。

我们知道,选项Choice这个模块有一个属性poll,它在定义时指明了外键是Poll,也就是说,在新建一个选项Choice的时候,需要从很多个现有的Poll实例中选择其中一个。当然,如果目前还没有那个Poll,需要先新建一个Poll,然后再指向它。这样一个过程可以转换为另一种方法,即在新建一个投票Poll的时候,顺便把指向它的所有选项Choice都新建了,这样显得更简单一些,下面的代码就是实现这个功能的:新建一个Poll的同时新建多个Choice(默认是三个)

from django.contrib import admin
from polls.models import Poll,Choice

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
    (None, {’fields’: [’question’]}),
    (’Date information’, {’fields’: [’pub_date’], ’classes’: [’collapse’]}),
    ]
    inlines = [ChoiceInline]

admin.site.register(Poll, PollAdmin)

就是在admin class里面指定了内联的类:ChoiceInline,而ChoiceInline又指定它使用的类是Choice,并且有三个,当然,如果需要的不止三个,还可以add。

显然,我们并没有单独注册Choice这个模块,而是在新建Poll的时候顺便把Choice也新建了,下面是一个新建的效果图:

三、自定义admin修改页面

当我们单击某个已经存在的投票的时候,显示的仅仅是每个投票的问题,这是因为我们之前为poll定义了__unicode__方法的缘故,显然,仅显示这一点是不够的,怎么增加内容呢,其实,只需要把需要显示的属性放到list_display元组中就可以了:

class PollAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question', 'pub_date', 'was_published_recently')

于是,就显示了question,pub_date和was_published_recently这三列,但是,前两个可以点击排序,第三个不行,因为它不是数据库中的一列,然而我们可以这样写:

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def __unicode__(self):
        return self.question
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

admin_order_field就是说按照pub_date字段来排序;设置一个boolean字段就是说显示的内容不是True和False了,而是用一个图标显示,true就是对号,false就是一个红色的横线;short_description可以认为是这个字段的全称吧。

除此之外,还有一些有用的特性,比如,你在admin.py里添加list_filter=['pub_date'],就会在右侧有一个filter bar,它的意思是按出版时间进行过滤;添加search_fields=['question'],效果就会在最上方有一个搜索框,意思是对question字段进行搜索。

四、自定义admin外观

最后,关于admin的整个模块的外观都是可以更改的。首先你要知道,settings.py里的TEMPLATE_DIRS是django的模版所在的文件夹,你可以将你自己的template文件夹放到这里。如果要自定义外观,比如觉得admin页面不够美观,那么可以在模版文件夹下面新建一个admin文件夹,然后把相应的html文件放进去,比如base_site.html。但是我觉得没有更改的必要。

如果需要了解更多的细节,请参考django的官网文档:https://docs.djangoproject.com/en/dev/ref/contrib/admin/

 

 

posted @ 2012-11-15 20:06  cubika  阅读(204)  评论(0编辑  收藏  举报