Django站点管理标准库,用grappelli美化Django Admin后台管理界面

一、Django 站点管理

确实方便,不用自己再开发,但是往往企业级的后台还是自己开发。感觉Django站点后台功能性和美化并不多好。这里有一篇文章【用grappelli美化Django Admin后台管理界面】

可以尝试处理一下。

二、准备工作

因为我们要使用自动化的站点管理工具(django.contrib.admin),所以最好对Django.contrib进行了解,它是啥?它是一个强大的功能包,是Django的标准库。它由以下组成:

Django站点管理标准库,用grappelli美化Django Admin后台管理界面_第1张图片


学习资源: Django Book

Django标准库:

复制代码
Django的标准库存放在 django.contrib 包中。每个子包都是一个独立的附加功能包。 这些子包一般是互相独立的,不过有些django.contrib子包需要依赖其他子包。

在 django.contrib 中对函数的类型并没有强制要求 。其中一些包中带有模型(因此需要你在数据库中安装对应的数据表),但其它一些由独立的中间件及模板标签组成。

django.contrib 开发包共有的特性是: 就算你将整个django.contrib开发包删除,你依然可以使用 Django 的基础功能而不会遇到任何问题。 当 Django 开发者向框架增加新功能的时,他们会严格根据这一原则来决定是否把新功能放入django.contrib中。

django.contrib 由以下开发包组成:

    admin : 自动化的站点管理工具。 请查看第6章。

    admindocs:为Django admin站点提供自动文档。 本书没有介绍这方面的知识;详情请参阅Django官方文档。

    auth : Django的用户验证框架。 参见第十四章。

    comments : 一个评论应用,目前,这个应用正在紧张的开发中,因此在本书出版的时候还不能给出一个完整的说明,关于这个应用的更多信息请参见Django的官方网站. 本书没有介绍这方面的知识;详情请参阅Django官方文档。

    contenttypes : 这是一个用于引入文档类型的框架,每个安装的Django模块作为一种独立的文档类型。 这个框架主要在Django内部被其他应用使用,它主要面向Django的高级开发者。 可以通过阅读源码来了解关于这个框架的更多信息,源码的位置在 django/contrib/contenttypes/。

    csrf : 这个模块用来防御跨站请求伪造(CSRF)。参 见后面标题为”CSRF 防御”的小节。

    databrowse:帮助你浏览数据的Django应用。 本书没有介绍这方面的知识;详情请参阅Django官方文档。

    flatpages : 一个在数据库中管理单一HTML内容的模块。 参见后面标题为“Flatpages”的小节。

    formtools:一些列处理表单通用模式的高级库。 本书没有介绍这方面的知识;详情请参阅Django官方文档。

    gis:为Django提供GIS(Geographic Information Systems)支持的扩展。 举个例子,它允许你的Django模型保存地理学数据并执行地理学查询。 这个库比较复杂,本书不详细介绍。 请参看http://geodjango.org/上的文档。

    humanize : 一系列 Django 模块过滤器,用于增加数据的人性化。参阅稍后的章节《人性化数据》。

    localflavor:针对不同国家和文化的混杂代码段。 例如,它包含了验证美国的邮编 以及爱尔兰的身份证号的方法。

    markup : 一系列的 Django 模板过滤器,用于实现一些常用标记语言。 参阅后续章节《标记过滤器》。

    redirects : 用来管理重定向的框架。 参看后面的“重定向”小节。

    sessions : Django 的会话框架。 参见14章。

    sitemaps : 用来生成网站地图的 XML 文件的框架。 参见13章。

    sites : 一个让你可以在同一个数据库与 Django 安装中管理多个网站的框架。 参见下一节:

    syndication : 一个用 RSS 和 Atom 来生成聚合订阅源的的框架。 参见13章。

    webdesign:对设计者非常有用的Django扩展。 到编写此文时,它只包含一个模板标签{% lorem %}。详情参阅Django文档。

本章接下来将详细描述前面没有介绍过的 django.contrib 开发包内容。
复制代码

 三、步骤

1、settings文件操作:

(1)、INSTALLED_APPS 中要添加:django.contrib.admindjango.contrib.auth、django.contrib.contenttypes、django.contrib.sessions

(2)、MIDDLEWARE_CLASSES 中包含'django.middleware.common.CommonMiddleware' 、'django.contrib.sessions.middleware.SessionMiddleware' 和'django.contrib.auth.middleware.AuthenticationMiddleware' 。

2、运行 python manage.py syncdb 

