本教程关注于教程一中自动生成的管理站点
注意1:为你的客户或者员工创建一个管理站点来添加、删除、更改内容是很乏味的事情,这不需要太多的创造性。基于此,django完全自动化地为模型生成这个管理站点。django是从一个新闻类网站开发的环境中演化出来的,它的内容编辑以及内容发布的站点是明确分开的。网站管理源使用这个系统添加新闻,事件,体育得分等内容。然后这些内容在内容发布站点中显示。django解决了为管理者创建一个同一的交互界面来编辑内容。这个管理站点只是网站管理员有权限使用。
1、启动开发服务器
django管理站点是默认激活的,启动服务器即可访问
python manage.py runserver
访问http://127.0.0.1:8000/admin/即可来到管理站点的登录界面
关于汉化参照:https://docs.djangoproject.com/en/1.6/topics/i18n/translation/
2、登录的用户名密码为你在教程一种创建的数据库超级用户的帐号密码
3、在admin站点中注册polls app中定义的模型,打开admin.py,编辑成以下内容
from django.contrib import admin from polls.models import Poll admin.site.register(Poll)
贴士:在admin管理站点中,以app为单位来进行划分管理
4、自定义admin显示格式
把admin.py编辑成:
from django.contrib import admin from polls.models import Poll class PollAdmin(admin.ModelAdmin): fields = ['pub_date', 'question']
admin.site.register(Poll, PollAdmin)
贴士:以上代码功能是在添加一个新的poll的界面,输入时间的field在输入问题的field上面,默认是输入问题的field在上面的
或者,编辑成:
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)
贴士:同样是poll添加页面,把两个字段分别在两个不同的fieldset中显示
再或者:
from django.contrib import admin from polls.models import Poll class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ]
贴士:设置pub_date fields默认是折叠状态的
仔细比较以上的改变之间的区别
贴士:可以在admin中自定义并指定模型的显示样式
5、添加相关联的对象Choice
编辑admin.py,添加以下代码
from django.contrib import admin from polls.models import Choice admin.site.register(Choice)
在Choice添加页面中,Poll域是一个下拉列表,包含了所有的poll。在django中外键都以下拉列表的形式显示,注意下拉列表方便的绿色十字,点击它可以弹出一个poll的添加页面,你在这个页面中添加的poll会同时在poll的存储数据库和下拉列表中动态更新。
但是,这样给每个poll一条一条的添加Choice太低效了。我们可以通过以下方式来提高效率
在admin.py中,删除注册Choice那条语句,然后把文件内容改成以下:
from django.contrib import admin from polls.models import Choice, Poll 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)
贴士:通过上面的修改,我们可以在添加poll的页面中添加choice。默认生成3个choice的创建表单,但是你可以自如的增添
有一个小问题,那3个choice创建表单的显示方式有点占用页面显示的空间,django提供一种更好的表格形式,来显示这个通过内联的方式添加的对象。这时候需要你修改ChoiceInline类的声明成下面的形式:
class ChoiceInline(admin.TabularInline): #...
默认情况下,每个poll对象的显示内容与“print poll对“内容一样,但是通过使用admin 选项list_display可以把对象中想要显示出来的数据属性在poll的显示页面中显示出来,需要添加的代码如下:
class PollAdmin(admin.ModelAdmin): # ... list_display = ('question', 'pub_date')
它还可以包含通过调用对象中的方法,并显示结果,如下:
class PollAdmin(admin.ModelAdmin): # ... list_display = ('question', 'pub_date', 'was_published_recently')
你可以点击显示数据属性的列(注意只是数据属性的列,不包含was_published_recently),可是实现以此列为准排序。另外默认的显示对象方法运行结果的列名就是方法名。
不过你可以通过给该方法添加一些数据属性来改善这种情况,这样你也可以使用该列来进行排序了。代码如下:
class Poll(models.Model): # ... 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?'
通过添加过滤侧边栏,可以提供一个简单的过滤功能,在PollAdmin中添加下面的代码:
list_filter = ['pub_date']
这个过滤器的过滤依据是pub_date,由于pub_date是DateTimeField类型,所以给出以下这个过滤选项:“Any date,” “Today,” “Past 7 days,” “This month,” “This ye
现在添加搜索框,同样是在PollAdmin中:
search_fields = ['question']
你可以在列表中添加多个数据属性,查询方式就像数据库中的LIKE语句。change页面也支持分页机制,默认是每页最多显示100条记录。
显然的,admin站点最上面的"Django administration"字样只是起着占位符的作用,我们可以把他自定义成自己喜欢的文字。使用django的模板系统很容易做到。
在你的项目中创建自己的模板目录,模板目录可以在任何的django可以访问到的地方创建,但是建议把模板目录放在项目的根目录下便于使用。
编辑mysite/settings.py,添加TEMPLATE_DIRS设置项
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]
TEMPLATE_DIRS是一个可迭代的文件系统目录,也就是python中的搜索路径,通过它来获取加载对于位置的django模板
现在在根目录下创建templates目录,在该目录下添加一个admin目录,把django默认的admin模板复制到admin目录下,也就是django/contrib/admin/templates/admin/base_site.html这个文件。
你可以通过在python的命令行模式下输入一下命令来获取django的安装路径:
python
import django
django.__file__
现在打开刚刚复制过来的base_site.html,找到"Django administrator"这些字,然后把它修改成你想要显示的字。然后刷新页面就可以看到变化了
这个模板文件包含很多文本像{% block branding %}and{{ title }}.{%和{{标签是django模板中的语言,当django渲染admin/base_site.html这个模板时,这个模板语言就会解析成最终的HTML页面。在教程3中仔细的讲解django的模板语言。
注意:django的所有模板语言都可以被覆盖。覆盖一个模板的方式,跟base_site.html一样,从django系统默认的模板目录中复制到自己项目的模板目录下,然后修改。
管理站点默认显示在INSTALLED_APPS声明并且在admin中注册中的应用,显示顺序是字母序。
管理站点的首页面对于的模板文件为admin/index.html(修改方式跟admin/base_site.html一样),定制教程见教程3.