bbs-admin
目录
引入单例----单例补充
admin---url/注册的自定义配置
解析admin源码
django-admin注册账号-----创建超级用户
python manage.py createsuperuser
引入单例----单例补充
类知识补充
from django.test import TestCase # Create your tests here. class A(object):
x = 12
def __init__(self):
self.y = 10 class B(A):
x = 20
y = 20 b = B()
print(b.x)
print(b.y) 结果:
20
10
类的取值顺序
先从对象的空间取----》对象所在的类-----》对象所在的类的父类
几种单例模式
1 基于__new__
class A():
def __new__(cls, *args, **kwargs):
_instance = None
if not _instance:
cls._instance = super().__new__(cls,*args,**kwargs)
return cls._instance a = A()
b = A()
c = A()
print(id(a))
print(id(b))
解析:1 在实例化对象过程中先进行__new__方法,然后把结果返回给__init__
2 利用第一次,初始化对象继承父类的__new__方法,生成的对象,返回给__init__,然后下次,直接把第一次生成的对象再返回给__init__,保证始终是第一次生成的对象
2 基于模块(python独有的)
# test_modle模块
class A():
def __init__(self):
self.name = 'alex'
def func(self):
print('呵呵') a = A()
print(id(a)) # test_03
import test_modle
def func():
print(id(test_modle.a)) # 执行代码
import test_modle print(id(test_modle.a)) import test_modle print(id(test_modle.a)) from test_03 import func
func() 结果:
3082181927824
3082181927824
3082181927824
3082181927824
解析:
1 导入模块,会生成一个pyc文件,但只会在第一次生成一个。后面的数据会从pyc文件中获取,与导入多少相同模块无关

2 可以把jiango项目看成一个程序,如果取一个值,如果改值在同一个pyc文件中,无论取值过程中经历多少个模块,都可以看成,直接从相同的pyc文件中取值。
admin---url/注册的自定义配置
url-----对应源码分析url设计
二级路由设置
设计规则:在urls.py文件中的 urlpatterns 中
url(r'路由',[],None,None)
解析:[]中存放下一级路由,即url(r'下一级路由',自定义视图函数名)
第一个None
第二个None
多级路由以此类推
参考示例:
urlpatterns = [
url(r'^admin/', admin.site.urls), url(r'index',([
url(r'^$',index),
url(r'test01',test01),
url(r'test02',test02)
],None,None))
# url(r'index/', get_urls())
]
admin中增删改查对应的url
增 http://127.0.0.1:8000/admin/app01/author/add/ 删url http://127.0.0.1:8000/admin/app01/author/1/delete/ 改url http://127.0.0.1:8000/admin/app01/author/1/change/ 查url http://127.0.0.1:8000/admin/app01/author/
模仿admin简单设计(初级版):
设计前知识补充:
model._meta.app_label:获取类对象所在的app名
model._meta.model_name:获取类对象所在的类名
model:类
config_obj:配置类对象对象
from django.conf.urls import url
from django.contrib import admin
from django.shortcuts import HttpResponse
def test01(request):
return HttpResponse('test01')
def test02(request):
return HttpResponse('test02')
def index(request):
return HttpResponse('index')
def show(request):
return HttpResponse('show')
def add(request):
return HttpResponse('add')
def change(request,id):
return HttpResponse('change')
def delete(request,id):
return HttpResponse('delete')
def get_urls2():
item = [
url(r'^$',show),
url(r'add/', add),
url(r'(\d+)/change',change),
url(r'(\d+)/delete', delete)
]
return item, None, None def get_urls():
item=[url(r'^$',index)]
for model,config in admin.site._registry.items():
# print('----->',model,config)
urls = url(r'{}/{}/'.format(model._meta.app_label,model._meta.model_name),get_urls2())
item.append(urls)
return item, None, None urlpatterns = [
# url(r'^admin/', admin.site.urls),
#
# url(r'index',([
# url(r'^$',index),
# url(r'test01',test01),
# url(r'test02',test02)
# ],None,None))
url(r'index/', get_urls())
]
注册的自定义配置
解析:
1 原来,注册时,我们通常默认继承 ModelAdmin类,然后在前端显示
2 我们通过继承ModelAdmin类,覆盖类中的方法,实现自定义效果
使用方法
class BookConfig(admin.ModelAdmin):
list_display = ['title','price','publish','authors']
admin.site.register(Book,BookConfig)
1 list_display = ['title','price','publish','authors']-----将modles.py中的对应表中的字段,展示在admin查的页面中
效果展示
默认

自定义

坑:
1 list_display 中有多对多/一对多中的多的字段,会报错
ERRORS:
<class 'app01.admin.BookConfig'>: (admin.E109) The value of 'list_display[3]' must not be a ManyToManyField.
2 ‘hehe’ 等一点都不相干的字段,启动项目就报错
ERRORS:
<class 'app01.admin.BookConfig'>:
(admin.E108) The value of 'list_display[3]' refers to 'hehe',
which is not a callable, an attribute of 'BookConfig', or an attribute or method on 'app01.Book'.
class PublishConfig(admin.ModelAdmin):
list_display = ['name','hehe']
admin.site.register(Publish)
admin.site.register(AuthorDetail,PublishConfig)
3 即使两张表中是一对多/多对多/一对一 只要该表中没有这个静态书籍,就不能随便添加,否则,可以正常启动,但跳转到相应的web时会报错
页面
AttributeError at /admin/app01/author/
'Author' object has no attribute 'book' 后台
AttributeError: 'Author' object has no attribute 'book'
2 list_display_links = ['price','title'] ----给对应的字段添加a标签,跳转到修改的url
展示
默认 第一个字段

自定义

3 list_filter = ['title','author','publish']------分类
展示
默认

自定义

4 search_fields = ['title','price']-----查询,支持模糊查询
展示
默认
无
自定义

5 批量操作
1 def patch_init(self,request,queryset):
queryset.update(price=0)
2 patch_init.short_description = "初始化价格"
3 actions = [patch_init]
1 定义函数(操作数据库)
2 定义选项名称
3 添加函数名
展示

