Django笔记 2
一、使用admin模块
django里自带了admin模块,可以使用它来在后台管理数据,如添加或删除数据,还可以添加或删除用户和组等等。
要想使用这个模块,首先需要去掉几个注释:
- 在INSTALLED_APP里面添加或者注释掉django.contrib.admin
- 在urls里面注释掉 from django.contrib import admin和admin.autodiscover()这两行
- 同时注释掉下面的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/