接下来我们需要一个管理接口来维护用户输入的评论内容。实际上管理接口对于任何需要管理和存储数据的web应用程序来说是一个通用的功能。因此 Django提供了一个功能完备的管理接口模块,Django中的这个模块可以说非常棒,因为它简单易用而且功能强大、而且扩展性很强。
本章你将学到一下内容:
- 激活管理接口。
- 使用这个管理接口来维护数据内容。
- 自定义管理接口。
- 给用户或者用户组分别权限。
激活管理接口
管理接口在Django中是一个应用程序模块,要使用它必须首先在我们的应用程序中将之激活,步骤和我们前面讲的激活用户身份验证程序的步骤类似。
管理接口应用程序位于django.contrib.admin包中,所以第一步是把这个包的路径加入到INSTALLED_APPS变量中,打开settings.py文件找到INSTALLED_APPS变量修改如下:
接着执行下面的命令在数据库中创建必要的数据表:
$ python manage.py syncdb
现在为了能够访问这个新增的模块我们需要给它定义一个URL入口。在Django提供的管理接口应用程序中有大量的试图函数,所以如果我们分别给这 些试图函数定义URL的话,那将是一个非常繁琐的工作。因此Django为此提供了一中快捷方式。Django把这个模块中所有的URL映射放在了一个单 独的包中:django.contrib.admin.urls,所以Django提供了一个include()函数,这样我们就可以把所有这些URL映 射“包含”到我们当前的应用程序中,打开urls.py文件加入下面的内容:
这和我们通常定义URL映射的方式略有不同,我们告诉Django从django.contrib.admin.urls这个包中获取URL,而且这些URL都位于 ^admin/路径下。这样我们就可以在自己的应用程序中使用管理接口了。
接下来要作的事情就是告诉Django哪些数据模块可以在管理接口中进行维护。要做到这一点就需要在每一个模型类中定义一个内部的名为Admin的类。打开bookmarks/models.py 文件并给Link模型加入下面黑体字部分的代码:
我们给Link类加上了一个Admin的内部类就是告诉Django这个Link数据模型可以在管理接口中维护。pass关键字是说这个类什么都不做。随后我们会通过这个类来自定义管理界面的行为,现在现让他空着。
使用相同的方法给Bookmark , Tag 和 SharedBookmark 模型加上一个空的Admin内部类。这样他们就可以在管理接口中维护。由于User对象是有Django提供的所以我们不能自己给他加上Admin类,不 过幸好他默认就是包含这个类的。所以他同样可以在管理接口中访问。
接下来让我们启动开发服务器然后在浏览器中输入下面的网址:http://127.0.0.1:8000/admin/。你会看到一个登录页面。还记得我们在创建项目时同时创建了一个超级用户吧,现在就用那个用户登录:
然后你就会看到一个维护数据模型的页面,上面列出了所有你加上了Admin内部类的模型:
用鼠标点击一个模型的连接,你会得到一个保存在数据库中的这个模型的列表。你可以通过这个页面查看、修改或者增加一个新的对象。下图显示了Link数据模型的内容:
Django会根据模型中的字段属性自动产生一个编辑表单。比如对于Link模型,它包含一个唯一的Url文本字段,你可以通过这个表单来查看或者修改一 个Link对象,另外在你提交的死后,表单还会根据模型的验证逻辑进行校验。所以对于Link对象来说如果你要保存一个无效的URL连接,系统会给出一个 错误提示信息,告诉你应该给出一个合法的连接地址。下图显示了保存非法URL连接是的异常页面:
编辑表单会根据模型字段属性显示不同的组件。对于日期字段会显示一个日历组件,对于外键关联字段会显示一个列表组件,等等。下图显示了一个使用日历组件的用户对象表单:
你还将发现管理接口利用模型中__str__方法的返回值来定义模型的显示内容,这对于我们的开发和维护非常有帮助。
你可以试着增加、删除或者修改一些模型对象来检验一下管理接口的功能。你会发现所有改变都可以在管理接口中立即查看。而且管理接口还会跟踪记录你的操作行为并且你可以根据历史操作会滚你的动作。
本节覆盖了使用Django提供的管理接口的大部分内容,这一功能是使用Django进行开发的益处之一,你可以通过一行代码就获得了一个功能丰富的管理接口。
接下来我们将需要到如何自定义管理接口,另外还将了解iiiiDjango提供的权限管理系统中的特性。
自定义管理接口
Django 提供的管理接口功能非常强大而且扩展性强。你只要花几分钟时间就可以得到一个功能完善的管理接口。尽管Django默认提供的管理借口已经提供了丰富的功 能,不过Django还是提供了许多方法来自定义和增强管理接口。你可以指定那些模块可以出现在管理接口中,以及模型结果列表显示的方式,你还可以自定义 管理接口。现在就让我开始学习这些个功能吧。
自定义列表页面
就像我们前面讲的那样,我们在模型类中定要了一个空的Admin类,这个类可以用于自定义管理接口。
让我们通过一个例子来学习,如下图所示页面中显示了书签的列表:
如果将书签的标题、URL和书签的所有者分不同的列显示不是更好吗?实现这一功能只需要一行代码。我们修改bookmarks/models.py中的bookmark模型,将其中Admin类中的pass关键字替换为下面代码中黑体字的部分:
现在刷新一下页面看看有什么变化:
现在表格看起来组织的更好了,我们在Admin类中定义了一个list_display元组,这个元组中的元素包含了显示在列表中的字段名。
还有其他一些属性方法可以在Admin类中使用,每一个都是一个元组,其中可以包含一个或者多个元素:
- list_filter:如果定义了这个属性那么页面上会显示一个側边栏,根据这个元组中定义的字段属性会显示过滤器链接。
- ordering:这个元组用于定义显示类别中的排序字段有哪些。存在于元组中字段在页面上会有一个排序标志,可以进行升序或者绛序排列。
- search_fileds:增加元组中定义的字段为搜索字段。
现在就在我们的书签应用程序中应用我们上面提到的这些功能。打开bookmark/models.py文件编辑Bookmark模型,并加入下面黑体字部分的代码:
新增部分增加了以下功能:
- list_filter:提供按照用户过滤书签的功能。
- ordering:为标题字段提供排序功能。
- search_fields:允许用户按照书签的标题进行搜索。
现在刷新一下页面看看有什么变化:
就像你看到的那样我们只用了很少的代码就改进了页面的功能,接下来我们将学习如何修改管理接口模块的模板来对管理接口提供更好的控制。
重载管理接口模板
有时你可能想好修改一下管理接口的页面外观或者将模型部分还一下位置,幸运的是Django提供的管理接口非常容易扩展,你可以很容易的重载它来实现你想要的。
自定义管理接口模板的过程很简单。首先你把管理接口的模板复制到你的项目的模板目录下,然后扩展模板来实现你想要的功能。管理接口模板的位置取决于Django安装的位置,下列出了一些主流操作系统上Django的安装目录(x.x代表Python的版本号):
* Windows: C:PythonXXLibsite-packagesdjango
* UNIX and Linux: /usr/lib/pythonX.X/site-packages/django
* Mac OS X: /Library/Python/X.X/site-packages/django
如果在默认的安装路径下找不到,就查找一下django-admin.py的位置,可能你会找到多个,但是其中一个是位于Django安装目录下的bin目录下。
找到Django的安装路径后,打开django/contrib/admin/templates/,你就会找到管理接口用到的模板,这里有很多文件但是最重要的是:
- admin/base_site.html:这是所有管理接口的根模板,所有页面都继承自这个模板。
- admin/change_list.html:这是用于显示模型对象列表的页面。
- admin/change_form.html:这个模板用于显示修改或者增加数据模型的页面。
- admin/delete_confirmation.html:这个模板用于删除对象是显示的确认页面。
让我们来试着修改一下这些模板,假设我们想要修改管理接口模板上的文字"Django administration"。要完成这一功能,我们需要在templates目录下创建一个admin目录,然后把 admin/base_site.html 文件复制到这里,然后打开它把所有的"Django"替换为"Django Bookmarks":
{% trans 'Django Bookmarks administration' %}
刷新一下页面看看有什么变化:
修改过程很简单不是吗?你可以自己试着检验一下,比如你可能希望在列表页面和编辑页面上加上一个帮助信息。管理接口的模板利用了Django的模板技术,如果你在其中看到不熟悉的标签,你可以查看Django的文档。
用户,用户组和授权
到目前为止,我们一直使用在manage.py syncdb时创建的超级用户登录系统。在实际情况下还有其他一些受信用户会访问管理接口,本节我们将学习如何授权其他用户登录管理接口,并讲解Django的权限管理系统。
不过在我们开始之前,我们需要强调一下:只有受信用户可以访问管理接口,管理接口功能非常强大所以一定要确定用户是你可以信任的才能授权他访问管理接口。
用户权限
如果除了超级用户你的系统里还没有其他用户,那么你可以通过我们在第四章中建立的用户注册程序注册一个用户。另外你也可以通过在管理接口中点击 User下的Add User来增加一个用户。接下来返回到用户列表页面点击你刚才创建的那个用户名称。你会看到一个表单页面,在这个页面上你可以编辑用户信息比如用户名和用 户的email等。在权限管理部分(Permissions)你可以看到一个Staff status复选框。打开这个选项就可以让这个用户登录管理接口;但是这个用户出了可以登录管理接口之后什么都不能作因为我们并没有授权给他。
为了给用户赋予足够的权限来编辑数据模型,你可以打开Superuser status选项,这样这个用户就有了与管理员一样的权限。但是通常给一个用户赋予管理员的权限并不可取。因此你可以通过Django提供的权限管理系统 更灵活的给用户授权。在Superuser status复选框的下面你可以看到一个授权列表,仔细看看这个列表你会发现每个数据模型有三个可用权限:
- 在数据模型中增加对象的权限。
- 在数据模型中修改对象的权限。
- 从数据模型中删除对象的权限。
Django会为包含Admin内部类的所有数据模型自动创建这样的权限模块。你可以通过箭头来给当前的用户授予权限。比如我们可以给一个用户授予 对link,tag和bookmark授予增、删和改的权限。现在登出系统并用刚才我们授权的那个用户登录,你会发现你只能操控link,tag和 bookmark模型。
编辑用户页面的授权功能部分有一个Active复选框,如果你取消选择这个复选框,那么这个用户就无法再登录这个站点或者管理接口。
用户组权限
如果你有许多个有相同权限的用户,而你准备给每个用户单独授权,这无意是一件恐怖的事情。因此,Django提供了另一个用户管理功能;用户组。简 单的说,用户组是用来对拥有相同权限的用户进行分组。你可以创建一个组并给这个组授权,那么当你将一个用户加入到这个组中,那么这个用户就拥有了这个组所 拥有的权限。
创建用户组对象很简单,点击管理接口主页上的Groups,然后点击Add Group。接下来给这个组起个名字并授予一定权限,最后保存它。
要将一个用户加到某个组下面,你可以选择编辑一个用户,然后在Groups部分选择你要将这个用户加入的组。
在视图中使用权限
尽管到目前为止我们之在管理接口中使用到了权限系统,Django同样允许我们在编写视图函数时使用权限功能。你可以在编写试图函数时利用权限功能,给某个函数设置一个或者一组权限,比如对于某些似有信息只有特殊授权的用户可以访问。本节我们将学习如何实现这些功能。
如果你要检验一个用户是否有某个权限,你可以利用User对象的has_perm方法。这方法接收一个代表用户权限的字符串参数:
app.operation_model
app代表应用程序的名称;operation可以是add,change和delete;model是模块的名称,比如我们要检验一个用户是否有增加连接的功能,我们可以这样:
user.has_perm('bookmarks.add_tag')
也可以通过下面的方法检验一个用户是否可以修改书签:
user.has_perm('bookmarks.change_bookmark')
此外,Django还提供了称为"装饰器"的技术,通过它可以限制某个试图只有特定用户可以访问。这个装饰器名为permission_required,它位于django.contrib.auth.decorators包中。
使用这个装饰器和我们之前使用login_required来限制某些视图只有特定用户可以访问的方式类似。假设我们想限制 bookmark_save_page视图只有拥有 bookmarks.add_bookmark权限的用户才可以访问,我们可以通过下们的代码实现:
这个装饰器有两个参数:第一个是访问这个试图需要具备的权限,另一个是一个URL,这个URL用于没有权限的用户访问这个视图时重定向的位置。
那么到底使用has_perm还是permission_required方法取决于你需要控制的权限粒度。如果你打算对整个视图函数的访问进行控 制你可以使用permission_required;如果你准备对视图函数内部逻辑进行权限控制,你可以使用has_perm方法。这两个方法应该足够 应付任何有关权限控制的问题。
总结
尽管本章相对较短,但是我们还是学到了很多东西。这充分证明了使用Django你可以用很少的代码实现许多强大的功能。本章你学习了Django强大的管理接口功能,以及如何自定义管理接口,以及如何利用Django提供的功能丰富的权限管理系统。
下面是对本章的一个简短总结:
- 在项目中激活管理接口的方法
- 在settings.py文件中的INSTALLED_APPS变量增加django.contrib.admin应用程序。
- 运行manage.py syncdb来将管理接口的数据模型同步到数据库中。
- 在urls.py文件中定义管理接口的入口URL。
你可以在数据模型的Admin类中增加以下字段来定制管理接口中页面显示方式。
你可以通过调用User对象的has_perm方法来判断用户是否拥有某个权限。
你可以通过django.contrib.auth.decorators包下的permission_required装饰器来显示某些视图只有特定用户可以访问。
在接下来的一章中你将学到当今几乎所有的Web2.0程序中都有的几个功能。诸如RSS,查询和浏览流行的内容等等,所以接着学习吧。
No comments:
Post a Comment