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的列表页看起来如下: