Python 快速教程(Django05):黑面管家

Django提供一个管理数据库的app,即django.contrib.admin。这是Django最方便的功能之一。通过该app,我们可以直接经由web页面,来管理我们的数据库。这一工具,主要是为网站管理人员使用。

这个app通常已经预装好,你可以在mysite/settings.py中的INSTALLED_APPS看到它。

“这庄园里的事情,都逃不过我的眼睛”,管家放下账本,洋洋得意。

默认界面

admin界面位于[site]/admin这个URL。这通常在mysite/urls.py中已经设置好。比如,下面是我的urls.py:

1

2

3

4

5

6

7

8

9

10

from django.conf.urls import patterns, include, url

from django.contrib import admin

admin.autodiscover()                            # admin

urlpatterns = patterns(‘‘,

url(r‘^admin/‘, include(admin.site.urls)),  # admin

url(r‘^west/‘, include(‘west.urls‘)),

)

为了让admin界面管理某个数据模型,我们需要先注册该数据模型到admin。比如,我们之前在west中创建的模型Character。修改west/admin.py:

1

2

3

4

5

from django.contrib import admin

from west.models import Character

# Register your models here.

admin.site.register(Character)

访问http://127.0.0.1:8000/admin,登录后,可以看到管理界面:

这个页面除了west.characters外,还有用户和组信息。它们来自Django预装的Auth模块。我们将在以后处理用户管理的问题。

“我已经管理这个庄园几十年了。”

复杂模型

管理页面的功能强大,完全有能力处理更加复杂的数据模型。

先在west/models.py中增加一个更复杂的数据模型:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

from django.db import models

# Create your models here.

class Contact(models.Model):

name   = models.CharField(max_length=200)

age    = models.IntegerField(default=0)

email  = models.EmailField()

def __unicode__(self):

return self.name

class Tag(models.Model):

contact = models.ForeignKey(Contact)

name    = models.CharField(max_length=50)

def __unicode__(self):

return self.name

这里有两个表。Tag以Contact为外部键。一个Contact可以对应多个Tag。

我们还可以看到许多在之前没有见过的属性类型,比如IntegerField用于存储整数。

同步数据库:

1

$python manage.py syncdb

在west/admin.py注册多个模型并显示:

1

2

3

4

5

from django.contrib import admin

from west.models import Character,Contact,Tag

# Register your models here.

admin.site.register([Character, Contact, Tag])

模型将在管理页面显示。比如Contact的添加条目的页面如下:

“这些黑鬼在想什么,我一清二楚。”

自定义页面

我们可以自定义管理页面,来取代默认的页面。比如上面的”add”页面。我们想只显示name和email部分。修改west/admin.py:

1

2

3

4

5

6

7

8

9

from django.contrib import admin

from west.models import Character,Contact,Tag

# Register your models here.

class ContactAdmin(admin.ModelAdmin):

fields = (‘name‘, ‘email‘)

admin.site.register(Contact, ContactAdmin)

admin.site.register([Character, Tag])

上面定义了一个ContactAdmin类,用以说明管理页面的显示格式。里面的fields属性,用以说明要显示的输入栏。我们没有让”age”显示。由于该类对应的是Contact数据模型,我们在注册的时候,需要将它们一起注册。显示效果如下:

我们还可以将输入栏分块,给每一块输入栏以自己的显示格式。修改west/admin.py为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

from django.contrib import admin

from west.models import Character,Contact,Tag

# Register your models here.

class ContactAdmin(admin.ModelAdmin):

fieldsets = (

[‘Main‘,{

‘fields‘:(‘name‘,‘email‘),

}],

[‘Advance‘,{

‘classes‘: (‘collapse‘,), # CSS

‘fields‘: (‘age‘,),

}]

)

admin.site.register(Contact, ContactAdmin)

admin.site.register([Character, Tag])

上面的栏目分为了Main和Advance两部分。classes说明它所在的部分的CSS格式。这里让Advance部分收敛起来:

Advance部分旁边有一个Show按钮,用于展开。

“这两个客人,似乎没有那么简单。”

Inline显示

上面的Contact是Tag的外部键,所以有外部参考的关系。而在默认的页面显示中,将两者分离开来,无法体现出两者的从属关系。我们可以使用Inline显示,让Tag附加在Contact的编辑页面上显示。

修改west/admin.py:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

from django.contrib import admin

from west.models import Character,Contact,Tag

# Register your models here.

class TagInline(admin.TabularInline):

model = Tag

class ContactAdmin(admin.ModelAdmin):

inlines = [TagInline]  # Inline

fieldsets = (

[‘Main‘,{

‘fields‘:(‘name‘,‘email‘),

}],

[‘Advance‘,{

‘classes‘: (‘collapse‘,),

‘fields‘: (‘age‘,),

}]

)

admin.site.register(Contact, ContactAdmin)

admin.site.register([Character])

效果如下:

“但我也不是好惹的。”

列表页的显示

在Contact输入数条记录后,Contact的列表页看起来如下:

我们也可以自定义该页面的显示,比如在列表中显示更多的栏目,只需要在ContactAdmin中增加list_display属性:

1

2

3

4

5

6

7

8

9

from django.contrib import admin

from west.models import Character,Contact,Tag

# Register your models here.

class ContactAdmin(admin.ModelAdmin):