这一步将生成管理界面使用的额外数据库表,当你把'django.contrib.auth'加进INSTALLED_APPS后,第一次运行syncdb命令时, 系统会请你创建一个超级用户。

3、urls进行操作:

复制代码
1 from django.contrib import admin
2 admin.autodiscover()    ##调用admin的autodiscover()方法来初始化
3 
4 urlpatterns = patterns('',
5     # ...
6     (r'^admin/', include(admin.site.urls)),
7     # ...
8 )
复制代码

配置好之后,就看运行了。http://127.0.0.1:8000/admin/

注意:如果无法登录,运行``manage.py createsuperuser`` ,确保你已经创建了一个超级用户。

四、后台配置

1、语言更改

第一次登录的时候显示的是英文,要改成中文,只需在MIDDLEWARE_CLASSES添加 django.middleware.locale.LocaleMiddleware,并确保它在’django.contrib.sessions.middleware.SessionMiddleware’之后 即可。

2、Models加入到Admin管理中

在管理工具中加入自己的模块,可以在我们的app下创建一个admin.py文件:

复制代码
1 from django.contrib import admin    #导入admin包
2 from mysite.books.models import Publisher, Author, Book
3 
4 admin.site.register(Publisher)#注册Publisher
5 admin.site.register(Author)#注册Author
6 admin.site.register(Book) #注册Book
复制代码

然后重启服务器,打开后台就呈现自己的模块了。

 五、Admin工作原理

其实django.contrib下的各个模块就是一个个Django App,它们有自己的模块、模板、视图、URLPatterns,跟我们创建处理的app一样的操作。既然如此,那么对admin可能就会有点了解了,它的工作流程大致如下:

 六、关于Admin 的拓展

我认为可分以下几点:

1):字段类型操作

默认情况下,所有的字段都默认blank=False,即不允许输入空值。有时候,会要求我们对某个字段进行可选可不选,可以在字段上加上blank=True,允许输入一个空值

1 class Author(models.Model):
2     first_name = models.CharField(max_length=30)
3     last_name = models.CharField(max_length=40,blank=True)
4     email = models.EmailField(blank=True )

很奇怪,SQL下的空值是NULL,表示非法、未知或其他程序指定的含义,但是在DJango中表示的却不一样,这就是上节的知识了:

复制代码
每一个数据模型都是django.db.models.Model的子类。
它的父类包含了所有和数据库打交道的方法,并且提供了优美的定义语法。
每一个数据模型相当于当个数据库表,每一个属性是这个表的一个字段,
它的类型,如CharField就相当于数据库表的字段类型(如Varchar)
所以在这里blank=True就想到与处理SQL的NUll
复制代码

但是在Django 生成Create Table语句时会自动在每个字段后显示加上NOT NULL如:

复制代码
1 CREATE TABLE "books_author" (
2     "id" serial NOT NULL PRIMARY KEY,
3     "first_name" varchar(30) NOT NULL,
4     "last_name" varchar(40) NOT NULL,
5     "email" varchar(75) NOT NULL
6 );
复制代码

留空一个字符型字段,它会为此插入一个空字符串(而不是NULL),因为NULL的值不同于空字符串,就像Python中None不同于空字符串("")一样,如果我们把一个字段留空了,若处理成NULL,表示运行什么都没有了。

 

null与blank的区别
null表示什么都没有,blank表示空白,null=True表示允许什么都没有,blank=True表示允许空白,空白不代表什么都没有,空字符串就是空白的值;
对于数值型,布尔型的字段,null=True,blank=False表示允许什么都没有,但不允许为空字符串。

参考:http://muilpin.blog.163.com/blog/static/1653829362012284321279/

 

日期型、时间型和数字型字段不接受空字符串,如果插入空字符串则会出错,为了避免错误出现,我们可以运行它里面什么都没有,在Django模块中,可以通过添加null=True来指定一个字段允许为NULL。日期型(DateFieldTimeFieldDateTimeField)或数字型(IntegerFieldDecimalFieldFloatField)字段为空,你需要使用null=True  和 blank=True

date = models.DateField(blank=True, null=True )

注意:添加null=True比添加blank=True复杂。因为null=True改变了数据的语义,即改变了CREATE TABLE语句,把publication_date字段上的NOT NULL删除了。 要完成这些改动,我们还需要更新数据库。(可不是只重启服务器了)

 

如果不更新则出错如下:

2):字段标签的操作

默认情况下,在后台显示从模块的字段名称生成的,规则:用空格替换下划线;首字母大写。例如:Book模块中publication_date的标签是Publication date。

