django中的站点管理

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

一、激活管理界面

1、django.contrib包

django自带了很多优秀的附加组件,它们都存在于django.conrib包里,与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命令时,系统会请你创建一个超级用户。

[email protected]:~/mysite$ python manage.py syncdbCreating tables ...Creating table auth_permissionCreating table auth_group_permissionsCreating table auth_groupCreating table auth_user_user_permissionsCreating table auth_user_groupsCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_admin_logYou 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,然后输入代码:

[email protected]:~/mysite/books$ clear

[email protected]:~/mysite/books$ cat admin.py   
from django.contrib import adminfrom books.models import Publisher, Author, Bookadmin.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语句将模块的改动更新至数据库。

[email protected]:~/mysite$ python manage.py dbshellReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -AWelcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 190627Server 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 lxybooksDatabase 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: 0mysql>

现在添加book的编辑页面Publication date:不再是粗体,允许输入一个空的publication date。

3、管理界面字段标签重命名(verbose_name)

字段标签命名默认是根据模块的字段名称生成的,规则就是用空格代替下划线,首字母大写。比如Book模块的publication_date的标签是Publication date。

比如将Auther.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=‘e-mail‘) 
  def __unicode__(self):    return u‘%s %s‘ % (self.first_name, self.last_name)

刷新浏览器就可以看到E-mail,因为django自动首字母大写了。

四、自定义管理页面的外观(修改模型中的admin.py)

1、自定义管理页面列表

比如现在的Auther如下,页面只显示姓名。

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=‘e-mail‘) 
  def __unicode__(self):    return u‘%s %s‘ % (self.first_name, self.last_name)

在此基础上,添加其他字段,从而改变列表的显示。比如,在列表中可以看到作者的邮箱地址。如果能按照姓排序就完美了。

为此,为Author模块定义一个AuthorAdmin类。该类是自定义管理工具的关键,其中最基本的一件事是运行你指定列表中的字段。

[email protected]:~/mysite/books$ cat admin.pyfrom django.contrib import adminfrom books.models import Publisher, Author, Bookclass AuthorAdmin(admin.ModelAdmin):  list_display = (‘first_name‘, ‘last_name‘, ‘email‘)admin.site.register(Publisher)
admin.site.register(Author,AuthorAdmin)
admin.site.register(Book)

解释:新建了一个类AuthorAdmin,它是从django.contrib.admmin.ModelAdmin派生出来的子类,保存着一个类的自定义配置,以供管理工具使用。自定义了一项:list_display,它是一个字段名称的元组,用于显示列表。

修改了admin.site.register()调用,在Author后面添加了AuthorAdmin。从AuthorAdmin选项注册
Author模块。这一步很重要,如果不给admin.site.register()加上AuthorAdmin,Django还是使用默认选项,就像
Publisher和Book一样。

现在刷新页面就能看到:三列分别是名称,姓氏和邮箱了,看起来就很爽了。

2、添加快速查询栏

给AuthorAdmin追加search_fields,然后刷新一个查询栏就华丽丽的出来了。

[email protected]:~/mysite/books$ cat admin.pyfrom django.contrib import adminfrom books.models import Publisher, Author, Bookclass AuthorAdmin(admin.ModelAdmin):  list_display = (‘first_name‘, ‘last_name‘, ‘email‘)  search_fields=(‘first_name‘,‘last_name‘)admin.site.register(Publisher)
admin.site.register(Author,AuthorAdmin)
admin.site.register(Book)

3、为books添加一些过滤器(按出版时间过滤书)

照猫画虎,加函数BookAdmin,有两个内容,一个list_display,一个list_filter。再给Book注册加上BookAdmin。

[email protected]:~/mysite/books$ cat admin.pyfrom django.contrib import adminfrom books.models import Publisher, Author, Bookclass AuthorAdmin(admin.ModelAdmin):  list_display = (‘first_name‘, ‘last_name‘, ‘email‘)  search_fields=(‘first_name‘,‘last_name‘)class BookAdmin(admin.ModelAdmin):  list_display = (‘title‘, ‘publisher‘, ‘publication_date‘)  list_filter = (‘publication_date‘,)
admin.site.register(Publisher)
admin.site.register(Author,AuthorAdmin)
admin.site.register(Book,BookAdmin)

还有一种过滤日期的方式,用date_hierarchy选项,在页面列表顶有一个逐层深入的导航条。

[email protected]:~/mysite/books$ cat admin.pyfrom django.contrib import adminfrom books.models import Publisher, Author, Bookclass AuthorAdmin(admin.ModelAdmin):  list_display = (‘first_name‘, ‘last_name‘, ‘email‘)  search_fields=(‘first_name‘,‘last_name‘)class BookAdmin(admin.ModelAdmin):  list_display = (‘title‘, ‘publisher‘, ‘publication_date‘)  list_filter = (‘publication_date‘,)  date_hierarchy=‘publication_date‘admin.site.register(Publisher)
admin.site.register(Author,AuthorAdmin)
admin.site.register(Book,BookAdmin)

4、修改默认排序顺序

之前在models.py中添加过

