django 提供了基于 web 的管理工具。
django自动管理工具是django.contrib的一部分。你可以在项目的 settings.py 中的installed_apps看到它:
installed_apps = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', )
django.contrib是一套庞大的功能集,它是django基本代码的组成部分。
通常我们在生成项目时会在urls.py中自动设置好,我们只需去掉注释即可。
配置项如下所示:
from django.contrib import admin admin.autodiscover() # and include this urlpattern... urlpatterns = patterns('', # ... (r'^admin/', include(admin.site.urls)), # ... )
当这一切都配置好后,django管理工具就可以运行了。
启动开发服务器,然后在浏览器中访问:http://yoursite:8000/admin/,得到如下界面:
为了让admin界面管理某个数据模型,我们需要先注册该数据模型到admin。比如,我们之前在 testmodel 中已经创建了模型 test 。修改 testmodel/admin.py:
from django.contrib import admin from testmodel.models import test # register your models here. admin.site.register(test)
刷新后即可看到 testmodel 数据表:
管理页面的功能强大,完全有能力处理更加复杂的数据模型。
先在 testmodel/models.py 中增加一个更复杂的数据模型:
from django.db import models # create your models here. class contact(models.model): name = models.charfield(max_length=200) age = models.integerfield(default=0) email = models.emailfield() def __unicode__(self): return self.name class tag(models.model): contact = models.foreignkey(contact) name = models.charfield(max_length=50) def __unicode__(self): return self.name
这里有两个表。tag以contact为外部键。一个contact可以对应多个tag。
我们还可以看到许多在之前没有见过的属性类型,比如integerfield用于存储整数。
在 testmodel/admin.py 注册多个模型并显示:
from django.contrib import admin from testmodel.models import test,contact,tag # register your models here. admin.site.register([test, contact, tag])
刷新管理页面,显示结果如下:
在以上管理工具我们就能进行复杂模型操作。
我们可以自定义管理页面,来取代默认的页面。比如上面的"add"页面。我们想只显示name和email部分。修改 testmodel/admin.py:
from django.contrib import admin from testmodel.models import test,contact,tag # register your models here. class contactadmin(admin.modeladmin): fields = ('name', 'email') admin.site.register(contact, contactadmin) admin.site.register([test, tag])
以上代码定义了一个contactadmin类,用以说明管理页面的显示格式。
里面的fields属性定义了要显示的字段。
由于该类对应的是contact数据模型,我们在注册的时候,需要将它们一起注册。显示效果如下:
我们还可以将输入栏分块,每个栏也可以定义自己的格式。修改testmodel/admin.py为:
from django.contrib import admin from testmodel.models import test,contact,tag # register your models here. class contactadmin(admin.modeladmin): fieldsets = ( ['main',{ 'fields':('name','email'), }], ['advance',{ 'classes': ('collapse',), # css 'fields': ('age',), }] ) admin.site.register(contact, contactadmin) admin.site.register([test, tag])
上面的栏目分为了main和advance两部分。classes说明它所在的部分的css格式。这里让advance部分隐藏:
advance部分旁边有一个 show 按钮,用于展开,展开后可点击 hide 将其隐藏,如下图所示:
上面的contact是tag的外部键,所以有外部参考的关系。
而在默认的页面显示中,将两者分离开来,无法体现出两者的从属关系。我们可以使用内联显示,让tag附加在contact的编辑页面上显示。
修改testmodel/admin.py:
from django.contrib import admin from testmodel.models import test,contact,tag # register your models here. class taginline(admin.tabularinline): model = tag class contactadmin(admin.modeladmin): inlines = [taginline] # inline fieldsets = ( ['main',{ 'fields':('name','email'), }], ['advance',{ 'classes': ('collapse',), 'fields': ('age',), }] ) admin.site.register(contact, contactadmin) admin.site.register([test])
显示效果如下:
在contact输入数条记录后,contact的列表页看起来如下: