一、Django 站点管理
确实方便,不用自己再开发,但是往往企业级的后台还是自己开发。感觉Django站点后台功能性和美化并不多好。这里有一篇文章【用grappelli美化Django Admin后台管理界面】
可以尝试处理一下。
二、准备工作
因为我们要使用自动化的站点管理工具(django.contrib.admin),所以最好对Django.contrib进行了解,它是啥?它是一个强大的功能包,是Django的标准库。它由以下组成:
学习资源: 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.admin、django.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 admin2 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, Book3 4 admin.site.register(Publisher)#注册Publisher5 admin.site.register(Author)#注册Author6 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 NULL6 );
留空一个字符型字段,它会为此插入一个空字符串(而不是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。日期型(DateField、TimeField、DateTimeField)或数字型(IntegerField、DecimalField、FloatField)字段为空,你需要使用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)
<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的注册就属于这种情况。
|
效果如下:
[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)
|
显示效果如下;
[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)
|
显示效果:
另外一种过滤日期的方式是使用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):
<span style
=
"color: #ff6600;"
>filter_horizontal
=
(
'authors'
,)<
/
span>
admin.site.register(Book,BookAdmin)
|
通过filter_horizontal,只需在这个元组中指定每个字段的名字就可以了,显示效果如下:
ModelAdmin类还支持filter_vertical选项。 它像filter_horizontal那样工作,除了控件都是垂直排列,而不是水平排列的。
注意:filter_horizontal和filter_vertical选项只能用在多对多字段 上, 而不能用于 ForeignKey字段
[6]、改变下拉框
ForeignKey字段。 默认地,管理工具使用`` 下拉框`` 来展现`` 外键`` 字段。
我们可以通过添加:
1 class BookAdmin(admin.ModelAdmin):2 raw_id_fields = ('publisher',)
它包含的字段将被展现成`` 文本框`` ,而不再是`` 下拉框``提供了一个放大镜图标方便你输入,效果如下:
这几天在网上发现一个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:
- INSTALLED_APPS = (
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.sites',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'grappelli',#这里grapplli 必须位于django.contrib.admin之前
- 'django.contrib.admin',
- 'django.contrib.admindocs',
- )
2)设置ADMIN_MEDIA_PREFIX,而不是采用上面的参考资料中的设置adminmedia到grapplli什么的.
- #ADMIN_MEDIA_PREFIX = '/static/admin/'
- ADMIN_MEDIA_PREFIX = STATIC_URL + "grappelli/"
3)设置Url
- (r'^admin/doc/', include('django.contrib.admindocs.urls')),
- (r'^grappelli/',include('grappelli.urls')),
- # Uncomment the next line to enable the admin:
- (r'^admin/', include(admin.site.urls)),
同settings中配置的一样,grapplli的url映射,必须在admin之前.
4)收集静态资源
通过运行命令:
- manage.py collectstatic
此命令,收集grapplli app目录下的static目录中的所有静态资源(CSS,js,images)到你配置的STATIC目录
下的grapplli目录下去.
3.测试grapplli应用
manage.py runserver
然后打开 http://localhost:8000/admin/ ,可以看到登录界面了.是不是很酷呢?
看看效果图: