`
hideto
  • 浏览: 2677822 次
  • 性别: 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 Django 内置了一个强大的管理后台,可以方便地管理应用程序中的数据。本章将介绍如何自动生成 admin 界面,以及如何对其进行定制化,以满足特定的需求。 ### 第七章:表单 表单是 Web 应用中...

    Django book pdf 完整版

    - **第6章:Django管理站点** - 描述了Django的内置管理界面,以及如何定制和扩展它。 - **第7章:表单处理** - 讲述了如何创建和处理表单数据,包括验证和错误处理。 - **第8章:高级视图和URL配置** - 探讨了复杂...

    Django book 2.0 中文版

    6. **第六章:Admin** - Django 自带的管理站点介绍。 - 如何自定义 Admin 界面。 - 管理员账户的创建和权限设置。 7. **第七章:表单** - 表单的基本概念及其作用。 - Django 表单类的定义。 - 如何处理用户...

    Django1.0以上版本的教材-DjangoBook2.0中文版.pdf

    6. **Admin管理站点(第六章)** Django自带了一个强大的后台管理系统,本章介绍了如何利用这个系统来管理数据库中的数据,包括自定义管理界面等功能。 7. **表单(第七章)** 表单是Web应用中不可或缺的部分,...

    Python DjangoBook中文版

    6. **Django管理后台(admin)**:Django自带的管理后台可以让开发者快速创建和管理数据,无需编写额外的界面代码,是Django的一大特色。 7. **表单处理**:Django提供了强大的表单处理能力,包括创建表单、验证...

    The Django Book.pdf

    #### 第六章:Django管理站点 - **激活管理界面**:通过设置ADMIN_SITE类启用Django自带的管理后台。 - **使用管理界面**:介绍了如何使用Django管理站点进行数据增删改查等操作。 - **用户、组和权限**:Django...

    django book基础教程

    Django的后台管理是Django框架中的一大特色,它能够帮助开发者快速实现一个功能强大的后台管理系统。 5. Django提供的安全机制(Security)是非常重要的,文档中会介绍如何在Django项目中实现安全措施,防止潜在的...

    DjangoBook2.0中文版

    6. **第六章:Admin** - **自动管理站点**:展示Django自带的管理站点如何帮助开发者快速建立一个后台管理系统。 - **自定义管理界面**:介绍如何对默认的管理界面进行个性化定制。 7. **第七章:表单** - **...

    djangobook入门学习资料

    2. 创建项目:使用`django-admin startproject`命令创建第一个Django项目。 3. 探索模型:定义简单的模型类,理解如何映射到数据库表。 4. 数据库迁移:使用`makemigrations`和`migrate`命令处理数据库结构变化。 5....

    The Django Book 2 中文版

    Django自带了一个强大的后台管理系统——Admin Site,允许开发者轻松地为任何模型添加增删改查的功能。本章重点介绍了如何自定义Admin界面以及如何利用它来进行高效的网站管理。 #### 第七章:表单 表单是Web应用中...

    django book 中文版

    #### 六、Django的管理界面(第六章) - **自动管理界面**:Django提供的自动化的后台管理界面,如何注册模型到admin站点。 - **自定义管理界面**:如何自定义管理界面以满足特定需求。 - **权限管理**:如何通过...

    Django book中文

    6. **Admin**:Django内置了一个强大的管理后台,通过简单的配置就可以自动生成一个功能完备的管理界面。本章将指导读者如何自定义管理后台的外观和行为,以满足不同的需求。 7. **表单**:表单是用户与网站交互的...

    The Django Book 2.0中文译本

    ### 第六章:Admin - **Admin站点配置**:介绍了如何配置Django自带的Admin站点,包括自定义管理界面的方法。 - **自定义管理操作**:讲解了如何通过编写自定义方法来增强Admin站点的功能。 ### 第七章:表单 - **...

    DjangoBook2

    ### 第六章:Admin Django自带的管理界面是快速开发和管理网站后台的强大工具。这一章介绍了如何利用Django Admin创建,编辑和查看模型实例,以及如何自定义Admin界面以满足特定需求。 ### 第七章:表单 表单是...

Global site tag (gtag.js) - Google Analytics