- 创建超级用户,(只有超级用户才能进admin管理后台)
python manage.py createsuperuser
-
在app下admin,py中注册
注册models中的每一张表
image.png
from app01 import models
admin.site.register(models.表名)
...
- 在admin中表中的对象显示名称,不是xx_object的设置
在models.py中创建表的类中添加:
def __str__(self):
return self.name
- 指定admin中表中的相关设置
- 展示表的指定字段
class BookConfig(admin.ModelAdmin):
# 展示列表中的字段
list_display = ["title", "price", "publishDate"]
# 让列表中的字段变成可点击的,点击进去进入编辑页面
list_display_links = ["title", "price"]
admin.site.register(models.Book, BookConfig)

image.png
- 添加一个函数到display的list中,如果是个可点击标签,会被转义成下图所示:
(函数加入list中不要加引号)
class BookConfig(admin.ModelAdmin):
def deletes(self):
return "<a href=''>删除</a>"
list_display = ["title", "price", "publishDate", deletes]

image.png
必须加上
from django.utils.safestring import mark_safe
class BookConfig(admin.ModelAdmin):
def deletes(self):
return mark_safe("<a href=''>删除</a>")

image.png
- list_filter
列表中可以放很多字段
list_filter = ["price"]

image.png
- search_fields
模糊搜索指定字段
search_fields = ["title", "price"]

image.png
- 批量操作
def price_init(self, request, queryset):
queryset.update(price=100)
price_init.short_description = "初始化价格"
actions = [price_init, ]

image.png
Admin的实现流程:
- 启动:
import admin
def autodiscover():
autodiscover_modules('admin', register_to=site)
执行每一个app下的admin.py文件
- 注册
- 单例模式
是一种软件设计模式。一个类只有一个实例存在。比如某个服务器的配置信息。
单例对象,所有文件都会公用这一个单例对象!
# admin.sites.py源码中
admin.site=AdminSite()
class AdminSite(object):
def __init__(self, name='admin'):
self._registry = {}
def register(self, model, admin_class=None, **options):
if not admin_class:
admin_class = ModelAdmin
self._registry[model] = admin_class(model, self) # {Book:ModelAdmin(Book)}
# admin.py 中
admin.site.register(Book) # admin.site._registry={Book:ModelAdmin(Book)}
admin.site.register(Publish) # admin.site._registry={Book:ModelAdmin(Book), Publish:ModelAdmin(Publish)}
# 都是共用的一个site对象
# 如果是自定义的一个config,需要继承admin.ModelAdmin
class AuthorConfig(admin.ModelAdmin):
pass
admin.site.register(Author, Authorconfig) # # admin.site._registry={Book:ModelAdmin(Book), Publish:ModelAdmin(Publish), Author:Authorconfig(Author)}
- 设计URL
- 什么是URL?
http://127.0.0.1:800/index/?a=1
协议:http
IP: 127.0.0.1
端口:8000
路径: /index/
参数:?a=1
为每一个APP下得model设计 增删改查4个URL。以Book为例:
# 增删改查url
127.0.0.1:8000/admin/app01/book/
127.0.0.1:8000/admin/app01/book/add
127.0.0.1:8000/admin/app01/book/1/change
127.0.0.1:8000/admin/app01/book/1/delete
- URL分发
# yan/test01/
url(r'^yan/', ([
url(r'^test01/', test01)
], None, None))
- URL注册
获得models中类对象Book的app名称,和对象的名称
Book._meta.model_name
'book'
Book._meta.app_label
''app01
eg:假设models中有Book、Publish、Author、AuthorDetail四个类
def test01(request):
return Httpresponse("test01")
def get_urls():
temp = []
for model, admin_class_obj in admin.site._registry.items():
app_name = model._meta.app_label
model_name = model._meta.model_name
temp.append(url(r'^{0}/{1}/'.format(app_name, model_name), test01),)
return temp
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Xadmin/', (get_urls(), None, None)),
]
# Xadmin/app01/book
# Xadmin/app01/publish
# Xadmin/app01/author
# Xadmin/app01/authordetail 四个都指向test01函数
eg:假设models中有Book、Publish、Author、AuthorDetail四个类,设计一个url分发,得到每个类的增删改查的url
def list_view(request):
return HttpResponse("list_view")
def add_view(request):
return HttpResponse("add_view")
def change_view(request, id):
return HttpResponse("change_view")
def delete_view(request, id):
return HttpResponse("delete_view")
def get_urls_2(request):
temp = []
temp.append(url(r'^$', list_view)) # 查
temp.append(url(r'^add/', add_view)) # 增
temp.append(url(r'^(\d+)/change/', change_view)) # 改
temp.append(url(r'^(\d+)/delete/', delete_view)) # 删
return temp
def get_urls():
temp = []
for model, admin_class_obj in admin.site._registry.items():
app_name = model._meta.app_label
model_name = model._meta.model_name
temp.append(url(r'^{0}/{1}/'.format(app_name, model_name), (get_urls_2(), None, None)),)
return temp
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Xadmin/', (get_urls(), None, None)),
]
# Xadmin/app01/book/(增删改查) # Xadmin/app01/book/ (查)
# Xadmin/app01/publish/(增删改查) # Xadmin/app01/publish/add (增)
# Xadmin/app01/author/(增删改查) # Xadmin/app01/author/1/change/ (改)
# Xadmin/app01/authordetail/(增删改查) # Xadmin/app01/authordetail/1/delete/ (删)
# 给每个类都设计一个增删改查的url
