Django教程:第一个Django应用程序(2部分)
Django教程:第一个Django应用程序(2部分)
2013-09-24 磁针石
#承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.com qq 37391319
#博客:http://blog.csdn.net/oychw
#版权所有,转载刊登请来函联系
# 深圳测试自动化python项目接单群113938272深圳广州软件测试开发 6089740
#深圳湖南人业务户外群66250781武冈洞口城步新宁乡情群49494279
#参考资料:https://docs.djangoproject.com/en/1.5/intro/tutorial01/
# http://django-chinese-docs.readthedocs.org/en/latest/intro/tutorial01.html
本文的图片没有上传,完整的文档参见:python模块笔记:http://t.cn/z8ggk71
本节关注Django 自动生成的管理站点。
为你的员工或客户生成添加、修改和删除内容的管理性网站是个单调乏味的工作。因此Django 为模型自动化创建管理界面。
Django 是在新闻编辑室环境下编写的,“内容提供商”和“公共”网站之间有非常明显的界限。网站管理员使用这个系统来添加新闻、事件、体育成绩等等, 而这些内容会在公共网站上显示出来。Django 为网站管理员创建统一 的管理界面用以编辑内容。
管理界面不是让网站访问者使用的。它是为网站管理员准备的。
启用管理网站
默认情况下 Django 管理网站是关闭的。开启步骤:
? 在 INSTALLED_APPS 设置中取消 "django.contrib.admin" 的注释。
? 运行python manage.py syncdb更新数据库。
? 编辑你的 mysite/urls.py,如下:
from django.conf.urls import patterns,include, url
# Uncomment the next two lines to enablethe admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
# url(r'^$', '{{ project_name }}.views.home', name='home'),
# url(r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/',include(admin.site.urls)),
)
启用开发服务器
python manage.py runserver 192.168.4.13:8000
现在,用浏览器打开http://192.168.4.13:8000/admin/。你将看到管理登录界面:
你将看到一些可编辑的内容,包括groups ,users 和 sites 。这些都是 Django 默认自带的核心功能。
在管理网站中管理polls
需要在polls中添加admin.py开启polls的管理接口。
fromdjango.contribimportadmin
frompolls.modelsimportPoll
admin.site.register(Poll)
需要重启开发服务器。通常情况下,你每次修改文件后服务器都会自动载入,但是创建新文件却不会触发自动载入。注意启动之前要执行pythonmanage.py syncdb来创建表django_admin_log。
探索管理功能
点击“Polls”,可以看到投票列表。有个前面创建的投票:“What’s up?”:
点击这个”What’sup?”的投票进行编辑:
注意:
§ 这的表单是根据 Poll模型自动生成的。
§ 不同模型的字段类型 (DateTimeField, CharField)会对应的相应的 HTML 输入控件。每种类型的字段在 Djaong管理网站都有合适的展示。
§ 每个 DateTimeField 都有JavaScript快捷方式。日期有一个 “Today”快捷方式和弹出式日历,而时间有个 “Now”快捷方式和常用时间选项的弹出式窗口。
在页面的底部还为你提供了几个选项:
§ Save 保存更改并返回到投票列表。
§ Save and continue editing 保存更改并重新载入当前界面。
§ Save and add another 保存更改并载入新增页面。
§ Delete 显示删除确认页。
右上角的“History”可以看到通过 Django管理界面对此对象所做的全部更改的清单,包含有时间戳和修改人的姓名,修改内容等信息:
自定义管理表单
让我们来看看如何在编辑表单上给字段重新排序。将 admin.site.register(Poll) 这行替换成:
class PollAdmin(admin.ModelAdmin):
fields=['pub_date', 'question']
admin.site.register(Poll,PollAdmin)
模式 创建一个模型的管理对象,将它作为 admin.site.register() 方法的第二个参数传入。上面更改使得“Publication date”字段在 “Question”字段之前:
给字段分组:
class PollAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question']}),
('Date information',{'fields': ['pub_date']}),
]
admin.site.register(Poll, PollAdmin)
在 fieldsets 中每个元组的第一个元素就是字段集的标题。如下:
你可以为字段指定任意HTML类。Django提供了一个 "collapse" 类初始时收缩的方式显示字段。当字段很多时非常有用的
class PollAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question']}),
('Date information',{'fields': ['pub_date'], 'classes': ['collapse']}),
]
添加关联对象
第一种就像刚才 Poll 那样在管理网站上注册 Choice:
from polls.models import Choice
admin.site.register(Choice)
现在“Choices”在 Django管理网站上是可用的选项了。”Addchoice”表单看起来像这样:
该表单中,Poll字段是包含了数据库中每个投票的选择框。Django知道外键要展示为选择框。在本例中,选择框中仅存在一个投票。
另外请注意 Poll 末尾的“Add Another”(加号)链接。每个外键对象关联都有这个链接。当点击“Add Another” 时,你将会获得一个 “Add poll”表单的弹出窗口。如果你在窗口中添加了一投票并点击了“Save”按钮, Django 会将poll保存至数据库中并且动态的添加为你正在查看的“Add choice”表单中的已选择项。
这种方式很低效。如果在创建 Poll 对象时能够直接添加一批Choices那会更好。
移除对 Choice 模型的 register() 方法调用。然后,将 Poll 的注册代码:
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)
这将告诉Django: “Choice 对象在 Poll 管理页面中编辑。默认情况下,可以编辑3个choices的字段。
现在多了三个关联Choices表单,且每次你在 “Change”页修改已经创建的对象时,都会另外获得三个额外表单。
表单的底部,你会发现一个“Add another Choice”(加号)链接。点击会添加新的表单。如果想移除添加,你可以点击右上方的 X 。注意你不能移除原有的三个插槽。此图片中显示了新增的表单:
显示所有关联 Choice 对象的字段需要占用大量的屏幕空间。为此,Django提供了以表格方式显示内嵌有关联对象的方式;你只需要将 ChoiceInline 声明改为如下所示:
class ChoiceInline(admin.TabularInline):
#...
右边的delete打勾则会删除制定行。
另外要特别注意编码,比如mysql中创建的数据库要支持utf-8.settings中要设置:TIME_ZONE= 'Asia/Shanghai'和LANGUAGE_CODE = 'zh-cn'。
自定义管理变更列表
现在管理变更列表显示如下:
默认情况下,Django显示的是每个对象 str() 的结果。但是若是我们能够显示每个字段的话有时会更有帮助的。使用 list_display 管理选项可以实现此功能,这是一个元组,包含了要显示的字段名,将会以列的形式在该对象的 changlsit 页上列出来:
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?'
再次编辑你的admin.py,给 PollAdmin类增加一个过滤器(筛选)功能:
list_filter = ['pub_date']
这就增加了一个 “过滤”的侧边栏,通过 pub_date 字段的值来筛选:
过滤类型取决于你需要筛选的字段类型。因为 pub_date 是一个 DateTimeField ,Django提供了对应的筛选选项:”任意日期”、“今天”、“过去7天”、“本月”、“今年”。
还可以增加搜索功能:
search_fields = ['question']
这样就在顶部增加了一个搜索框将搜索 question 字段。你可以使用任意数量的字段,但是因为它在后台用 LIKE 查询,为了性能请尽量合理使用。
因为 Poll 对象有日期,根据日期向下排列也很方便。
date_hierarchy = 'pub_date'
这在顶部增加了基于日期的分层导航功能。在最顶层,显示所有可用年份,然后细化到月份,最终到天。
另外修改列表提供了分页功能。默认每页显示 100条记录。
自定义管理界面的外观
每个管理页面顶部有“Django管理”字样,我们可以修改Django的模板替换它。
自定义你的 项目 模板
在project目录下创建一个 templates 目录。模板可以放在文件系统中任何Diango能访问地方。但在你的project中保存模板是一个好习惯。
在配置文件中指明模板的目录:
TEMPLATE_DIRS = (
'/path/to/mysite/templates', # 将此处改为你的目录。
)
目录Django建议配置为绝对路径。但是为适应GAE,SAE等,建议使用相对路径。比如:'../mysite/templates'。
在templates 下面新建admin目录,拷贝默认的base_site.html到admin目录。base_site.html一般在django/contrib/admin/templates/admin/base_site.html,比如我这:/usr/lib/python2.7/site-packages/django/contrib/admin/templates/admin/base_site.html
通过如下命令也可以查找到源码路径:
python -c "
import sys
sys.path = sys.path[1:]
import django
print(django.__path__)"
替换“site-name”部分为你想要的标题就好。
该模板包含了大量的文本,比如 {% block branding %} 和 {{ title }}。{% 和 {{ tags是Django模板语言的一部分,暂时不深究。
注意Django默认管理模板都是可覆盖的。要覆盖一个模板,只需要像刚才处理 base_site.html 一样 从默认的目录下复制到你的自定义目录下,并修改它。
自定义你的 应用 模板
如果没有设置TEMPLATE_DIRSDjango会自动在应用的包内查找 templates目录,作为备用,django.contrib.admin就是是一个应用。
对于复杂的应用,建议把模板放置在应用目录。
更多关于Django查找模板的方式请参考 template loader documentation 。
自定义管理网站的首页
默认情况下,会显示INSTALLED_APPS 中所有注册了管理功能的应用,并按字母排序。自定义的模板是 admin/index.html 。里面有个一个名为 app_list 的模板变量包含了已安装的Django应用。当然也可以强行链接到特定对象的管理页面而不使用默认模板。