解析admin源码
1 启动
从settings.py文件中找到 INSTALLED_APPS 配置文件
又找到admin from django.contrib import admin
在admin中找到 from django.contrib.admin.sites import AdminSite, site
找到setes模块 中的AdminSite, site 初始化对象site
在admin中找到
def autodiscover():
autodiscover_modules('admin', register_to=site)
从模块中扫描带有admin的文件
找到app01下的admin
2 注册
admin.site.register(Author)
class BookConfig(admin.ModelAdmin):
pass
admin.site.register(Book,BookConfig)
源码
源码:
admin.py---sites.py---->
class AdminSite(object): def __init__(self):
self._registry = {} def register(self,model,admin_class=None):
if not admin_class:
admin_class = ModelAdmin
self._registry[model] = admin_class(model, self)
site = AdminSite()
3 urls设计
参考文档:Django-admin 管理工具
bbs-admin的更多相关文章
- 1210 BBS admin后台管理及侧边栏筛选个人站点
目录 昨日内容 django admin后台管理 使用 建表 用户图片的显示 MEDIA用户配置 查找照片 搭建个人站点 防盗链 新建css文件 侧边栏展示标签 定义分类栏与标签栏 定义时间栏 侧边栏 ...
- Thinkphp学习回顾(一)之基本结构目录
TP框架的学习一般都是从了解框架的基本结构开始的,每个文件都有其专属的作用,我的TP框架的回顾也从基本结构开始讲起. 一.ThinkPHP的获取 http://www.thinkphp.cn 这是 ...
- RequestMethod.DELETE相关,如何用jquery实现RequestMethod.DELETE请求
Spring MVC添加支持Http的delete.put请求!(HiddenHttpMethodFilter) Spring3.0之后->Spring MVC过滤器-HiddenHttpMet ...
- linux编译安装LAMP
Linux安装Apache+MySQL+PHP 安装部分依赖 安装apr(可选) # tar -xf apr-1.5.0.tar.bz2 # cd apr-1.5.0 #./configure --p ...
- 重燃你的PHP安全分析之火
关于脚本安全这个话题好像永远没完没了,如果你经常到国外的各种各样的bugtraq上,你会发现有一半以上都和脚本相关,诸如SQL injection,XSS,Path Disclosure,Remote ...
- google 技巧
inurl: 用于搜索网页上包含的URL. 这个语法对寻找网页上的搜索,帮助之类的很有用. intext: 只搜索网页部分中包含的文字(也就是忽略了标题,URL等的文字). site: 可以限制你搜索 ...
- servlet的url-pattern匹配规则
首先需要明确几容易混淆的规则: servlet容器中的匹配规则既不是简单的通配,也不是正则表达式,而是特定的规则.所以不要用通配符或者正则表达式的匹配规则来看待servlet的url-pattern. ...
- web.xml中servlet-mapping的配置
<servlet-mapping>元素在Servlet和URL样式之间定义一个映射.它包含了两个子元素<servlet- name>和<url-pattern>,& ...
- J2ee入门:servlet-mapping的映射配置
<servlet-mapping>元素在Servlet和URL样式之间定义一个映射.它包含了两个子元素<servlet- name>和<url-pattern> & ...
- google 搜索关键字技巧
google 搜索关键字技巧 来源 https://www.cnblogs.com/qiudabai/articles/9143328.html inurl: 用于搜索网页上包含的URL. 这个语法 ...
随机推荐
- 护卫神等IIS设置Thinkphp框架的public目录为根目录的解决办法
最近碰到一个棘手的问题,在使用护卫神或者主机宝等IIS环境配置PHP的时候,不能把public设置为网站根目录(因为Thinkphp的安全要求:要将public设置为对外公开目录),这个问题无法搜索到 ...
- python 自动化测试
安装selenium 安装命令: pip install selenium 测试 打开一款Python编辑器,默认Python自带的IDLE也行.创建 baidu.py文件,输入以下内容: from ...
- php实现只需要一个QQ号就可以获得用户信息
<?php // 通过QQ号即可获取用户信息 // 获取QQ头像接口 // http://q1.qlogo.cn/g?b=qq&nk=QQ号&s=100&t=154790 ...
- Java HttpServletRequest中getAttribute()方法和getParameter()区别
一.ServletRequest接口 HttpServletRequest接口继承了ServletRequest接口,实现类通常代表一个实际的Http Request. Servlet容器负责创建一个 ...
- 【ES6 】ES6 解构赋值--对象解构赋值
对象的解构与数组有一个重要的不同. 数组的元素是按次序排列的,变量的取值由它的位置决定 而对象的属性没有次序,变量必须与属性同名,才能取到正确的值. 基本用法 如果解构失败,变量的值等于undefin ...
- 在Windows中 , 如何用leakdiag “自动”检测内存泄露 (自动记录日志)
一.基本用法 在LeakDiag中选择aaa.exe 然后选择Windows Heap Allocator来跟踪heap的使用,按start开始,等一会按log,然后再stop 会在c:\leakdi ...
- VS Code 运行 JavaScript 文件时出现“node...”乱码或错误
1.错误图片: 2.如果是中文乱码的话,可以到设置里边把「Auto Guess Encoding」这一项勾起来. 3.如果不是这个原因,可能是因为没安装 Node.js 和配置 Node.js 环境, ...
- WinPE基础知识之导出表
// 导出的东西包括函数(变量.类)地址,序号,函数(变量.类)名 typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; // ...
- WinPE基础知识之头部
1.DOS头 // DOS MZ头,大小为64个字节 typedef struct _IMAGE_DOS_HEADER { WORD e_magic; // EXE标志,“MZ”(有用,解析时作为是否 ...
- ASR性能测试方案--详细见云盘
目录: 1. 什么是WER 2. WER计算原理 3. WER测试设计方案 4. 当前业界识别水平 1. 什么是WER 在语音识别(Automatic Speech Recognition, ASR) ...