`
hideto
  • 浏览: 2650385 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

翻译www.djangobook.com之第六章:Django管理系统admin

阅读更多
The Django Book:第6章 Django管理系统admin

Web开发中有一些我们最讨厌的部分:开发管理界面
开发站点中公众可以看见的部分一直不一样也很有趣,但是管理用来编辑站点的部分一直是一样的
你不得不处理用户认证,显示和处理表单,处理狡猾的验证问题...这很无聊而且是重复性的
Django解决这个无聊、重复的任务的方式呢?已经帮你都做好了,只需几行不能再少的代码即可
Django中最老和最强大的部分就是自动管理界面,它从你的模型中取得元数据来提供强大的产品级的界面
内容制造者可以马上使用它给站点添加内容

激活管理界面
我们认为管理界面是Django中最cool的部分,大部分Djangonauts也同意这点
但是由于不是每个人都需要它,它是一个可选的部分
有3个步骤来激活管理界面:
1,向你的模型添加admin metadata
并不是所有的模型都可以或者应该被admin用户编辑,所以你需要标记那些需要管理界面的模型
上一章的Book模型添加一个管理界面的方法就是:
class Book(models.Model):
    title = models.CharField(maxlength=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

    class Admin:
        pass

Admin声明标记这个类拥有一个管理界面,在Admin之下你可以配置许多选项
目前我们采用默认值,所以我们使用pass来表示Admin类是空的
如果你正在按这个例子写自己的代码,现在给Publisher和Author类添加Admin声明是个好主意
2,安装admin模型,简单的把"django.contrib.admin"添加到你的INSTALLED_APPS设置里
然后运行python manage.py syncdb来安装admin使用的额外的表
注意,在你第一次运行syncdb时,你很可能被问起是否创建一个superuser
如果那时你没有创建superuser,你需要运行djang/contrib/auth/bin/create_superuser.py
来创建一个admin用户,否则你就不能登录到管理界面里去
3,把URL模式添加到urls.py,如果仍在使用startproject创建的工程,admin的URL模式可能
已经在那儿了,但是被注释掉了,你的URL模式应该像这样:
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^admin/', include('django.contrib.admin.urls')),
)

就这样,现在运行python manage.py runserver来启动服务器,你将看到如下信息:
Validating models...
0 errors found.

Django version 0.96-pre, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
现在你可以访问http://127.0.0.1:8000/admin/,登录,然后随便玩玩

使用管理界面
管理页面设计用来给非技术人员使用,所有非常简单,但有几个地方需要注意
首先你将看到登录界面,可以用你第一次运行syncdb时创建的用户名和密码来登录

登录之后你将看到你可以管理用户,组和权限
每个声明了Admin的对象将显示在首页上,添加和编辑这两个链接将导向改动列表和编辑表单的页面

改动列表是系统中对象列表的首页
[img]http://media.djangobook.com/content/chapter06/changelist.png[/imag]
有很多选项来控制哪些域显示在这个列表中以及其它特性的外观,如日期格式,搜索域和过滤接口
下面会有对这些特性更多的解释
编辑表单用来编辑已有的对象和创建新对象
你的模型的每个域将显示在这里,不同的域类型有不同的显示界面,如日期和时间域是日历控件
而外键使用的是选择框等等

你会注意到admin也为你处理输入验证,试着留一个需要的域不填,或者在一个时间域里输入不合法的时间,你会看到当你保存时出现错误显示

验证是第7章讲到的一个强大的验证框架来做的
当编辑一个对象时你会在右上方看到一个历史链接,admin上的每一个改动都会被记入日志
你可以点击历史按钮来查看日志

admin里的删除是级联的,当你删除一个对象时,admin会让你确认删除动作以避免代价昂贵的错误
确认页面也会显示所有将被删除的相关的对象


用户,组,权限
既然你用superuser登录,你拥有创建,编辑和删除任何对象的权限
尽管如此,admin也有一个用户权限系统,你可以使用它来约束其它用户的访问权限
你可以像编辑其它对象一样来编辑这些用户和权限,用户和组模型的链接和其它你定义的对象一样显示在admin首页
用户对象有标准的用户名,密码,邮件和真实姓名域,以及一些定义用户在admin的权限的域
首先,这里有一些flags:
1,“is active”控制用户是否是活动的,如果这项flag为off,这个用户将不能访问任何需要登录的URL
2,“is staff”控制用户是否允许登录admin,由于第12章讲到这个用户系统同样被用来控制对public页面的
访问权限,这个flag对于public用户和管理员的含义不同
3,“is superuser”给予用户在admin的任何访问权限,普通的权限将被忽略
对于正常的admin用户,即活动的而非superuser的staff用户,他们的访问权限取决于一些被分配的权限
每个可以在admin编辑的对象拥有3个权限:创建权限,编辑权限和删除权限,给一个用户赋予权限将
允许用户访问这些权限所描述的页面
注意,对编辑用户和编辑权限的访问同样在这个权限系统控制,如果你给一个用户编辑用户的权限,
她将可以编辑她自己的权限,这可能是你的初衷!
你也可以给用户分配组,一个组就是一些权限,组的权限将分配给组的成员
给用户赋予一套数量很多的权限时组就很有用了

定制管理界面
有许多方式来定制admin的界面外观和行为,我们仅仅看其中跟我们的“Book”模型相关的一些
第12章详述了定制admin界面
现在books的改动列表仅仅显示模型的string展现,即__str__
这对于少量的books可以很好的工作,但是如果我们有成千上万的books,这将很难在干草推里找到唯一的那根针
尽管如此,我们可以给这个界面很方便的添加一些显示,搜索和过滤方法,编辑Admin定义:
class Book(models.Model):
    title = models.CharField(maxlength=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

    class Admin:
        list_display   = ('title', 'publisher', 'publication_date')
        list_filter    = ('publisher', 'publication_date')
        ordering       = ('-publication_date',)
        search_fields  = ('title',)

这4行代码神奇的改变了我们的列表界面:

这些定义中的每一行都告诉admin来构建一个不同的界面:
1,ordering选项控制了对象在admin里面显示的顺序,它是对结果排序的域的列表
前面加一个减号将排反序,所以例子中我们对publication_date排序,最近的书将显示在最前面
2,list_display选项控制了在改动列表里哪些列将显示,默认情况下将只显示对象的string展示
这一个单独的列,这里我们显示title,publisher和publication_date
3,list_filter选项将在列表的右上方创建过滤器条,我们允许通过date和publisher来过滤
你可以让admin过滤任何域,但是外键或者有chioces属性集的域工作的更好
4,最后search_fields选项创建一个允许文本搜索的域,这里允许通过title域搜索
通过这里以及第12章描述的选项你可以只用几行代码构建一个强大的具备产品能力的编辑数据界面


定制管理系统的外观
显然在每个管理页面的顶端拥有一个“Django 管理系统”是很荒谬的,它只是一个占位文本
尽管如此,使用Django的模板系统可以很容易改变这点,Django的admin是Django自己支持的
它的界面使用Django自己的模板系统
打开mysite/settings.py看看TEMPLATE_DIRS设置,用来载入Django模板时检查文件系统目录
它是一个搜索的路径,默认情况下它是空的,下面我们加点东西来告诉Django我们的模板在哪:
TEMPLATE_IDRS = (
    "/home/mytemplates", # Change this to your own directory.
)

注意这里包括了最后的逗号,Python使用它来区分单元素元组和括号括起来的表达式
现在把admin/base_site.html从Django的admin模板目录(django/contrib/admin/templates)复制到
TEMPLATE_DIRS下的admin子目录下,admin是新建的子目录
然后编辑admin/base_site.html,用你自己的站点的名字替换Django文本
注意任何Django的默认admin模板都可以覆盖,只需像base_site.html一样覆盖模板
即从默认目录复制你的自定义目录然后改变这个副本
敏锐的读者可能想知道,如果TEMPLATE_DIRS默认是空的,Django是怎样找到默认的admin模板的?
答案是,默认情况下Django自动在每个app包下搜寻templates/子目录下的模板
看看第10章的“模板载入器”你将了解关于它的更多信息

定制管理系统首页
同样需要注意的是,你可能想定制Django的admin首页外观
默认时它将根据INSTALLED_APPS并按程序名排序显示所有的apps
尽管如此,你可能想改变这个显示顺序来使你更容易找到你要的apps
毕竟首页时admin最重要的页面,它应该很容易使用才行
需要定制的模板时admin/index.html,记得把admin/base_site.html复制到你的自定义模板目录
编辑这个文件,你将看到它使用模板标签{% get_admin_app_list as app_list %}
这就是得到所有安装的Django app的魔法所在
你可以用你认为最好的方法硬编码对象专有的admin页面来替换这个标签
如果你不太明白硬编码链接,可以参考第10章的实现你自己的模板标签的细节
Django在这个地方提供另一个捷径,运行python mange.py adminindex <app>来在admin首页模板
包含一些模板代码,开始时这十分有用
参考第12章关于定制Django的admin站点外观的细节

何时使用和为什么使用管理界面
我们认为Django的admin界面很神奇,事实上,我们称它为Django的一个“杀手级特性”
尽管如此,我们经常被问到admin的“use cases”这个问题,即什么时候我们使用它,以及为什么使用它?
这几年我们讨论了许多使用admin界面可能有帮助的模式
显然它对于编辑数据十分有用,如果你有一些数据输入的任务,admin就是你想要的
我们也发现admin在下面几种情况下十分有用:
1,检查数据模型,当我们定义一个新模型后第一件事就是在admin里面激活它并且输入一些模拟数据
发现一些数据模型错误是很常见的,有一个图形界面来揭露这些错误会很有用
2,管理需要的数据,例如对于chicagocrime.org有自动的数据数据产生源,但是当数据源出现问题,
我们可以通过admin很轻松的编辑数据

下一步是什么
到目前为止我们创建了一些模型并且配置了一个高级界面来编辑数据,下一章我们将进入到Web开发
真正的“肉和马铃薯”:表单创建和处理
所以,再弄一杯你最爱的饮料,让我们开始新的征程...
分享到:
评论
6 楼 wind35 2012-03-22  
python2.7 django1.3.1

from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls))
)
5 楼 shuxiang29 2008-10-18  
[b] jemmywang 
for django1.0 use:[/b]

from django.contrib import admin
admin.autodiscover()
(r'^admin/(.*)', admin.site.root),
4 楼 jemmywang 2008-10-04  
一个问题,我用的python 2.5.2,Django 1.0正式版
按照这些步骤加上admin以后,访问admin页面出错,访问其他页面却正常,出错信息如下:
Traceback (most recent call last):

  File "H:\Python25\Lib\site-packages\django\core\servers\basehttp.py", line 277, in run
    self.result = application(self.environ, self.start_response)

  File "H:\Python25\Lib\site-packages\django\core\servers\basehttp.py", line 634, in __call__
    return self.application(environ, start_response)

  File "H:\Python25\Lib\site-packages\django\core\handlers\wsgi.py", line 239, in __call__
    response = self.get_response(request)

  File "H:\Python25\Lib\site-packages\django\core\handlers\base.py", line 67, in get_response
    response = middleware_method(request)

  File "H:\Python25\Lib\site-packages\django\middleware\common.py", line 57, in process_request
    urlresolvers.resolve(request.path_info)

  File "H:\Python25\Lib\site-packages\django\core\urlresolvers.py", line 244, in resolve
    return get_resolver(urlconf).resolve(path)

  File "H:\Python25\Lib\site-packages\django\core\urlresolvers.py", line 180, in resolve
    sub_match = pattern.resolve(new_path)

  File "H:\Python25\Lib\site-packages\django\core\urlresolvers.py", line 178, in resolve
    for pattern in self.urlconf_module.urlpatterns:

  File "H:\Python25\Lib\site-packages\django\core\urlresolvers.py", line 197, in _get_urlconf_module
    self._urlconf_module = __import__(self.urlconf_name, {}, {}, [''])

ImportError: No module named urls.admin


此时,urls.py如下:
from django.conf.urls.defaults import *
from myproject.helloworld import *
from myproject.test import *

urlpatterns = patterns('',
    # Example:
    # (r'^myproject/', include('myproj.apps.foo.urls.foo')),
    (r'^py$', index),
    (r'^py/about',about),
    (r'^py/now$',current_dateTime),
    (r'^py/now/plus(\d{1,2})hour$',futureTime),
    (r'^py/now/minus(\d{1,2})hour$',passedTime),
    (r'^py/template$',templateTest),
    (r'^py/admin', include('django.contrib.admin.urls')),   
)


settings.py的InstalledApps如下:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'myproject.users',
)

3 楼 lyhapple 2008-07-11  
引用
除了'django.contrib.admin'以外,还要加上'django.contrib.auth'和'django.contrib.contenttypes'


后两句在创建项目的时候已经自动添加到INSTALLED_APPS设置里了.
2 楼 badpeas 2008-03-06  
对admin的数据创建 管理
权限分配都有做过了
但是页面的自定义还是没怎么涉及,希望在后面能多多的去自定义它!做到为我所用!
谢谢翻译者!
看完留下记号!!
1 楼 LeeSailYang 2007-05-08  
这一章有一个Bug
引用
安装admin模型,简单的把"django.contrib.admin"添加到你的INSTALLED_APPS设置里

除了'django.contrib.admin'以外,还要加上'django.contrib.auth'和'django.contrib.contenttypes'

相关推荐

    中文版django book

    第六章:Admin 完成度 100.00% 阅读 翻译 第七章:表单 完成度 100.00% 阅读 翻译 第八章 高级视图和URL配置 完成度 100.00% 阅读 翻译 第九章:模版高级进阶 完成度 99.74% 阅读 翻译 第十章 模型高级进阶 完成度 ...

    Djangobook2中文版.

    7. 第六章:Django站点管理 8. 第七章:表单 9. 第八章:高级视图和URL配置 10. 第九章:模版高级进阶 11. 第十章:模型高级进阶 12. 第十一章:通用视图 13. 第十二章:部署Django 14. 第十三章:输出非HTML...

    The Django Book 2.0中文译本.pdf

    第六章:Admin 完成度 100.00% 阅读 翻译 第七章:表单 完成度 100.00% 阅读 翻译 第八章: 高级视图和URL配置 完成度 100.00% 阅读 翻译 第九章:模版高级进阶 完成度 99.74% 阅读 翻译 第十章: 模型高级进阶 完成...

    djangoBook 中文 v1.0 v2.0 合并美化版 原创

    第六章:Django站点管理 第七章:表单 第八章:高级视图和URL配置 第九章:模版高级进阶 第十章:模型高级进阶 第十一章:通用视图 第十二章:部署Django 第十三章:输出非HTML内容 第十四章:会话、用户和...

    The Django Book 2.0中文修正版

    第六章:Admin 完成度 100.00% 第七章:表单 完成度 100.00% 第八章 高级视图和URL配置 完成度 100.00% 第九章:模版高级进阶 完成度 99.74% 第十章 模型高级进阶 完成度 100.00% 第十一章:通用视图 完成度 ...

    Django客户管理系统源码.zip

    Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统...

    the Django book

    这本书是关于一个web开发框架Django的,它将节省你大量的时间,并且使你的web开发充满乐趣。通过Django,你可以建立一个高性能的web应用而只花费最小的消耗。6 从好的方面来看,Web 开发激动人心且富于创造性;从另...

    Django Book 2.0中文译本_understandingb8a_Book2_python_django_

    介紹Django 完成度 100.00% 阅读 翻译第二章: 入门 完成度 100.00% 阅读 翻译第三章: 视图和URL配置 完成度 100.00% 阅读 翻译第四章:模版 完成度 100.00% 阅读 翻译第五章:模型 完成度 100.00% 阅读 翻译第六章...

    Django_中文教程.rar

    第六章:Admin 第七章:表单 第八章: 高级视图和URL配置 第九章:模版高级进阶 第十章: 模型高级进阶 第十一章:通用视图 第十二章: 部署Django 第十三章: 输出非HTML内容 第十四章: 会话、用户和注册 ...

    Lightweight.Django.2014.11.pdf

    Lightweight.Django.2014.11.pdf

    Python.Django视频教程.zip

    django-01-django安装.rar django-02-模板文件的导入.rar django-03-模板变量的使用.rar django-04-运算符-表达式.rar django-05-URL配置.rar Django-06-模板基本使用.rar Django-07-数据库使用-01.rar Django-08-...

    Django入门新闻管理系统

    Django入门新闻管理系统。入门的,新手可以看下哈。。。 ================================================== Django的环境: Python的安装: python-2.7.1.msi Django的安装: 去djangoproject.com下载最新的版本...

    基于DJango开发的仓库管理系统源码.zip

    基于DJango开发的仓库管理系统,软件架构:python 3.5、django 2.2、MySQL 基于DJango开发的仓库管理系统,软件架构:python 3.5、django 2.2、MySQL 基于DJango开发的仓库管理系统,软件架构:python 3.5、...

    Python基于Django学生宿舍管理系统源码.zip

    Python基于Django学生宿舍管理系统源码 Python基于Django学生宿舍管理系统源码 Python基于Django学生宿舍管理系统源码 Python基于Django学生宿舍管理系统源码 Python基于Django学生宿舍管理系统源码 Python基于...

    基于Django+HTML5+MySQL做的家政管理系统源码.zip

    Django家政管理系统,版本号:Python3.6 + Django2.2 + 后台simpleUI,数据库:MySQL Django家政管理系统,版本号:Python3.6 + Django2.2 + 后台simpleUI,数据库:MySQL Django家政管理系统,版本号:Python3.6 ...

    Mastering.Django.Core.2016.12.pdf

    Mastering Django: Core is a completely revised and updated version of the original Django Book, written by Adrian Holovaty and Jacob Kaplan-Moss – the creators of Django. The main goal of this book ...

    Django Book 2.0 中文版

    Django Book 2.0 中文版 其实就是官网手册(http://www.djangobook.com/en/2.0/)的中文翻译

    python项目基于django的物业信息管理系统的实现.zip

    python项目基于django的物业信息管理系统的实现.zippython项目基于django的物业信息管理系统的实现.zippython项目基于django的物业信息管理系统的实现.zippython项目基于django的物业信息管理系统的实现.zippython...

    Python基于Django的图书管理系统源码.zip

    Python基于Django的图书管理系统源码 Python基于Django的图书管理系统源码 Python基于Django的图书管理系统源码 Python基于Django的图书管理系统源码 Python基于Django的图书管理系统源码 Python基于...

Global site tag (gtag.js) - Google Analytics