class Meta:
        ordering=[‘-publication_date‘]

来控制排序。在admin.py的BookAdmin中加入ordering=(‘-publication_date‘)能达到同样的效果。

[email protected]:~/mysite/books$ vi admin.pyfrom django.contrib import admin																				   
from books.models import Publisher, Author, Bookclass AuthorAdmin(admin.ModelAdmin):  list_display = (‘first_name‘, ‘last_name‘, ‘email‘)  search_fields=(‘first_name‘,‘last_name‘)class BookAdmin(admin.ModelAdmin):  list_display = (‘title‘, ‘publisher‘, ‘publication_date‘)  list_filter = (‘publication_date‘,)  date_hierarchy=‘publication_date‘  ordering=(‘-publication_date‘,)
admin.site.register(Publisher)
admin.site.register(Author,AuthorAdmin)
admin.site.register(Book,BookAdmin)

5、管理页面编辑菜单自定义字段顺序

字段顺序默认是和模块中定义的一致,比如现在Book的编辑顺序是Title,Publisher,Publication date,Authors,改为Title,Author,Publisher,Publication date。

[email protected]:~/mysite/books$ cat admin.pyfrom django.contrib import adminfrom books.models import Publisher, Author, Bookclass AuthorAdmin(admin.ModelAdmin):  list_display = (‘first_name‘, ‘last_name‘, ‘email‘)  search_fields=(‘first_name‘,‘last_name‘)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‘)
admin.site.register(Publisher)
admin.site.register(Author,AuthorAdmin)
admin.site.register(Book,BookAdmin)

现在刷新就看到作者排在书之后了。

6、管理页面编辑菜单防止重要字段被修改

一个很实用的功能,防止Book的publication_date被修改

超级简单,就是不要在fields中列出它。

[email protected]:~/mysite/books$ cat admin.pyfrom django.contrib import adminfrom books.models import Publisher, Author, Bookclass AuthorAdmin(admin.ModelAdmin):  list_display = (‘first_name‘, ‘last_name‘, ‘email‘)  search_fields=(‘first_name‘,‘last_name‘)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‘,)
admin.site.register(Publisher)
admin.site.register(Author,AuthorAdmin)
admin.site.register(Book,BookAdmin)

现在就看不到Publication date了,可以防止被不信任的人更改。

用该界面添加一本新书时,Djagno会将publication_date设置为Null,确保满足null=True的条件。

我现在插入一条记录《程序员面试宝典》,可以看到它的Publication date在mysql数据库中是Null

在界面显示是None

7、管理页面编辑菜单自定义多对多字段

先看一眼默认的多对多字段,books编辑页面"多对多字段"作者被展现成多选框,当有几百个作者的选项时,会很糟糕。而且,虽然下面有注释,但是选择多个作者很不方便。

现在使用filter_horizontal改进。(注释掉之前加入的fields选项,加上filter_horizontal)

[email protected]:~/mysite/books$ cat admin.pyfrom django.contrib import adminfrom books.models import Publisher, Author, Bookclass AuthorAdmin(admin.ModelAdmin):  list_display = (‘first_name‘, ‘last_name‘, ‘email‘)  search_fields=(‘first_name‘,‘last_name‘)class BookAdmin(admin.ModelAdmin):  list_display = (‘title‘, ‘publisher‘, ‘publication_date‘)  list_filter = (‘publication_date‘,)  date_hierarchy=‘publication_date‘  ordering=(‘-publication_date‘,)  filter_horizontal=(‘authors‘,)
admin.site.register(Publisher)
admin.site.register(Author,AuthorAdmin)
admin.site.register(Book,BookAdmin)

看到一个精巧的JavaScript过滤器,用户体验非常好。

filter_vertical通上,只是控件垂直排列。

8、管理页面编辑菜单自定义外键的修改

filter_horizontal和filter_vertical选项只能用在多对多字段,不能用于外键字段。外键默认用下拉框展示。

当book可选的出版商多达几百时,在页面加载需要很大开销,时间太久,因为需要把每个publisher都装载并显示在"下拉框"中。

解决该问题的办法是使用"raw_id_fields"选项。它是一个包含外键字段名称的元组,它包含的字段将被展示成"文本框",而不再是"下拉框"。

[email protected]:~/mysite/books$ cat admin.pyfrom django.contrib import adminfrom books.models import Publisher, Author, Bookclass AuthorAdmin(admin.ModelAdmin):  list_display = (‘first_name‘, ‘last_name‘, ‘email‘)  search_fields=(‘first_name‘,‘last_name‘)class BookAdmin(admin.ModelAdmin):  list_display = (‘title‘, ‘publisher‘, ‘publication_date‘)  list_filter = (‘publication_date‘,)  date_hierarchy=‘publication_date‘  ordering=(‘-publication_date‘,)  filter_horizontal=(‘authors‘,)  raw_id_fields=(‘publisher‘,)
admin.site.register(Publisher)
admin.site.register(Author,AuthorAdmin)
admin.site.register(Book,BookAdmin)

效果如下:点这个"放大镜"图标就可以打开一个新的页面来显示外键。

