今天我们要实现的是blog的管理员交互界面,在django框架中已经存在管理员相关数据,所以我们要做的是将这些已有的东西展示出来:
Django Admin
我们需要实现一些管理员特有的CRUD operation(数据库添删改查操作)。但要知道,制作HTML页,实现对模型的创建,读,更新和删除以及错误检测是十分费力的。在Django的世界中这可不是应当花费大量时间的地方。最后的限期可能只是几小时,而不是几天或是几星期。为了解决这个问题,Django的创造着实现了出众的管理员界面,这大大减少了编写过程中的代码量。
需要一个量身定做的管理员网站?
这已经成为了可能,你可以使用定制的Django管理员界面,同时,你还可以通过自己的views来生成一个定制的网站。如果大多数用户是与类似管理员界面交互的,那么为它们定制一个界面是很好的选择,但这超出了这个教程的范围。
Django的管理员默认情况下是停用的,所以我们需要在settings.py中启用它。在INSTALLED_APPS中添加admin(注意在‘posts’之前,在新版本中,admin是默认注释的,所以只要把注释符去掉即可),结果如下:
INSTALLED_APPS = (
’django.contrib.auth’,
’django.contrib.contenttypes’,
’django.contrib.sites’,
’django.contrib.admin’,
’posts’,
)
这样管理员应用就添加进项目了。别忘了执行命令:python manage.py syncdb
下一步,我们要将url映射到管理员函数。打开urls.py将含admin的语句前的注释符去掉,得到结果如下:
from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns(”,
(r’^admin/’, include(admin.site.urls)),
)
Django admin urls.py 解析
from django.conf.urls.defaults import *
这段代码的功能是import所有urls样板需要的函数,包括patterns函数。
from django.contrib import admin
这段代码import一个代表了完整的管理员后端网站的实例。通过继承它,你可以将管理员网站做更广泛的应用,但这需要你创建你自己的实例。
admin.autodiscover()
这段代码是用来在所有的INSTALLED_APPS中查找能被用来定制有着具体的模型细节的管理员界面的admin.py文件。因为我们将要在posts应用中添加admin.py来支持管理员界面,所以这段代码十分重要。
(r’^admin/’, include(admin.site.urls)),
这段代码将所有以admin/开头的url转送至admin.site.urls中的另一个urls.py去检测匹配情况。关于其中细节在这里也没必要去了解。在正则表达式开头的‘r’表示这是一个raw string。这意味着通过加'\'来实现换码是没用的,’\‘也只会被翻译成它们本身。在python中,正则表达式通常用raw string表示。
既然讲到这,我们就在来谈谈urls.py。这个文件的作用是将传过来的url映射到python函数。传进来的url总是预先将http://, domain name, port, 和开始的'/'去除。所以 http://localhost/admin/只会对admin与上面的url匹配。
请注意admin与admin/看起来是不同,但它们的效果是一样的。假如admin找不到匹配,一个'/'会自动加在其后并重新进行匹配。说简单点,就是admin会通过匹配的方式被重定向到admin/。
URL是一个元组(不可变数组),它以需要匹配的正则表达式开始,之后是其映射到的函数。在元组中可选的元素可以是一个含有参数和值的字典。元组中第二个元素既可以是一个指向函数的字符串形式的模块路径也可以直接就是函数本身。如果使用字符串形式,模块路径的前缀会在查找匹配前自动加上。
包括装载另一个url集合,转移任何与传进来的url匹配的请求()
[include loads a another set of urls (identical to urls.py), removes whatever matched the incoming url (in this case, admin/ and checks for matches with the included urls.]
(以上没读懂,望高手指教)
在之后我们还会遇到另外一种定义url的方式。
现在让我们来告诉Django的admin用户能通过管理员界面来编辑我们的模型。我们需要在posts应用中添加一个admin.py文件来达到我们的要求。或者,我们可以将admin.py中的代码写入models.py中,但如果你没有在INSTALLED_APPS中添加django.contrib.admin的话,会导致错误。admin.py只在admin.autodiscover()被调用时才被装载,这也表示项目中已经安装有admin应用了。
让我们把下面的代码加入admin.py中:
from django.contrib import admin
from models import Post
# new code will go here later on
admin.site.register(Post)
这是将你定义的模型加入管理员界面的最简便的方式。让我们预览一下我们目前为止的工作:
运行开发服务器
Django中含有一个开发服务器。只需简单的执行python manage.py runserver就能初始化服务器。
关于Django runserver命令
Django中的runserver只是一个最原始的服务器,它并不能用作成型的产品,因为它并没有对速度优化与安全设计。但它包含的重新载入你修改的模型,视图和url的功能,因此Django适合于迅速的开发。
添加一个发帖子的界面
定制模型展示
大多数情况下你可能只想把管理员界面改一改。可以通过扩展ModelAdmin类来达到你的需求。用下面的代码替换admin.py中的:from django.contrib import admin
from models import Post
class PostAdmin(admin.ModelAdmin):
pass
admin.site.register(Post, PostAdmin)
Django admin.py 内容分析
from django.contrib import admin
与在urls.py中的那行一样效果。import AdminSite实例。
from models import Post
import 我们在models.py中定义的Post模型
class PostAdmin(admin.ModelAdmin):
创建一个PostAdmin类来继承ModelAdmin类。这样的类的标准命名规范为<model_name>Admin
pass
告诉python在这个类中没有任何东西(一个空的代码块)
admin.site.register(Post, PostAdmin)
注册Post模型,在AdminSite实例中使用PostAdmin做模型细节。
虽然代码变了,但其实什么都还没改变。因为之前的代码和现在的所做的是同样的事,但我们现在要开始制作我们自己的PostAdmin类了。首先我们要将用户的输入分离开(之后,我们将会让它自动分配给当前用户),用下列代码替换’pass‘:
fields = (‘title’, ‘body’)
list_display = (‘title’, ‘author’, ‘pub_date’)
date_hierarchy = ‘pub_date’
fields限制了展示出来的可添加与编辑的字段。或者,也可以使用排除的方式达到同样的效果。list_play说明了在posts列出的视图中哪些字段或函数被显示出来。如果这一项没说明的话,那么默认是模型中__unicode__的返回结果。date_hierarchy允许用户向下展开一个特殊的时间字段。
现在,如果我们想添加点东西的话,会产生一个错误,因为author字段必须填上。我们能通过重载save_model方法在保存前添加值。将下列代码添加在date_hierarchy之后就行了:
def save_model(self, request, obj, form, change):
if not change:
obj.author = request.user
obj.save()
这个简单的检查是用来确认一个实例模型是否是新的。如果是的话,那么在保存之前author字段会自动设置成当前登录用户。request是http response对象,它通常传给一个view。request中包含了许多某个客户的特殊的http请求信息。django.contrib.auth应用为了提供当前用户的信息,在request对象中添加了user字段。obj代表我们要保存的特定模型实例。form代表一个用来包含显示信息,认证和准备表单与数据。最后,change指出当前模型是否已存在(True)或者是一个需要在数据库中创建的新记录(False)。
现在如果我们添加一个帖子,当前登录的用户就会是作者了。
pub_date字段名显示时看起来不怎么简短。虽然django自动将下划线转换为空格,但我们想要添加一个别名。让我们打开models.py然后对pub_date和up_date做些小小的改变:
pub_date = models.DateTimeField(‘Date Published’, auto_now_add=True)
up_date = models.DateTimeField(‘Date Updated’, auto_now=True)
这样就改变了它们在管理员界面上的名字。当然,这种方法对其他任何字段也适用。现在,我们就得到了我们想要的东西。
PS:翻译完感觉有些地方没读懂,大概的意思有点体会。
个人觉得需要注意的地方:
1.admin.autodiscover()
2.save_model(self, request, obj, form, change)中的参数含义