Django-admin

  1. 创建超级用户,(只有超级用户才能进admin管理后台)
python manage.py createsuperuser
  1. 在app下admin,py中注册
    注册models中的每一张表


    image.png
from app01 import models

admin.site.register(models.表名)
      ...
  1. 在admin中表中的对象显示名称,不是xx_object的设置
    在models.py中创建表的类中添加:
    def __str__(self):
        return self.name
  1. 指定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的实现流程:

  1. 启动:
import admin
def autodiscover():
    autodiscover_modules('admin', register_to=site)
           执行每一个app下的admin.py文件
  1. 注册
  • 单例模式
    是一种软件设计模式。一个类只有一个实例存在。比如某个服务器的配置信息。
    单例对象,所有文件都会公用这一个单例对象!
# 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)}
  1. 设计URL

为每一个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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 脊柱侧屈受限评估 假设左侧屈左边疼痛➡️关节突关节测试(后伸,右回旋,左侧屈如果疼痛持续或者加重怀疑关节突关节可能...
    鼻子短的大象阅读 1,898评论 0 3
  • 今天是周末昨晚和宝贝一起去姥姥家了,昨天去托辅的作业其实是写完了,由于我给她自己布置的作业所以有点多,还差一点没写...
    王艺静妈妈阅读 194评论 1 1
  • IMSDK阅读 93评论 0 0
  • 我行过许多地方的桥 可只有你牵我走过的那座 通往过我的心房 我看过许多地方的云 可只有你说像只小猪的那朵 被我记住...
    隅川阅读 913评论 3 9

友情链接更多精彩内容