Py学习  »  Django

[精华] Django学习笔记(6):Django站点管理

BeginMan • 11 年前 • 11303 次点击  

一、Django 站点管理

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

二、准备工作

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

enter image description here

这里推荐阅读这篇文章:来自:http://www.cnblogs.com/xiami303/archive/2012/05/23/2514368.html

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进行操作:

from django.contrib import admin
 admin.autodiscover()    ##调用admin的autodiscover()方法来初始化

 urlpatterns = patterns('',
     # ...
     (r'^admin/', include(admin.site.urls)),
     # ...
 )

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

from django.contrib import admin    #导入admin包
 from mysite.books.models import Publisher, Author, Book

 admin.site.register(Publisher)#注册Publisher
 admin.site.register(Author)#注册Author
 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如:

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
 );

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

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

日期型、时间型和数字型字段不接受空字符串,如果插入空字符串则会出错,为了避免错误出现,我们可以运行它里面什么都没有,在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类来修改自动后台显示的模块名称。

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

后台显示如下:

3):修改显示

1、排序

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

#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解释如下:

我们新建了一个类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选项:

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

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

效果显示如下:

4、自定义编辑表单

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

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

效果对比如下:

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

5、多对多显示修改

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

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

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字段 我们可以通过添加:

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

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

enter image description here

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/109
 
11303 次点击  
文章 [ 8 ]  |  最新文章 9 年前
cumt_ttr
Reply   •   1 楼
cumt_ttr    9 年前

还是写的很浅啊

降龙_WH
Reply   •   2 楼
降龙_WH    9 年前

写的不错~~支持一下

爱情的枪
Reply   •   3 楼
爱情的枪    9 年前

https://github.com/sehmaschine/django-grappelli/issues/516

爱情的枪
Reply   •   4 楼
爱情的枪    9 年前

最新的grappelli 只能支持 django 1.6.7 以及以上版本

虫小毛Kykuit
Reply   •   5 楼
虫小毛Kykuit    10 年前

问题解决了,原来之前的verbose_name设置的是str,改成unicode就可以了,即在字段前面加个u即可。

虫小毛Kykuit
Reply   •   6 楼
虫小毛Kykuit    10 年前

楼主,想请问你是如何实现filter_horizontal在中文的情况下显示出来的?我在models里面用verbose_name使用了中文,这时,如果我在admin.py中自定义时使用了[filter_horizontal],那么在后台管理界面中不会报错,但是此项显示不出来.如果把verbose_name去掉,或者改在英文.一切都OK.

paomian
Reply   •   7 楼
paomian    11 年前

顶完在看

Py站长
Reply   •   8 楼
Py站长    11 年前

支持支持~~~