- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解Django之admin组件的使用和源码剖析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
admin组件使用 。
Django 提供了基于 web 的管理工具.
Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它:
1
2
3
4
5
6
7
8
9
10
11
|
# Application definition
INSTALLED_APPS
=
[
'django.contrib.admin'
,
'django.contrib.auth'
,
'django.contrib.contenttypes'
,
'django.contrib.sessions'
,
'django.contrib.messages'
,
'django.contrib.staticfiles'
,
"app01"
]
|
django.contrib是一套庞大的功能集,它是Django基本代码的组成部分.
激活管理工具 。
通常我们在生成项目时会在 urls.py 中自动设置好, 。
1
2
3
4
5
6
7
|
from
django.conf.urls
import
url
from
django.contrib
import
admin
urlpatterns
=
[
url(r
'^admin/'
, admin.site.urls),
]
|
当这一切都配置好后,Django 管理工具就可以运行了.
使用管理工具 。
启动开发服务器,然后在浏览器中访问 http://127.0.0.1:8000/admin/,得到登陆界面,你可以通过命令 python manage.py createsuperuser 来创建超级用户.
为了让 admin 界面管理某个数据模型,我们需要先注册该数据模型到 admin 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
from
django.db
import
models
class
Author(models.Model):
name
=
models.CharField( max_length
=
32
)
age
=
models.IntegerField()
def
__str__(
self
):
return
self
.name
class
Publish(models.Model):
name
=
models.CharField( max_length
=
32
)
email
=
models.EmailField()
def
__str__(
self
):
return
self
.name
class
Book(models.Model):
title
=
models.CharField( max_length
=
32
)
publishDate
=
models.DateField()
price
=
models.DecimalField(max_digits
=
5
,decimal_places
=
2
)
publisher
=
models.ForeignKey(to
=
"Publish"
)
authors
=
models.ManyToManyField(to
=
'Author'
)
def
__str__(
self
):
return
self
.title
|
admin的定制 。
在admin.py中只需要讲Mode中的某个类注册,即可在Admin中实现增删改查的功能,如:
1
|
admin.site.register(models.UserInfo)
|
但是,这种方式比较简单,如果想要进行更多的定制操作,需要利用ModelAdmin进行操作,如:
方式一:
1
2
3
4
|
class
UserAdmin(admin.ModelAdmin):
list_display
=
(
'user'
,
'pwd'
,)
admin.site.register(models.UserInfo, UserAdmin)
# 第一个参数可以是列表
|
方式二:
1
2
3
|
@admin
.register(models.UserInfo)
# 第一个参数可以是列表
class
UserAdmin(admin.ModelAdmin):
list_display
=
(
'user'
,
'pwd'
,)
|
ModelAdmin中提供了大量的可定制功能,如 。
1. list_display,列表时,定制显示的列.
1
2
3
4
5
6
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
list_display
=
(
'user'
,
'pwd'
,
'xxxxx'
)
def
xxxxx(
self
, obj):
return
"xxxxx"
|
2. list_display_links,列表时,定制列可以点击跳转.
1
2
3
4
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
list_display
=
(
'user'
,
'pwd'
,
'xxxxx'
)
list_display_links
=
(
'pwd'
,)
|
3. list_filter,列表时,定制右侧快速筛选.
4. list_select_related,列表时,连表查询是否自动select_related 。
5. list_editable,列表时,可以编辑的列 。
1
2
3
4
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
list_display
=
(
'user'
,
'pwd'
,
'ug'
,)
list_editable
=
(
'ug'
,)
|
6. search_fields,列表时,模糊搜索的功能 。
1
2
3
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
search_fields
=
(
'user'
,
'pwd'
)
|
7. date_hierarchy,列表时,对Date和DateTime类型进行搜索 。
1
2
3
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
date_hierarchy
=
'ctime'
|
8 inlines,详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除 。
1
2
3
4
5
6
7
|
class
UserInfoInline(admin.StackedInline):
# TabularInline
extra
=
0
model
=
models.UserInfo
class
GroupAdminMode(admin.ModelAdmin):
list_display
=
(
'id'
,
'title'
,)
inlines
=
[UserInfoInline, ]
|
9 action,列表时,定制action中的操作 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
# 定制Action行为具体方法
def
func(
self
, request, queryset):
print
(
self
, request, queryset)
print
(request.POST.getlist(
'_selected_action'
))
func.short_description
=
"中文显示自定义Actions"
actions
=
[func, ]
# Action选项都是在页面上方显示
actions_on_top
=
True
# Action选项都是在页面下方显示
actions_on_bottom
=
False
# 是否显示选择个数
actions_selection_counter
=
True
|
10 定制HTML模板 。
1
2
3
4
5
6
|
add_form_template
=
None
change_form_template
=
None
change_list_template
=
None
delete_confirmation_template
=
None
delete_selected_confirmation_template
=
None
object_history_template
=
None
|
11 raw_id_fields,详细页面,针对FK和M2M字段变成以Input框形式 。
1
2
3
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
raw_id_fields
=
(
'FK字段'
,
'M2M字段'
,)
|
12 fields,详细页面时,显示字段的字段 。
1
2
3
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
fields
=
(
'user'
,)
|
13 exclude,详细页面时,排除的字段 。
1
2
3
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
exclude
=
(
'user'
,)
|
14 readonly_fields,详细页面时,只读字段 。
1
2
3
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
readonly_fields
=
(
'user'
,)
|
15 fieldsets,详细页面时,使用fieldsets标签对数据进行分割显示 。
1
2
3
4
5
6
7
8
9
10
11
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
fieldsets
=
(
(
'基本数据'
, {
'fields'
: (
'user'
,
'pwd'
,
'ctime'
,)
}),
(
'其他'
, {
'classes'
: (
'collapse'
,
'wide'
,
'extrapretty'
),
# 'collapse','wide', 'extrapretty'
'fields'
: (
'user'
,
'pwd'
),
}),
)
|
16 详细页面时,M2M显示时,数据移动选择(方向:上下和左右) 。
1
2
3
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
filter_vertical
=
(
"m2m字段"
,)
# 或filter_horizontal = ("m2m字段",)
|
17 ordering,列表时,数据排序规则 。
1
2
3
4
5
6
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
ordering
=
(
'-id'
,)
或
def
get_ordering(
self
, request):
return
[
'-id'
, ]
|
18. radio_fields,详细页面时,使用radio显示选项(FK默认使用select) 。
1
|
radio_fields
=
{
"ug"
: admin.VERTICAL}
# 或admin.HORIZONTAL
|
19 form = ModelForm,用于定制用户请求时候表单验证 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
from
app01
import
models
from
django.forms
import
ModelForm
from
django.forms
import
fields
class
MyForm(ModelForm):
others
=
fields.CharField()
class
Meta:
model
=
models
=
models.UserInfo
fields
=
"__all__"
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
form
=
MyForm
|
20 empty_value_display = "列数据为空时,显示默认值" 。
1
2
3
4
5
6
7
8
9
|
@admin
.register(models.UserInfo)
class
UserAdmin(admin.ModelAdmin):
empty_value_display
=
"列数据为空时,默认显示"
list_display
=
(
'user'
,
'pwd'
,
'up'
)
def
up(
self
,obj):
return
obj.user
up.empty_value_display
=
"指定列数据为空时,默认显示"
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
from
django.contrib
import
admin
# Register your models here.
from
.models
import
*
class
BookInline(admin.StackedInline):
# TabularInline
extra
=
0
model
=
Book
class
BookAdmin(admin.ModelAdmin):
list_display
=
(
"title"
,
'publishDate'
,
'price'
,
"foo"
,
"publisher"
)
list_display_links
=
(
'publishDate'
,
"price"
)
list_filter
=
(
'price'
,)
list_editable
=
(
"title"
,
"publisher"
)
search_fields
=
(
'title'
,)
date_hierarchy
=
'publishDate'
preserve_filters
=
False
def
foo(
self
,obj):
return
obj.title
+
str
(obj.price)
# 定制Action行为具体方法
def
func(
self
, request, queryset):
print
(
self
, request, queryset)
print
(request.POST.getlist(
'_selected_action'
))
func.short_description
=
"中文显示自定义Actions"
actions
=
[func, ]
# Action选项都是在页面上方显示
actions_on_top
=
True
# Action选项都是在页面下方显示
actions_on_bottom
=
False
# 是否显示选择个数
actions_selection_counter
=
True
change_list_template
=
"my_change_list_template.html"
class
PublishAdmin(admin.ModelAdmin):
list_display
=
(
'name'
,
'email'
,)
inlines
=
[BookInline, ]
admin.site.register(Book, BookAdmin)
# 第一个参数可以是列表
admin.site.register(Publish,PublishAdmin)
admin.site.register(Author)
|
admin源码解析 。
单例模式 。
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保 某一个类只有一个实例存在 。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场.
比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象.
在 Python 中,我们可以用多种方法来实现单例模式:
(1)使用 __new__ 。
为了使类只能出现一个实例,我们可以使用 __new__ 来控制实例的创建过程,代码如下:
1
2
3
4
5
6
7
8
9
|
class
Singleton(
object
):
_instance
=
None
def
__new__(
cls
,
*
args,
*
*
kw):
if
not
cls
._instance:
cls
._instance
=
super
(Singleton,
cls
).__new__(
cls
,
*
args,
*
*
kw)
return
cls
._instance
class
MyClass(Singleton):
a
=
1
|
在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance .
执行情况如下:
>>> one = MyClass() >>> two = MyClass() >>> one == two True >>> one is two True >>> id(one), id(two) (4303862608, 4303862608) 。
(2)使用模块 。
其实, Python 的模块就是天然的单例模式 ,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:
1
2
3
4
5
6
|
# mysingleton.py
class
My_Singleton(
object
):
def
foo(
self
):
pass
my_singleton
=
My_Singleton()
|
将上面的代码保存在文件 mysingleton.py 中,然后这样使用:
1
2
|
from
mysingleton
import
my_singleton
my_singleton.foo()
|
admin执行流程 。
<1> 循环加载执行所有已经注册的app中的admin.py文件 。
1
2
|
def
autodiscover():
autodiscover_modules(
'admin'
, register_to
=
site)
|
<2> 执行代码 。
1
2
3
4
5
6
|
#admin.py
class
BookAdmin(admin.ModelAdmin):
list_display
=
(
"title"
,
'publishDate'
,
'price'
)
admin.site.register(Book, BookAdmin)
admin.site.register(Publish)
|
<3> admin.site 。
这里应用的是一个单例模式,对于AdminSite类的一个单例模式,执行的每一个app中的每一个admin.site都是一个对象 。
<4> 执行register方法 。
1
2
|
admin.site.register(Book, BookAdmin)
admin.site.register(Publish)
|
1
2
3
4
5
6
|
class
ModelAdmin(BaseModelAdmin):
pass
def
register(
self
, model_or_iterable, admin_class
=
None
,
*
*
options):
if
not
admin_class:
admin_class
=
ModelAdmin
# Instantiate the admin class to save in the registry
self
._registry[model]
=
admin_class(model,
self
)
|
到这里,注册结束! 。
<5> admin的URL配置 。
1
2
3
|
urlpatterns
=
[
url(r
'^admin/'
, admin.site.urls),
]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class
AdminSite(
object
):
def
get_urls(
self
):
from
django.conf.urls
import
url, include
urlpatterns
=
[]
# Add in each model's views, and create a list of valid URLS for the
# app_index
valid_app_labels
=
[]
for
model, model_admin
in
self
._registry.items():
urlpatterns
+
=
[
url(r
'^%s/%s/'
%
(model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
]
if
model._meta.app_label
not
in
valid_app_labels:
valid_app_labels.append(model._meta.app_label)
return
urlpatterns
@property
def
urls(
self
):
return
self
.get_urls(),
'admin'
,
self
.name
|
<6> url()方法的扩展应用 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from
django.shortcuts
import
HttpResponse
def
test01(request):
return
HttpResponse(
"test01"
)
def
test02(request):
return
HttpResponse(
"test02"
)
urlpatterns
=
[
url(r
'^admin/'
, admin.site.urls),
url(r
'^yuan/'
, ([
url(r
'^test01/'
, test01),
url(r
'^test02/'
, test02),
],
None
,
None
)),
]
|
扩展优化 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
from
django.conf.urls
import
url,include
from
django.contrib
import
admin
from
django.shortcuts
import
HttpResponse
def
change_list_view(request):
return
HttpResponse(
"change_list_view"
)
def
add_view(request):
return
HttpResponse(
"add_view"
)
def
delete_view(request):
return
HttpResponse(
"delete_view"
)
def
change_view(request):
return
HttpResponse(
"change_view"
)
def
get_urls():
temp
=
[
url(r
"^$"
.
format
(app_name,model_name),change_list_view),
url(r
"^add/$"
.
format
(app_name,model_name),add_view),
url(r
"^\d+/del/$"
.
format
(app_name,model_name),delete_view),
url(r
"^\d+/change/$"
.
format
(app_name,model_name),change_view),
]
return
temp
url_list
=
[]
for
model_class,obj
in
admin.site._registry.items():
model_name
=
model_class._meta.model_name
app_name
=
model_class._meta.app_label
# temp=url(r"{0}/{1}/".format(app_name,model_name),(get_urls(),None,None))
temp
=
url(r
"{0}/{1}/"
.
format
(app_name,model_name),include(get_urls()))
url_list.append(temp)
urlpatterns
=
[
url(r
'^admin/'
, admin.site.urls),
url(r
'^yuan/'
, (url_list,
None
,
None
)),
]
|
仿admin的url路径分发 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#############models.py###########
from
django.db
import
models
class
Book(models.Model):
title
=
models.CharField(max_length
=
32
)
author
=
models.ForeignKey(to
=
'Author'
)
class
Author(models.Model):
name
=
models.CharField(max_length
=
32
)
#################admin.py###########
from
app01.models
import
*
admin.site.register(Book)
admin.site.register(Author)
##############views.py################
from
django.shortcuts
import
HttpResponse
def
add(request):
return
HttpResponse(
'add'
)
def
change(request,
id
):
return
HttpResponse(
'change'
)
def
delete(request,
id
):
return
HttpResponse(
'delete'
)
def
show(request):
return
HttpResponse(
'show'
)
################url.py##############
def
get_urls2():
tmp
=
[]
tmp.append(url(r
'^add/'
,add))
tmp.append(url(r
'^(\d+)/change/'
,change))
tmp.append(url(r
'^(\d+)/delete/'
,delete))
tmp.append(url(r
'^'
,show))
return
tmp
def
get_urls():
temp
=
[]
for
model, admin_class_obj
in
admin.site._registry.items():
model_name
=
model._meta.model_name
app_label
=
model._meta.app_label
temp.append(url(r
'^{}/{}/'
.
format
(app_label,model_name),(get_urls2(),
None
,
None
)))
#[url(r'^app01/book/',),]
return
temp
urlpatterns
=
[
url(r
'^admin/'
, (get_urls(),
None
,
None
)),
url(r
'^admin/'
, admin.site.urls),
]
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.cnblogs.com/fu-yong/p/8987101.html 。
最后此篇关于详解Django之admin组件的使用和源码剖析的文章就讲到这里了,如果你想了解更多关于详解Django之admin组件的使用和源码剖析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我错过了什么,我已完成 的安装指南中要求的所有步骤 native 脚本 运行 tns doctor 给我以下输出... C:\abc\xyz>tns doctor √ Getting environm
尝试从 {addToCart(book)}}/>}> 传递数据至}> 问题: 购物车 ( render={()=> ) 收到 null,但没有收到我尝试发送的对象 已放置“console.log...
这是 _app.tsx 的外观: function MyApp({ Component, pageProps }: AppProps) { return } 我在构建项目时遇到了这个错误: Ty
我的 Laravel Vue 组件收到以下警告: [Vue warn]: Avoid mutating a prop directly since the value will be overwrit
根据这个example更详细this one我刚刚遇到了一件奇怪的事情...... 如果我使用方法作为 addTab(title,icon,component) 并且下一步想使用 setTabComp
目前我有一个捕获登录数据的表单,一个带有 TIWDBGrid 的表单,它应该返回与我从我的 mysql 数据库登录时创建的 user_id 关联的任何主机,以及一个共享数据模块。 下面是我的登录页面代
在我的react-native应用程序中,我目前有一个本地Android View (用java编写)正确渲染。当我尝试将我的react-native javascript 组件之一放入其中时,出现以
我为作业编写了简单的代码。我引用了文档和几个 youtube 视频教程系列。我的 react 代码是正确的我在运行代码时没有收到任何错误。但是这些 react-boostrap 元素没有渲染。此代码仅
几周前我刚刚开始使用 Flow,从一周前开始我就遇到了 Flow 错误,我不知道如何修复。 代码如下: // @flow import React, { Component } from "react
我想在同一个 View 中加载不同的 web2py 组件,但不是同时加载。我有 5 个 .load 文件,它们具有用于不同场景的表单字段,这些文件由 onchange 选择脚本动态调用。 web2py
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
Blazor 有 InputNumber将输入限制为数字的组件。然而,这呈现了一个 firefox 不尊重(它允许任何文本)。 所以我尝试创建一个过滤输入的自定义组件: @inherits Inpu
我在学习 AngularDART 组件时编写了以下简单代码,但没有显示任何内容,任何人都可以帮助我知道我犯了什么错误: 我的 html 主文件:
我想在初始安装组件时或之后为 div 设置动画(淡入)。动画完成后,div 不应消失。我正在尝试使用 CSSTransition 组件并查看 reactcommunity.org 上的示例,但我根本无
我需要一个 JSF 组件来表示甘特图。是否有任何组件库(如 RichFaces)包含这样的组件? 最佳答案 JFreeChart有甘特图和PrimeFaces有一个图像组件,允许您动态地流式传输内容。
从软件工程的角度来看,组件、模块和子系统之间有什么区别? 提前致谢! 最佳答案 以下是 UML 2.5 的一些发现: 组件:该子句指定一组结构,可用于定义任意大小和复杂性的软件系统。特别是,它将组件指
我有使用非托管程序集(名为 unmanaged.dll)的托管应用程序(名为 managed.exe)。到目前为止,我们已经创建了 Interop.unmanaged.dll,managed.exe
我有一个跨多个应用程序复制的 DAL(我知道它的设计很糟糕,但现在忽略它),我想做的是这个...... 创建一个将通过所有桌面应用程序访问的 WCF DAL 组件。任何人都可以分享他们对关注的想法吗?
我有一个 ComboBox 的集合声明如下。 val cmbAll = for (i /** action here **/ } 所有这些都放在一个 TabbedPane 中。我想这不是问题。那么我
使用 VB6 创建一个 VB 应用程序。应用程序的一部分显示内部的闪存。 当我使用 printform它只是打印整个应用程序。我不知道如何单独打印闪光部分。任何帮助,将不胜感激!.. 谢谢。 最佳答案
我是一名优秀的程序员,十分优秀!