django (四) 第一个django app 自动生成admin site
生成管理网站让你的员工或客户添加、更改和删除内容是非常繁琐的工作。出于这个原因,Django完全自动化管理接口模型的创建。Django明确的将“内容发布者”和“公共”网站进行分离。网站管理人员使用该系统添加新闻,事件,体育成绩,等等...显示内容在公共网站。Django为网站管理员创建一个统一的界面来编辑内容。
所以admin并不是给网页浏览者使用的,而是给管理者使用的。
下面,我们将admin应用添加进我们的项目。修改setting.py如下:
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'polls',
'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', )
重新执行:
manage.py syncdb
修改mysite/urls.py如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'mysite.views.home', name='home'), # url(r'^mysite/', include('mysite.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), url(r'^admin/', include(admin.site.urls)), )
好,接下来我们启动服务器:
manage.py runserver
登录http://127.0.0.1:8000/admin/,你将看到如下界面:
ok~你可以输入你初始化数据库的Username和Password,点击Log in你将看到如下画面:
这些都是网站管理员可以使用的核心的功能。
但是,投票功能在哪呢?好的,接下来我们将告诉admin我们的Poll对象需要有一个admin接口,为了实现这个任务,我们需要在mysite/polls/下新建一个admin.py文件,然后内容如下:
from django.contrib import admin from polls.models import Poll admin.site.register(Poll)
这时,你需要手动重启服务器来刷新页面。(因为创建了一个新的文件)
点击Poll条目右边的Add,添加Question:who is the most handsome man?输入日期,最后save:
通过注册投票模型admin.site.register(Poll),Django能够构造一个默认的表单。当你想自定义admin app的外观和功能时,你需要在注册对象时说明一下。
下面我们来展示一下如何对表单的展示顺序进行重新排序,删除原来的代码:
admin.site.register(Poll)
换成以下代码:
class PollAdmin(admin.ModelAdmin): fields = ['pub_date', 'question'] admin.site.register(Poll, PollAdmin)
你会遵循这种模式:创建一个模型管理对象,然后将它作为第二个参数传递给admin.site.register()。
展示的顺序交换了,时间展示在问题的前面了。
你也可以按如下方式,一次性修改更多的顺序:
class PollAdmin(admin.ModelAdmin): fieldsets = [(None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date']}),] admin.site.register(Poll, PollAdmin)
展示如下:
你也可以让其中一个条目隐藏(可展开),比如说Date:
class PollAdmin(admin.ModelAdmin): fieldsets = [(None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date'],'classes': ['collapse']}),] admin.site.register(Poll, PollAdmin)
接下来,我们将添加Choice对象,这里有两种办法,第一种就是和Poll一样,如下:
# -*- coding: utf-8 -*- from django.contrib import admin from polls.models import Poll from polls.models import Choice class PollAdmin(admin.ModelAdmin): fieldsets = [(None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date'],'classes': ['collapse']}),] admin.site.register(Poll, PollAdmin) admin.site.register(Choice)
重启服务器,加载页面,添加Choice,出现如下画面:
这个时候,Choice里的Poll条目是一个下拉框,里面有数据库里所有的Poll对象,Django知道,只要是外键就会展现一个这样的下拉框,当你点击右边的+号时,就会自动跳到Poll的编辑界面去。
这种方法并不是高效的,最好的办法是每添加一个Poll对象时自动添加一系列的Choice。
移除之前的Choice的register()代码,重新编辑Poll的register代码如下:
# -*- coding: utf-8 -*- from django.contrib import admin from polls.models import Poll,Choice class ChoiceInline(admin.StackedInline): 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)
好了,现在功能已经完成了,但你不觉得页面有点过长么?为了解决这个问题,Django提供了一个表格式的显示,你只需要对ChoiceInline类稍作修改:
class ChoiceInline(admin.TabularInline): model = Choice extra = 3
效果如下:
现在我们再回到Poll页面:
Django默认只显示每个对象的str()函数,有时我们想让他显示更多的信息,就需要用到list_display变量,代码如下:
class PollAdmin(admin.ModelAdmin): fieldsets = [(None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date'],'classes': ['collapse']}),] inlines = [ChoiceInline] list_display = ('question','pub_date','was_published_recently') admin.site.register(Poll, PollAdmin)
这里每一列属性点击都可以自动排序,除了was_published_recently因为Django无法为自定义的函数排序,你需要手动写代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Poll(models.Model): question = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def __unicode__(self): # Python 3: def __str__(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?'
然后在polls/admin.py的PollAdmin类下添加这样一行代码:
list_filter = ['pub_date']
就会出现过滤选项了。
继续添加:
search_fields = ['question']
就会在change栏的顶部出现一个搜索框。
最后再添加:
date_hierarchy = 'pub_date'
会在顶部出现一个日期筛选栏。
OK,到现在为止,admin的基本功能我们都已完成。