在这个框里输入是的外键的ID号,当然我们不可能去记住这玩意的,所以django提供了放大镜让我们选。选名称自动填入ID号。【//lxy:ps:这用户体验我也是醉了!!】

五、用户、用户组 和权限

根据需求指定用户权限,从而用户部分访问系统。

用户对象有标准的用户名、密码、邮箱地址和真实姓名,同时它还有关于使用管理界面的权限定义。

活动标志:控制用户是否已经激活。如果该标记关闭,用户尝试登录即使密码正确也无法登录系统。

成员标志:该标志用来区分公众用户和管理用户。即是否可登录管理界面。

超级用户标志:有这个标志,其他设置权限都被忽略,用户可在管理界面添加、修改和删除任何项目。

管理界面每种对象都有创建许可、编辑许可和删除许可。

Note:权限管理系统也控制编辑用户的权限。给用户编辑用户的权限,他可以编辑自己的权限,赋予一个用户修改用户的权限,本质上说就是把他变成一个超级用户。

资源链接:

http://djangobook.py3k.cn/2.0/chapter06/

时间: 2024-09-30 11:14:17

django中的站点管理的相关文章

Django 中Admin站点的配置

Admin站点是django提供的一个后台管理页面,可以用来对用户与数据库表数据进行管理. Admin站点配置流程 1.在settings.py文件中INSTALL_APPS列表中添加django.contrib.admin,django默认添加. 2 . 创建管理员用户,在terminal窗口创建管理员用户,python manage.py createsuperuser,创建成功后可以用账户访问127.0.0.1:8000/admin管理页. 3.在admin.py文件中注册模型 (1).

Django的Admin站点管理

一.概述 内容发布:负责添加.修改.删除内容 公告访问 二.配置Admin应用 在settings.py文件中的INSTALLED_APPS中添加'django.contrib.admin',默认是添加好的 三.创建管理员用户 在项目的根目录下,执行命令:python manage.py createsuperuser 依次输入用户名.邮箱.密码(密码不能太复杂) 四.汉化 修改setting.py LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shan

django中的事务管理

在讲解之前首先来了解一下数据库中的事务. 什么是数据库中的事务? 热心网友回答: (1):事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性. (2):事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束. COMMIT表示提交,即提交事务的所有操作.具体地说就是将事务中所有对数据库的更新写回

Django学习之启用管理站点详解

本文和大家分享的主要是django中启用管理站点相关内容,一起来看看吧,希望对大家学习django有所帮助. 实验环境: Win10操作系统.python2.7.Django1.10.3.MariaDB Windows数据库驱动: MySQL-python-1.2.3.win32-py2.7.exe 或者 MySQL-python-1.2.3.win-amd64-py2.7.exe 创建项目: 打开命令行,切换到实验目录,创建项目 dj_admin 1.win+R ,  输入cmd, 回车,启动

django站点管理

一.启动django站点管理功能 1.关于django.contrib包   包含了django自带的众多附加组件,主要包括:   1)管理工具: django.contrib.admin   2)用户鉴别系统:django.contrib.auth   3)支持匿名会话:django.contrib.sessions   4)用户评注系统:django.contrib.comments 2.settings.py中启动管理工具所需要的包 INSTALLED_APPS = ( 'django.c

6Python全站之路系列之Django站点管理

Python全栈之路系列之Django站点管理 站点管理也称之为后台,比如说博客的后台你可以发布文章,修改文章,修改频道等信息. Django使用极少的代码为你做了一切,在Django中创建管理界面已经不是问题,它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即工作. django.contrib包 Django自动管理工具是django.contrib的一部分.django.contrib是一套庞大的功能集,它是Django基本代码的组成部分,Django框

Django站点管理——管理站点

参考文献: https://docs.djangoproject.com/zh-hans/2.0/ref/contrib/admin/ Django的admin站点 Django最强大的部分之一是自动管理界面. 它从您的模型中读取元数据,以提供快速,以模型为中心的界面,受信任的用户可以在其中管理您网站上的内容. 管理员的建议用途仅限于组织的内部管理工具. 它不是用于构建整个前端. 管理员有许多用于自定义的钩子,但要注意尝试专门使用这些钩子. 如果您需要提供一个更加以流程为中心的接口来抽象出数据库

Django中如何防范CSRF跨站点请求伪造***

CSRF概念 CSRF跨站点请求伪造(Cross-Site Request Forgery). ***者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了***者所期望的一个操作,比如以你的名义发送邮件.发消息,盗取你的账号,添加系统管理员,甚至于购买商品.虚拟货币转账等. CSRF***原理以及过程 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A: 2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功

django中的静态文件管理

一个站点通常需要保存额外的文件,比如图片   css样式文件   js脚本文件 ,在django中,倾向于将这些文件称为 静态文件.django提供了django.contrib.staticfiles 模块来帮助我们方便的管理静态文件. 配置静态文件的两种方式: 1  配置单独app下的静态文件,比如某个app下的单独的图片. 2  配置整个project下的静态文件,适用于那些和单独app关联不大的文件,比如jquery  bootstrap  等等 配置步骤: 1  首先,我们需要确认在s