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

时间:2021-09-22 20:24:51

一、Django 站点管理

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

可以尝试处理一下。

二、准备工作

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

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


学习资源: Django Book

Django标准库:

Django站点管理标准库,用grappelli美化Django Admin后台管理界面
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 开发包内容。
Django站点管理标准库,用grappelli美化Django Admin后台管理界面

 三、步骤

1、settings文件操作:

(1)、INSTALLED_APPS 中要添加:django.contrib.admindjango.contrib.auth、django.contrib.contenttypes、django.contrib.sessionsDjango站点管理标准库,用grappelli美化Django Admin后台管理界面

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

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

2、运行 python manage.py syncdb 

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

3、urls进行操作:

Django站点管理标准库,用grappelli美化Django Admin后台管理界面
1 from django.contrib import admin2 admin.autodiscover()    ##调用admin的autodiscover()方法来初始化3 4 urlpatterns = patterns('',5     # ...6     (r'^admin/', include(admin.site.urls)),7     # ...8 )
Django站点管理标准库,用grappelli美化Django Admin后台管理界面

配置好之后,就看运行了。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文件:

Django站点管理标准库,用grappelli美化Django Admin后台管理界面
1 from django.contrib import admin    #导入admin包2 from mysite.books.models import Publisher, Author, Book3 4 admin.site.register(Publisher)#注册Publisher5 admin.site.register(Author)#注册Author6 admin.site.register(Book) #注册Book
Django站点管理标准库,用grappelli美化Django Admin后台管理界面

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

 五、Admin工作原理

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

Django站点管理标准库,用grappelli美化Django 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站点管理标准库,用grappelli美化Django Admin后台管理界面
每一个数据模型都是django.db.models.Model的子类。它的父类包含了所有和数据库打交道的方法,并且提供了优美的定义语法。每一个数据模型相当于当个数据库表,每一个属性是这个表的一个字段,它的类型,如CharField就相当于数据库表的字段类型(如Varchar)所以在这里blank=True就想到与处理SQL的NUll
Django站点管理标准库,用grappelli美化Django Admin后台管理界面

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

Django站点管理标准库,用grappelli美化Django Admin后台管理界面
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 NULL6 );
Django站点管理标准库,用grappelli美化Django Admin后台管理界面

留空一个字符型字段,它会为此插入一个空字符串(而不是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删除了。 要完成这些改动,我们还需要更新数据库。(可不是只重启服务器了)

 

如果不更新则出错如下:Django站点管理标准库,用grappelli美化Django Admin后台管理界面

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站点管理标准库,用grappelli美化Django Admin后台管理界面

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

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

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

Django站点管理标准库,用grappelli美化Django Admin后台管理界面
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='产品中心'#修改管理级页面显示
Django站点管理标准库,用grappelli美化Django Admin后台管理界面

后台显示如下:

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

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

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)
 
<span style = "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的注册就属于这种情况。

 效果如下:

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

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

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

 显示效果如下;

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

[3]、添加过滤器

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

 显示效果:

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

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

Django站点管理标准库,用grappelli美化Django Admin后台管理界面
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)
Django站点管理标准库,用grappelli美化Django Admin后台管理界面

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

效果显示如下:

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

[4]、自定义编辑表单

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

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

效果对比如下:

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

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

[5]、多对多显示修改

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

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

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

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

 通过filter_horizontal,只需在这个元组中指定每个字段的名字就可以了,显示效果如下:

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

ModelAdmin类还支持filter_vertical选项。 它像filter_horizontal那样工作,除了控件都是垂直排列,而不是水平排列的。

注意:filter_horizontalfilter_vertical选项只能用在多对多字段 上, 而不能用于 ForeignKey字段

[6]、改变下拉框

ForeignKey字段。 默认地,管理工具使用`` 下拉框`` 来展现`` 外键`` 字段。

我们可以通过添加:

1 class BookAdmin(admin.ModelAdmin):2     raw_id_fields = ('publisher',)

它包含的字段将被展现成`` 文本框`` ,而不再是`` 下拉框``提供了一个放大镜图标方便你输入,效果如下:

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

 

这几天在网上发现一个django app:grappelli,该app可以用来美化Django Admin后台管理界面, 把一向丑陋的Django Admin后台界面弄得很酷很好看.

以下有一篇别人写好的文章,先供大家参考: 

参考资料:

使用django-grappelli改善默认的django-admin后台 http://blog.sina.com.cn/s/blog_634bc2230100obx5.html

不过,上面的这篇文章还是有不足的地方, 仅仅是因为没有跟上最新的django1.3的步伐了.其中说到的5.2 配置启动参数,指定的adminmedia到grapelli静态文件目录,这句话我在django1.3基础上怎么也实现不了.所以还是自己到网上找资料才解决,以下是我的记录:


1.下载grappelli

地址:https://github.com/sehmaschine/django-grappelli 点download,windows下zip格式,linux下tar.gz格式.


2.安装grappelli和配置

1),设置settings.py中的INSTALLED_APPS:

[python]  view plain copy
  1. INSTALLED_APPS = (  
  2.     'django.contrib.auth',  
  3.     'django.contrib.contenttypes',  
  4.     'django.contrib.sessions',  
  5.     'django.contrib.sites',  
  6.     'django.contrib.messages',  
  7.     'django.contrib.staticfiles',  
  8.     'grappelli',#这里grapplli 必须位于django.contrib.admin之前  
  9.     'django.contrib.admin',  
  10.     'django.contrib.admindocs',  
  11. )  


2)设置ADMIN_MEDIA_PREFIX,而不是采用上面的参考资料中的设置adminmedia到grapplli什么的.


[python]  view plain copy
  1. #ADMIN_MEDIA_PREFIX = '/static/admin/'  
  2.   
  3.   
  4. ADMIN_MEDIA_PREFIX = STATIC_URL + "grappelli/"  
这个的作用就是把admin的静态文件,由原来的admin目录,改为映射到static目录下的grapplli.

3)设置Url

[python]  view plain copy
  1. (r'^admin/doc/', include('django.contrib.admindocs.urls')),  
  2.   
  3. (r'^grappelli/',include('grappelli.urls')),   
  4.   
  5. # Uncomment the next line to enable the admin:  
  6. (r'^admin/', include(admin.site.urls)),  

同settings中配置的一样,grapplli的url映射,必须在admin之前.

4)收集静态资源

通过运行命令:

[python]  view plain copy
  1. manage.py collectstatic   

此命令,收集grapplli app目录下的static目录中的所有静态资源(CSS,js,images)到你配置的STATIC目录
下的grapplli目录下去.


3.测试grapplli应用

manage.py runserver

然后打开 http://localhost:8000/admin/ ,可以看到登录界面了.是不是很酷呢?

看看效果图:

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