Django 快速实战入门(七):admin 应用

作者:Hily 原始链接:http://hily.me/blog/2008/11/learning-django-ch7/
版权声明:可以转载,转载时务必以超链接形式标明文章原始出处作者信息版权声明

管理后台对于每个网站来说都是必须,在管理后台中,我们可以添加、编辑和删除网站内容。

Django 中引入了 admin 应用,可以帮助我们快速地建立管理后台。

下面,我们就要利用 Django 附带的 admin 应用来为我们的留言板创建一个管理后台。

激活 admin 应用

修改 settings.py,在 INSTALLED_APPS 列表中加入 'django.contrib.admin':

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'myblog.messages',
)

在第五节创建留言板的数据模型过程中,为了在安装模型过程中不至于产生许多不需要的表,我们在 settings.py 中禁用了许多应用。在这里,因为 admin 应用依赖于 'django.contrib.auth'、'django.contrib.contenttypes' 和 'django.contrib.sessions',因此我们需要同时重新激活它们。另外,如果需要对多个站点进行管理,还需要激活 'django.contrib.sites'。

激活后,我们需要再执行一次同步数据库的操作,来将这些应用中需要用到的表安装到 MySQL:

gentoo myblog # python manage.py syncdb
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'root'):
E-mail address: hily@test.com
Password:
Password (again):
Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Message model
Installing index for admin.LogEntry model

如上所示,安装过程中会提示您创建用于管理后台的超级管理员的用户名和密码,按照提示输入即可。

安装完成后,MySQL 中的数据表如下:

mysql> show tables;
+----------------------------+
| Tables_in_mydb             |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_message               |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_session             |
| django_site                |
| messages_message           |
+----------------------------+
12 rows in set (0.01 sec)

配置管理后台入口

修改项目目录下的 urls.py,将以下行前面的注释去掉即可:

from django.contrib import admin
admin.autodiscover()

(r'^admin/(.*)', admin.site.root),

访问 http://192.168.1.6:8080/admin/,就可以看到后台管理的登录界面了:

使用刚刚设置的超级管理员用户名和密码就可以登录到管理后台了:

将留言板加入后台管理

到此为止,我们还看不到留言板的管理界面,在这一步我们来实现把留言板加入到管理界面中。

Django 提供了一种简易的方法来将需要进行管理的数据模型添加到管理列表中:

admin.site.register(ModelName)

ModelName 就是需要添加到后台管理菜单中的数据模型类名。

在留言板应用目录 messages/ 下新建一个 admin.py(也可以用其它名称),存储后台的管理菜单配置信息:

from django.contrib import admin
from myblog.messages.models import Message

admin.site.register(Message)

重新启动测试服务器,进入后台,这时候在菜单列表中就出现了 Messages:

点击 Messages 后就可以看到留言的列表了。在这里我们重新修改一下 models.py 中 Message 的 __str__,以便留言列表看起来更简洁:

from django.db import models

class Message(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()
    homepage = models.URLField()
    title = models.CharField(max_length=200)
    content = models.CharField(max_length=500)
    time = models.DateTimeField(auto_now_add=True)
    ip = models.CharField(max_length=20)

def __str__(self):
        return '%s: %s' % (self.name, self.title)

留言列表效果截图:

编码问题

在点击第一条记录“江:留言测试”时,Django 返回错误提示,类似如下:

TemplateSyntaxError at /admin/messages/message/5/

Caught an exception while rendering: 'ascii' codec can't encode character u'\u6c5f' in position 0: ordinal not in range(128)

Original Traceback (most recent call last):
  File "/usr/lib/python2.4/site-packages/django/template/debug.py", line 71, in render_node
    result = node.render(context)
  File "/usr/lib/python2.4/site-packages/django/template/debug.py", line 87, in render
    output = force_unicode(self.filter_expression.resolve(context))
  File "/usr/lib/python2.4/site-packages/django/template/__init__.py", line 559, in resolve
    new_obj = func(obj, *arg_vals)
  File "/usr/lib/python2.4/site-packages/django/template/defaultfilters.py", line 37, in _dec
    args[0] = force_unicode(args[0])
  File "/usr/lib/python2.4/site-packages/django/utils/encoding.py", line 52, in force_unicode
    s = unicode(str(s), encoding, errors)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u6c5f' in position 0: ordinal not in range(128)

这是编码类型有问题造成的,在多语言编码环境中,__str__ 经常会发生问题,因为它只支持 ascii 编码。所以我们修改 messages/models.py 中 Message 的 __str__,将其改为 __unicode__,问题就可以解决了:

from django.db import models

class Message(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()
    homepage = models.URLField()
    title = models.CharField(max_length=200)
    content = models.CharField(max_length=500)
    time = models.DateTimeField(auto_now_add=True)
    ip = models.CharField(max_length=20)

def __unicode__(self):
        return '%s: %s' % (self.name, self.title)

编辑留言页面截图:

定制管理界面

也许你对现在看到的管理界面还不满意,那么你可以通过模板继承的方式从默认模板中继承,并对相应部分进行修改。

Django 管理界面的默认模板位于类似以下路径中,每个管理界面都有一个模板与它相对应:

gentoo myblog # ls -F /usr/lib/python2.4/site-packages/django/contrib/admin/templates/admin/
404.html          change_list_results.html  login.html
500.html          date_hierarchy.html       object_history.html
app_index.html    delete_confirmation.html  pagination.html
auth/             edit_inline/              prepopulated_fields_js.html
base.html         filter.html               search_form.html
base_site.html    includes/                 submit_line.html
change_form.html  index.html                template_validator.html
change_list.html  invalid_setup.html

作为示例,我们接下来就来修改一下留言列表顶部的“Django 管理”,将它替换为“留言管理”。

Django 的 admin 应用查找模板的顺序如下:

  • admin/<应用名称>/<对象名称>/<模板名称>.html
  • admin/<应用名称>/<模板名称>.html
  • admin/<模板名称>.html

留言列表的默认模板为 change_list.html,我们实现一个新的模板来继承并覆盖它。创建 messages/templates/admin/messages/message/change_list.html,内容如下(注意文件编码一定要保存为 UTF8):

{% extends "admin/change_list.html" %}

{% block branding %}
<h1 id="site-name">留言管理</h1>
{% endblock %}

这样就修改成功了,看看效果:

下一节 >>>

Django 快速实战入门(八):部署 Django

以 gentoo+nginx+flup 为例,部署我们的留言板到生产服务器中。

-- EOF --

已经有 5 条评论 »

  1. icc 说道:

    2008年12月09日 15:47

    假如在admin中的list中要显示2到多个model的内容如何做呢?

  2. hilyjiang 说道:

    2008年12月09日 22:52

    如文中所述,多调用几次 admin.site.register 就可以了。

  3. 藏宝图» Blog Archive » Django 快速实战入门(六):表单模型 说道:

    2009年03月19日 22:23

    [...] Django 快速实战入门(七):admin 应用 [...]

  4. 藏宝图» Blog Archive » Django 快速实战入门(七):admin 应用 说道:

    2009年03月19日 22:25

    [...] 原始链接:http://hily.me/blog/2008/11/learning-django-ch7/ [...]

  5. guan 说道:

    2009年04月09日 10:30

    def __str__(self):
    return '%s: %s' % (self.name, self.title)

    我是按照整个教程走的,这一步设置了,但是列表还是老样子。

发表一下您的高见

If you have any question, or for the language problem, please fell free to leave a comment or just contact me with email: hilyjiang [At] Gmail.