所谓网页开发是有趣的,管理界面是千篇一律的。所以就有了django自动管理界面来减少重复劳动。

1、django.contrib包

django自带了很多优秀的附加组件,它们都存在于django.contrib包里,与django捆绑,使开发人员不需要重复造轮子。django.contrib是一套庞大的功能集,它是Django基本代码的组成部分,Django框架就是由众多包含附加组件(add-on)的基本代码构成的。

django自动管理工具就是django.contrib的一部分。django自动管理工具被称为django.contrib.admin。django.contrib中还有其他可以的特性,如用户鉴别系统(django.contrib.auth)、支持匿名会话(django.contrib.sessions)以及用户评注系统(django.contrib.comments)。

2、激活管理界面

因为管理界面是可选的,所以用之前首先要激活。

第一步,配置settings.py

1、在INSTALLED_APPS中取消注释django.contrib.admin。(INSTALLED_APPS中的配置顺序无关)

2、在INSTALLED_APPS取消注释'django.contrib.auth''django.contrib.contenttypes''django.contrib.sessions',Django的管理工具需要这3个包。 

3、在MIDDLEWARE_CLASSES中取消注释'django.middleware.common.CommonMiddleware''django.contrib.sessions.middleware.SessionMiddleware''django.contrib.auth.middleware.AuthenticationMiddleware' 。

第二步,生成数据库

运行python manage.py syncdb。生成管理界面使用的额外数据库表。

把'django.contrib.auth'加入INSTALLED_APPS后,第一次运行syncdb命令时,系统会请你创建一个超级用户。

liuxiaoyan@development:~/mysite$ python manage.py syncdb
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
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): 

第三步,配置URL

在urls.py中取消注释admin相关的三行注释

# Include these import statements...
from django.contrib import admin
admin.autodiscover()

# And include this URLpattern...
urlpatterns = patterns('',
    # ...
    (r'^admin/', include(admin.site.urls)),
    # ...
)

现在django管理工具可以运行了。但是现在只有Groups和Users两个站点。

二、将新Models加入Admin管理

1、在books目录下创建一个文件:admin.py,然后输入代码:

liuxiaoyan@development:~/mysite/books$ clear

liuxiaoyan@development:~/mysite/books$ cat admin.py   
from django.contrib import admin
from books.models import Publisher, Author, Book

admin.site.register(Publisher)
admin.site.register(Author)
admin.site.register(Book)

这些代码通知管理工具为该模型提供界面。服务重启就可以看到新增了books站点。

操作界面:

books的外键Publisher是用一个下拉选择框来显示的。

"多对多"的自动author用一个多选框提醒。

2、Admin工作原理

服务启动时,Django从"url.py"引导URLconf,然后执行"admin.autodiscover()"语句。这个函数遍历INSTALLED_APPS配置,并且寻找相关的admin.py文件,如果在指定的app目录下找到admin.py,就执行其中的代码。

在"books"应用程序的"admin.py"文件中,每次调用"admin.site.register()"都将那个模块注册到管理工具中。管理工具只为那些明确注册了的模块显示一个编辑/修改的界面。

应用程序"django.contrib.auth"包含自身的"admin.py",所以Users和Groups能在管理工具中自动显示。其他的django.contrib应用程序,如django.contrib.redirects,其他从网上下载的第三方Django应用程序一样,都会自行添加到管理工具。

综上所述,管理工具其实就是一个Django应用程序,包含自己的模型、模板、视图和URLpatterns。

三、自定义管理页面模块

1、设置字段可选(blank=True)

比如设置email字段可选,编辑Auth模块(mysite/books/models.py),在email字段加上blank=True。

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField(blank=True) 

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

不要重启服务,刷新浏览器即可看到Email:标签原来是加粗的,现在已经不是粗体了,说明已生效。

2、设置日期类型和数字字段可选(略复杂null=True blank=True)

为了保证数据一致性,django生成的CREATE TABLE语句自动为每个字段显示加上NOT NULL。这种做法在你给一个字段留空时,会插入一个空字符串(而非NULL)。

但是,其他数据类型有礼物:日期型、时间型和数字型字段不接受空字符串。这种情况NULL是唯一指定空值的方法。在Django模块中,可以通过添加null=True来指定一个字段允许NULL。

所以重点来了,想要允许一个日期型(DateField、TimeField、DateTimeField)或者数字型(IntegerField、DecimalField、FloatField)字段为空,需要同时使用null=True和blank=True。

添加null=True比添加blank=True复杂,因为null=True改变了数据的语义,即改变了CREATE TABLE语句,把publication_date字段上的NOT NULL删除了。所以要更新数据库。

但是Django又不会自动更新数据库结构。所以必须手动执行ALTERTABLE语句将模块的改动更新至数据库。

liuxiaoyan@development:~/mysite$ python manage.py dbshell
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 190627
Server version: 5.5.31-0ubuntu0.12.04.2-log (Ubuntu)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use lxybooks
Database changed
mysql> show tables;
+----------------------------+
| Tables_in_lxybooks         |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_message               |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| books_author               |
| books_book                 |
| books_book_authors         |
| books_publisher            |
| django_admin_log           |
| django_content_type        |
| django_session             |
+----------------------------+
14 rows in set (0.00 sec)

mysql> alter table books_book change publication_date publication_date date NULL;
Query OK, 3 rows affected (0.32 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> 
View Code

相关文章: