• django_book学习笔记5Django站点管理


    一、开启管理功能
    1、django.contrib包介绍
    Django自动管理工具是django.contrib的一部分。django.contrib是一套庞大的功能集,它是Django基本代码的组成部分,Django框架就是由众多包含附加组件(add-on)的基本代码构成的。
    你可以把django.contrib看作是可选的Python标准库或普遍模式的实际实现。 它们与Django捆绑在一起,这样你在开发中就不用“重复发明轮子”了。
    从技术层面上讲,它被称作django.contrib.admin。django.contrib中其它可用的特性,如用户鉴别系统(django.contrib.auth)、
    支持匿名会话(django.contrib.sessioins)以及用户评注系统(django.contrib.comments)。

    2、激活管理界面
    1)将'django.contrib.admin'加入setting的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'

    3、创建管理数据表
    ./manage.py syncdb
    运行manage.py syncdb 。这一步将生成管理界面使用的额外数据库表。 当你把'django.contrib.auth'加进INSTALLED_APPS后,第一次运行syncdb命令时, 系统会请你创建一个超级用户。
    如果你不这么作,你需要运行python manage.py createsuperuser来另外创建一个admin的用户帐号,否则你将不能登入admin

    4、将admin访问配置在URLconf(记住,在urls.py中).
    默认情况下,命令django-admin.py startproject生成的文件urls.py是将Django admin的路径注释掉的,你所要做的就是取消注释。 请注意,以下内容是必须确保存在的:
    [root@pxe-svr mysite]# vim mysite/urls.py
    # Include these import statements...
    from django.contrib import admin
    admin.autodiscover()

    # And include this URLpattern...
    urlpatterns = patterns('',
    # ...
    (r'^admin/', include(admin.site.urls)),
    # ...
    )
    当这一切都配置好后,现在你将发现Django管理工具可以运行了。 启动开发服务器
    然后在浏览器中访问:http://127.0.0.1:8000/admin/

    5、使用管理工具。
    http://192.168.78.250:8000/admin/
    在Django管理页面中,每一种数据类型都有一个* change list* 和* edit form* 。前者显示数据库中所有的可用对象;后者可让你添加、更改和删除数据库中的某条记录。
    其它语言

    6、本地化
    如果你的母语不是英语,而你不想用它来配置你的浏览器,你可以做一个快速更改来观察Django管理工具是否被翻译成你想要的语言。
    仅需添加`` ‘django.middleware.locale.LocaleMiddleware’`` 到`` MIDDLEWARE_CLASSES`` 设置中,并确保它在’django.contrib.sessions.middleware.SessionMiddleware’* 之后*
    [root@pxe-svr mysite]# vim mysite/settings.py
    MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
    )

    7、将你的Models加入到Admin管理中
    在`` books`` 目录下(`` mysite/books`` ),创建一个文件:`` admin.py`` ,然后输入以下代码:
    [root@pxe-svr mysite]# vim books/admin.py
    from django.contrib import admin
    from mysite.books.models import Publisher, Author, Book

    admin.site.register(Publisher)
    admin.site.register(Author)
    admin.site.register(Book)
    1.4版本需要修改为from books.models import Publisher, Author, Book
    不然报错Exception Value: No module named books.models
    登陆admin你会看到一个Books区域,其中包含Authors、Books和Publishers。(可能需要先停止,然后再启动服务(`` runserver`` ),才能使其生效)

    另外还有一个做法 编辑app里面的modles.py【1.4版本其他版本未知】
    添加
    from django.contrib import admin
    #admin.site.register(Publisher,Author,Book)
    admin.site.register(Publisher)
    admin.site.register(Author)
    admin.site.register(Book)
    可以同事注册两个admin.site.register(BlogPost, BlogPostAdmin) 但不能超过3个 #这里理解错误
    admin.site.register()函数接受一个ModelAdmin子类作为第二个参数。 如果你忽略第二个参数,Django将使用默认的选项。Publisher和Book的注册就属于这种情况。

    二、高级管理功能

    1、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。

    2、设置字段可选
    为了指定email字段为可选,你只要编辑Book模块(回想第五章,它在mysite/books/models.py文件里),在email字段上加上blank=True。代码如下:1

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

    3、设置日期型和数字型字段可选
    如果你想允许一个日期型(DateField、TimeField、DateTimeField)或数字型(IntegerField、DecimalField、FloatField)字段为空,你需要使用null=True * 和* blank=True。
    class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField(**blank=True, null=True** )

    虽然blank=True同样适用于日期型和数字型字段,但是这里需要详细讲解一些背景知识。
    为了消除歧义,Django生成CREATE TABLE语句自动为每个字段显式加上NOT NULL。 这里有个生成Author模块的例子:

    CREATE TABLE "books_author" (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(40) NOT NULL,
    "email" varchar(75) NOT NULL
    )
    ;
    在大多数情况下,这种默认的行为对你的应用程序来说是最佳的,因为它可以使你不再因数据一致性而头痛。
    而且它可以和Django的其它部分工作得很好。如在管理工具中,如果你留空一个字符型字段,它会为此插入一个空字符串(而* 不是*NULL)。
    但是,其它数据类型有例外:日期型、时间型和数字型字段不接受空字符串。 如果你尝试将一个空字符串插入日期型或整数型字段,你可能会得到数据库返回的错误,
    这取决于那个数据库的类型。 (PostgreSQL比较严禁,会抛出一个异常;MySQL可能会也可能不会接受,这取决于你使用的版本和运气了。)
    在这种情况下,NULL是唯一指定空值的方法。 在Django模块中,你可以通过添加null=True来指定一个字段允许为NULL。

    四、高级功能-自定义标签
    1、自定义字段标签 verbose_name。
    在编辑页面中,每个字段的标签都是从模块的字段名称生成的。 规则很简单: 用空格替换下划线;首字母大写。例如:Book模块中publication_date的标签是Publication date。
    想自定义一个标签。 你只需在模块中指定verbose_name。
    举个例子,说明如何将Author.email的标签改为e-mail,中间有个横线。
    class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField(blank=True, verbose_name='Python-mail')
    1.4版本自动加载,无需重启。
    不必把verbose_name的首字母大写,除非是连续大写(如:"USA state")。Django会自动适时将首字母大写,并且在其它不需要大写的地方使用verbose_name的精确值。
    还需注意的是,为了使语法简洁,你可以把它当作【固定位置的参数】传递。 这个例子与上面那个的效果相同。
    class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField('Python-mail',blank=True)
    把它当作【固定位置的参数】传递但这不适用于ManyToManyField 和ForeignKey字段,因为它们第一个参数必须是模块类。 那种情形,必须显式使用verbose_name这个参数名称。

    五、高级功能-自定义ModelAdmin类
    迄今为止,我们做的blank=True、null=True和verbose_name修改其实是模块级别,而不是管理级别的。
    除了这些,Django还提供了大量选项让你针对特别的模块自定义管理工具。 这些选项都在ModelAdmin classes里面,这些类包含了管理工具中针对特别模块的配置.
    (一)列表
    1)自定义列表 verbose_name='python-mail'
    自定义Author模块的列表中的显示字段。 列表默认地显示查询结果中对象的__unicode__()。
    class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField(blank=True,verbose_name='python-mail')

    def __unicode__(self):
    return u'%s %s' % (self.first_name, self.last_name)
    可以在这基础上改进,添加其它字段,从而改变列表的显示。 这个页面应该提供便利,比如说:在这个列表中可以看到作者的邮箱地址。如果能按照姓氏或名字来排序,那就更好了。
    为了达到这个目的,我们将为Author模块定义一个ModelAdmin类。 这个类是自定义管理工具的关键,其中最基本的一件事情是允许你指定列表中的字段。 打开admin.py并修改:
    实际我修改了books/models.py 添加一个管理author类并注册
    [root@pxe-svr mysite]# vim books/models.py
    class AuthorAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'email')

    admin.site.register(Author,AuthorAdmin)
    我们新建了一个类AuthorAdmin,它是从django.contrib.admin.ModelAdmin派生出来的子类,保存着一个类的自定义配置,以供管理工具使用。
    我们只自定义了一项:list_display, 它是一个字段名称的元组,用于列表显示。 当然,这些字段名称必须是模块中有的。
    我们修改了admin.site.register()调用,在Author后面添加了AuthorAdmin。你可以这样理解: 用AuthorAdmin选项注册Author模块。
    【注意】:admin.site.register()函数接受一个ModelAdmin子类作为第二个参数。 如果你忽略第二个参数,Django将使用默认的选项。Publisher和Book的注册就属于这种情况。
    再刷新author列表页面,你会看到列表中有三列:姓氏、名字和邮箱地址。 另外,点击每个列的列头可以对那列进行排序。

    2)添加一个快速查询栏 search_fields
    向AuthorAdmin追加search_fields,如:
    [root@pxe-svr mysite]# vim books/models.py
    class AuthorAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'email')
    search_fields = ('first_name', 'last_name')
    刷新浏览器,你会在页面顶端看到一个查询栏。 我们刚才所作的修改列表页面,添加了一个根据姓名查询的查询框。
    正如用户所希望的那样,它是大小写敏感,并且对两个字段检索的查询框。
    3)列表页添加一些过滤器 list_filter
    为Book列表页添加一些过滤器。
    [root@pxe-svr mysite]# vim books/models.py
    添加管理类
    class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ('publication_date',)
    激活使用
    admin.site.register(Book,BookAdmin)
    `` 过滤器`` 同样适用于其它类型的字段,而不单是`` 日期型`` (请在`` 布尔型`` 和`` 外键`` 字段上试试)。当有两个以上值时,过滤器就会显示。
    4)另外一种过滤日期的方式是使用date_hierarchy 【仅仅时间】
    [root@pxe-svr mysite]# vim books/models.py
    class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ('publication_date',) #原来的列表过滤保留
    date_hierarchy = 'publication_date' #增加日期的过滤
    修改好后,页面中的列表顶端会有一个逐层深入的导航条
    注意,date_hierarchy接受的是* 字符串* ,而不是元组。因为只能对一个日期型字段进行层次划分。
    5)改变默认的排序方式,
    改变默认的排序方式,按publication date降序排列。 列表页面默认按照模块class Meta中的ordering所指的列排序。
    但目前没有指定ordering值,所以当前排序是没有定义的。
    [root@pxe-svr mysite]# vim books/models.py
    class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ('publication_date',)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',) #增加这里

    (二)、表单
    1、自定义编辑表单(单个字段) fields = ('title', 'authors', 'publisher')
    正如自定义列表那样,编辑表单多方面也能自定义。
    首先,我们先自定义字段顺序。 默认地,表单中的字段顺序是与模块中定义是一致的。 我们可以通过使用ModelAdmin子类中的fields选项来改变它:
    class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ('publication_date',)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
    fields = ('title', 'authors', 'publisher') #增加后编辑表单只能编辑这三个字段,这样在编辑页面就无法对publication date进行改动。

    当一个用户用这个不包含完整信息的表单添加一本新书时,Django会简单地将publication_date设置为None,以确保这个字段满足null=True的条件。
    在1.4版本下面报错了
    Exception Value: (1048, "Column 'publication_date' cannot be null")

    2、自定义编辑表单(多对多字段) filter_horizontal()横排 filter_vertical()垂直 ,raw_id_fields() 下拉框
    针对多对多字段的。`` 多对多字段`` 被展现成多选框。虽然多选框在逻辑上是最适合的HTML控件,但它却不那么好用。
    如果你想选择多项,你必须还要按下Ctrl键(苹果机是command键)。 虽然管理工具因此添加了注释(help_text),但是当它有几百个选项时,它依然显得笨拙。
    class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ('publication_date',)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
    filter_horizontal = ('authors',)
    #filter_vertical = ('authors',)
    刷新book编辑页面,你会看到Author区中有一个精巧的JavaScript过滤器,它允许你检索选项,然后将选中的authors从Available框移到Chosen框,还可以移回来。
    注意移除fields选项,以使得编辑页面包含所有字段(多对多的字段)。
    针对那些拥有十个以上选项的`` 多对多字段`` 使用filter_horizontal。 这比多选框好用多了。 你可以在多个字段上使用filter_horizontal,只需在这个元组中指定每个字段的名字。

    ModelAdmin类还支持filter_vertical选项。 它像filter_horizontal那样工作,除了控件都是垂直排列,而不是水平排列的。 至于使用哪个,只是个人喜好问题。

    filter_horizontal和filter_vertical选项只能用在多对多字段 上, 而不能用于 ForeignKey字段。 默认地,管理工具使用`` 下拉框`` 来展现`` 外键`` 字段。但是,
    正如`` 多对多字段`` 那样,有时候你不想忍受因装载并显示这些选项而产生的大量开销。 例如,我们的book数据库膨胀到拥有数千条publishers的记录,
    以致于book的添加页面装载时间较久,因为它必须把每一个publishe都装载并显示在`` 下拉框`` 中。
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ('publication_date',)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
    #fields = ('title', 'authors', 'publisher', 'publication_date')
    #filter_horizontal = ('authors',)
    #filter_vertical = ('authors',)
    raw_id_fields = ('publisher',)#添加 针对ForeignKey字段字段的下拉框
    在这个输入框中,你输入什么呢? publisher的数据库ID号。 考虑到人们通常不会记住这些数据库ID,管理工具提供了一个放大镜图标方便你输入。
    点击那个图标将会弹出一个窗口,在那里你可以选择想要添加的publishe。
    解决这个问题的办法是使用`` raw_id_fields`` 选项。

    六、用户、用户组和权限
    1、有一组三个布尔型标记:
    活动标志,它用来控制用户是否已经激活。 如果一个用户帐号的这个标记是关闭状态,而用户又尝试用它登录时,即使密码正确,他也无法登录系统。

    成员标志,它用来控制这个用户是否可以登录管理界面(即:这个用户是不是你们组织里的成员) 由于用户系统可以被用于控制公众页面(即:非管理页面)的访问权限,
    这个标志可用来区分公众用户和管理用户。

    超级用户标志,它赋予用户在管理界面中添加、修改和删除任何项目的权限。 如果一个用户帐号有这个标志,那么所有权限设置(即使没有)都会被忽略。

  • 相关阅读:
    Java 嵌套循环之九九乘法表
    Java switch语句第二种用法
    Java switch语句
    Java if-else if-else多选择结构代码
    Java if else双选择结构之计算圆的面积和周长
    Java if单选择结构---掷色子游戏
    在webstorm11中使用nodejs库的智能提示功能
    Node.JS 学习路线图
    Nodejs系列课程,从入门到进阶帮你打通全栈
    使用supervisor提高nodejs调试效率
  • 原文地址:https://www.cnblogs.com/diege/p/2718654.html
Copyright © 2020-2023  润新知