list_display = (‘name‘,‘age‘, ‘email‘) # list

admin.site.register(Contact, ContactAdmin)

admin.site.register([Character, Tag])

列表页新的显示效果如下:

我们还可以为该列表页增加搜索栏。搜索功能在管理大量记录时非常有用。使用search_fields说明要搜索的属性:

1

2

3

4

5

6

7

8

9

10

from django.contrib import admin

from west.models import Character,Contact,Tag

# Register your models here.

class ContactAdmin(admin.ModelAdmin):

list_display = (‘name‘,‘age‘, ‘email‘)

search_fields = (‘name‘,)

admin.site.register(Contact, ContactAdmin)

admin.site.register([Character])

效果如下:

“我要替小主人留心了。”

总结

Django的管理页面有很丰富的数据库管理功能,并可以自定义显示方式,是非常值得使用的工具。

时间: 2024-11-05 16:00:29

Python 快速教程(Django05):黑面管家的相关文章

Python快速教程

Python快速教程 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库,乱花渐欲迷人眼.我一直希望写一个快速的.容易上手的Python教程,而且言语简洁,循序渐进,让没有背景的读者也可以从基础开始学习.我将在每一篇中专注于一个小的概念,希望在闲暇时可以很快读完. 小提醒 教程将专注于Python基础,语法基于Pytho

Python快速教程 尾声(转)

原文地址: http://www.cnblogs.com/vamei/p/3603046.html 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基础.标准库.Django框架.前前后后的文章,包含了Python最重要的组成部分.这一内容的跨度远远超过我的预期,也超过了我看过的任何Python相关书籍.最初动笔的原因,除了要总结,还对很多Pyth

Python 快速教程(补充篇04): Python简史

Python的起源 Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机硕士学位.然而,尽管他算得上是一位数学家,但他更加享受计算机带来的乐趣.用他的话说,尽管拥有数学和计算机双料资质,他总趋向于做计算机相关的工作,并热衷于做任何和编程相关的活儿. Guido von Rossum 在那个时候,他接触并使用过诸如Pascal.C. Fortran等语言.这些语言的基本设计原则

给深度学习入门者的Python快速教程

基础篇 numpy和Matplotlib篇 本篇部分代码的下载地址: https://github.com/frombeijingwithlove/dlcv_for_beginners/tree/master/chap5 5.3 Python的科学计算包 – Numpy numpy(Numerical Python extensions)是一个第三方的Python包,用于科学计算.这个库的前身是1995年就开始开发的一个用于数组运算的库.经过了长时间的发展,基本上成了绝大部分Python科学计算

Python 快速教程(Django06):假作真时

之前了解了: 创建Django项目 数据库 模板 表格提交 admin管理页面 上面的功能模块允许我们做出一个具有互动性的站点,但无法验证用户的身份.我们这次了解用户验证部分.通过用户验证,我们可以根据用户的身份,提供不同的服务. 一个Web应用的用户验证是它的基本组成部分.我们在使用一个应用时,总是从"登录"开始,到"登出"结束.另一方面,用户验证又和网站安全.数据库安全息息相关.HTTP协议是无状态的,但我们可以利用储存在客户端的cookie或者储存在服务器的s

Python 快速教程(补充篇03): Python内置函数清单

Python内置(built-in)函数随着python解释器的运行而创建.在Python的程序中,你可以随时调用这些函数,不需要定义.最常见的内置函数是: print(“Hello World!”) 在Python教程中,我们已经提到下面一些内置函数: 基本数据类型 type() 反过头来看看 dir() help() len() 词典 len() 文本文件的输入输出 open() 循环设计 range() enumerate() zip() 循环对象 iter() 函数对象 map() fi

给深度学习入门者的Python快速教程 - 基础篇

实在搞不定博客园的排版,排版更佳的版本在: https://zhuanlan.zhihu.com/p/24162430 Life is short, you need Python 人生苦短,我用Python -- Bruce Eckel 5.1 Python简介 本章将介绍Python的最基本语法,以及一些和深度学习还有计算机视觉最相关的基本使用. 5.1.1 Python简史 Python是一门解释型的高级编程语言,特点是简单明确.Python作者是荷兰人Guido van Rossum,1

Python 快速教程(Django03): 所谓伊人

在之前的程序中,我们直接生成一个字符串,作为http回复,返回给客户端.这一过程中使用了django.http.HttpResponse(). 在这样的一种回复生成过程中,我们实际上将数据和视图的格式混合了到上面的字符串中.看似方便,却为我们的管理带来困难.想像一个成熟的网站,其显示格式会有许多重复的地方.如果可以把数据和视图格式分离,就可以重复使用同一视图格式了. Django中自带的模板系统,可以将视图格式分离出来,作为模板使用.这样,不但视图可以容易修改,程序也会显得美观大方. "她是我心

Python 快速教程(Django07):马不停蹄

前面的文章研究了Django最主要的几个方面:数据库,模板,动态生成页面等.但都是使用python manage.py runserver来运行服务器.这是一个实验性的web服务器,不适用于正常的站点运行.我们需要一个可以稳定而持续的服务器.这个服务器负责监听http端口,将收到的请求交给Django处理,将Django的回复发还给客户端. 这样的持续性服务器可以有很多选择,比如apache, Nginx, lighttpd等.这里将使用最常见的apache服务器.服务器和Django之间通过P