自定义一个标签,可以添加verbose_name:(verbose: 冗长的;啰嗦的),可能意思就是设置简单的标签替换 冗长的;啰嗦的标签吧。

email = models.EmailField(blank=True, verbose_name='e-mail' )

为了使语法简洁,你可以把它当作固定位置的参数传递:

 name = models.CharField(u'产品名称',max_length=30)             #产品名称

注意:这不适用于ManyToManyField 和ForeignKey字段,因为它们第一个参数必须是模块类。 那种情形,必须显式使用verbose_name这个参数名称。

修改完成之后的效果:如下

那怎修改管理级别的名称呢,因为我们一打开后台,显示如:

可以通过django的meta类来修改自动后台显示的模块名称。

复制代码
1 class Product(models.Model):
2      name = models.CharField(u'产品名称',max_length=30)                     #产品名称
3      price = models.CharField(u'售价',max_length=30)                        #售价
4      class Meta:
5         db_table = 'Product'#数据库名
6         verbose_name='产品'#修改从管理级'产品中心'进入后的页面显示,显示为'产品'
7         verbose_name_plural='产品中心'#修改管理级页面显示
复制代码

后台显示如下:

3):修改显示

[1]、排序

如上,列表显示很单调,我们想能不能在页面显示如"产品名称"、”售价“、”企业码“等排序信息呢,其实我们可以在admin.py中这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
#coding=utf-8
from  django.contrib import  admin
from  login.models import  New,Msg,Note,Product,resource
from  django.contrib.auth.models import  User
admin.site.register(New)
admin.site.register(Msg)
admin.site.register(Note)
admin.site.register(resource)
 
= "color: #ff0000;" > class  ProAdmin(admin.ModelAdmin):
     list_display = ( 'name' , 'price' , 'ent_id' )
admin.site.register(Product,ProAdmin)
< / span>

 Django Book解释如下:

- - - - - 《Django Book》
我们新建了一个类AuthorAdmin,它是从django.contrib.admin.ModelAdmin派生出来的子类,保存着一个类的自定义配置,以供管理工具使用。 我们只自定义了一项:list_display, 它是一个字段名称的元组,
用于列表显示。 当然,这些字段名称必须是模块中有的。
我们修改了admin.site.register()调用,在Author后面添加了AuthorAdmin。你可以这样理解: 用AuthorAdmin选项注册Author模块。
admin.site.register()函数接受一个ModelAdmin子类作为第二个参数。 如果你忽略第二个参数,Django将使用默认的选项。Publisher和Book的注册就属于这种情况。

 效果如下:

[2]、添加一个快速查询栏

class  ProAdmin(admin.ModelAdmin):
     list_display = ( 'name' , 'price' , 'ent_id' )
     = "color: #ff0000;" >search_fields = ( 'name' , 'pro_address' )< / span>
admin.site.register(Product,ProAdmin)

 显示效果如下;

[3]、添加过滤器

class  ProAdmin(admin.ModelAdmin):
     list_display = ( 'name' , 'price' , 'ent_id' )
     search_fields = ( 'name' , 'pro_address' )
     = "color: #ff0000;" >list_filter = ( 'pro_out' ,)< / span>
admin.site.register(Product,ProAdmin)

 显示效果:

 另外一种过滤日期的方式是使用date_hierarchy选项:

复制代码
1 class ProAdmin(admin.ModelAdmin):
2     list_display=('name','price','ent_id')#排序
3     search_fields=('name','pro_address')#搜索条
4     list_filter=('pro_out',)#过滤器
5     date_hierarchy='pro_write_date'#另外一种过滤日期的方式
6     ording=('-pro_write_date',)#可降序排序
7 admin.site.register(Product,ProAdmin)
复制代码

同时我们也可以进行升序降序

效果显示如下:

[4]、自定义编辑表单

默认地,表单中的字段顺序是与模块中定义是一致的。 我们可以通过使用ModelAdmin子类中的fields选项来改变它:

1 class NoteAdmin(admin.ModelAdmin):
2     fields=('user','content','title')#依据user、content、title排序显示
3 admin.site.register(Note,NoteAdmin)

效果对比如下:

如果不想某个字段被编辑,可以在fields里面不包含该字段。

[5]、多对多显示修改

多对多字段的,在后台显示效果、操作等很不爽,如果你想选择多项,你必须还要按下Ctrl键(苹果机是command键)如下:

我们可以添加以下代码来改变它 :

1
2
3
class  BookAdmin(admin.ModelAdmin):
     = "color: #ff6600;" >filter_horizontal = ( 'authors' ,)< /

你可能感兴趣的:(Python和Django)