社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

BeginMan • 11 年前 • 12060 次点击  

一、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
 
12060 次点击  
文章 [ 8 ]  |  最新文章 10 年前
cumt_ttr
Reply   •   1 楼
cumt_ttr    10 年前

还是写的很浅啊

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

写的不错~~支持一下

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

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

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

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

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

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

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

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

paomian
Reply   •   7 楼
paomian    11 年前

顶完在看

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

支持支持~~~