Django-自定义增删改查组件的一些体会
1.路由系统
namespace,用于区分相同name的url,通过namespace为url添加一个前缀
反向生成URL的时候
reverse('namespace:name')
{% url "namespace:name"%}
@property
def urls(self):
return (self.get_urls(), None, 'stark')
# 总的url
def get_urls(self):
model_class_app = (self.model_class._meta.app_label, self.model_class._meta.model_name)
urlpatterns = [
url(r'^$', self.wrap(self.changlist_view), name='%s_%s_changelist' % model_class_app),
url(r'^add/$', self.wrap(self.add_view), name='%s_%s_add' % model_class_app),
url(r'^(\d+)/change/$', self.wrap(self.chang_view), name='%s_%s_change' % model_class_app),
url(r'^(\d+)/delete/$', self.wrap(self.delete_view), name='%s_%s_delete' % model_class_app)
]
urlpatterns.extend(self.extra_url())
return urlpatterns # 额外的url 在自己的config中定义该函数添加
def extra_url(self):
return [] @property
def urls(self):
return self.get_urls() # 列表页面的url
def get_list_url(self):
name = 'stark:%s_%s_changelist' % (self.model_class._meta.app_label, self.model_class._meta.model_name)
list_url = reverse(name)
return list_url # 添加按钮的url
def get_add_url(self):
name = 'stark:%s_%s_add' % (self.model_class._meta.app_label, self.model_class._meta.model_name)
add_url = reverse(name)
return add_url # 编辑的url
def get_change_url(self, nid):
name = 'stark:%s_%s_change' % (self.model_class._meta.app_label, self.model_class._meta.model_name)
edit_url = reverse(name, args=(nid,))
return edit_url # 删除的url
def get_delete_url(self, nid):
name = 'stark:%s_%s_delete' % (self.model_class._meta.app_label, self.model_class._meta.model_name)
del_url = reverse(name, args=(nid,))
return del_url
2. 制作项目启动时,自动加载文件
在当前app下的apps中写入下面代码即可,并去已注册的所有app中,找stark.py文件,并加载
def ready(self):
from django.utils.module_loading import autodiscover_modules
autodiscover_modules('stark')
3.model操作
model.UserInfo
model.UserInfo._meta.app_label#获取当前app的名称
model.UserInfo._meta.model_name#获取当前类名小写
model.UserInfo._meta.get_field('username')#获取字段 model.UserInfo._meta.get_field('username').verbose_name#获取verbose_name
model.UserInfo._meta.get_field('外键或多对多字段').rel.to #得到关联的model类
- models.UserInfo._meta.get_field('name') # 根据字段名称,获取字段对象
- models.UserInfo._meta.fields # 获取类中所有的字段
- models.UserInfo._meta._get_fields() # 获取类中所有的字段(包含反向关联的字段)
- models.UserInfo._meta.many_to_many # 获取m2m字段
4.函数和方法
函数还是方法
对于类中的函数,直接用类名调用的话需要传入self参数,既函数
用对象调用的话就不需要传入self参数,既方法
class Foo(object):
def __init__(self):
self.name = 'alex'
def func(self):
print(self.name) from types import FunctionType,MethodType obj = Foo()
print(isinstance(obj.func,FunctionType)) # False
print(isinstance(obj.func,MethodType)) # True print(isinstance(Foo.func,FunctionType)) # True
print(isinstance(Foo.func,MethodType)) # False
"""
注意:
方法,无需传入self参数
函数,必须手动传入self参数
"""
函数是一个对象,
- func.__name__ #获取函数的名字
- func.text = "sdfsfd" #设置属性值
# obj = Foo()
# print(obj.func) # <bound method Foo.func of <__main__.Foo object at 0x00000000021E8400>> # print(Foo.func) # <function Foo.func at 0x0000000001E89B70>
#
# obj = Foo()
# Foo.func(obj)
#
# obj = Foo()
# obj.func()
class Foo(object):
def __init__(self):
self.name = 'alex'
def func(self):
print(self.name) from types import FunctionType,MethodType obj = Foo()
print(isinstance(obj.func,FunctionType)) # False
print(isinstance(obj.func,MethodType)) # True print(isinstance(Foo.func,FunctionType)) # True
print(isinstance(Foo.func,MethodType)) # False
"""
注意:
方法,无需传入self参数
函数,必须手动传入self参数
"""
5.保留搜索条件的两种方法
方式一 直接通过 request.GET.urlencode()
列表页面:
获取当前所有条件,添加到
- 编辑按钮的URL后面
- 添加按钮的URL后面
编辑或添加页面:
- POST提交时,获取原来列表页面传过来的条件
- 拼接URL /hosts/?原来的条件 list页面: list_condition = request.GET.urlencode() {% for item in host_list %}
<li>{{ item }} <a href="/edit/54/?{{ list_condition }}">编辑</a></li>
{% endfor %} add/edit页面:http://127.0.0.1:8000/edit/10/?page=5&id__gt=4
def edit_host(request,pk):
if request.method == "GET":
return render(request,'edit_host.html')
else:
# 修改成功 /hosts/?page=5&id__gt=4
url = "/hosts/?%s" %(request.GET.urlencode())
return redirect(url)
方式二
list页面: http://127.0.0.1:8000/hosts/?page=5&id__gt=4 params = QueryDict(mutable=True)
params['_list_filter'] = request.GET.urlencode()
list_condition = params.urlencode() {% for item in host_list %}
<li>{{ item }} <a href="/edit/54/?{{ list_condition }}">编辑</a></li>
{% endfor %} add/edit页面:http://127.0.0.1:8000/edit/54/?_list_filter=page%3D5%26id__gt%3D4 def edit_host(request,pk):
if request.method == "GET":
return render(request,'edit_host.html')
else:
# 修改成功 /hosts/?page=5&id__gt=4
url = "/hosts/?%s" %(request.GET.get('_list_filter'))
return redirect(url)
request.GET本质是QuerySet,不能改变但是给他设置 request.GET._mutable=True就可以改变了,但是不建议改变request.GET 我们可以自定义
params = QueryDict(mutable=True)或者
import copy
params=copy.deepcopy(request.GET)
- request.GET
- ?name=alex&age=18&age=19
- params = { name:['alex', ], age:[18,19] } - params['hobby'] = "鲁宁"#实际上是一个列表
- params = { name:['alex', ], age:[18,19], hobby:[ 鲁宁,] } - params.setlist('hobby',["鲁宁"])
- params = { name:['alex', ], age:[18,19], hobby:[鲁宁,] }
类似的还有
pop()
remove()方法
用法和字典一样
6.Q函数的补充
- Q
- Q(id__gt=1)|Q(id=2)
- con = Q()
- 模板语言中的字典,不能以_开头 obj._
- GET请求 con = Q() q1 = Q()
q1.connector = 'or'
q1.children.append( ('name','alex1') )
q1.children.append( ('name','alex2') ) q2 = Q()
q2.children.append( ('age__gt',18))
q2.children.append( ('id__gt',18)) con.add(q1,'OR')
con.add(q2,'OR')
# (name='alex' or name=='alex2') or (age>18 and id > 18) queryset = self.model_class.objects.filter(con)
7.一个对象是否可以被for循环?
class Foo(object):
def __init__(self,name,data_list):
self.name = name
self.data_list = data_list def __iter__(self):
yield "<div>"
yield "全部"
for item in self.data_list:
yield item
yield "</div>"
obj_list = [Foo('富贵',['男','女']), Foo('强哥',['啊啊','问问']), Foo('熊平',['搜索','所属'])] for obj in obj_list:
for item in obj:
print(item)
# 需求:循环对象时,先打印对象name属性,然后再答应123。
class A(object):
def __init__(self,name,data_list):
self.name=name
self.data_list=data_list def __iter__(self):
yield self.name
for i in self.data_list:
yield i obj_list=[A('ctz',[1,2,3]),A('aa',[1,2,3]),A('bb',[1,2,3]),A('cc',[1,2,3])] for obj in obj_list:
for item in obj:
print(item)
8.里面用了很多yield 记住
9.isinstance
class Foo(object):
pass class Bar(Foo):
pass obj = Bar() # isinstance用于判断,对象是否是指定类的实例 (错误的)
# isinstance用于判断,对象是否是指定类或其派生类的实例
print(isinstance(obj,Foo))
print(isinstance(obj,Bar)) print(type(obj) == Bar)
print(type(obj) == Foo) #type 精确判断
# 对象,判断是否是某个类型? type,isinstance from django.forms.models import ModelChoiceField
from django.forms.models import ModelMultipleChoiceField isinstance(obj,ModelChoiceField)
10.反射补充
1.常用 普通
class Foo(object):
def func(self):
pass obj = Foo() name = "func" fc = getattr(obj,name) fc()
2.补充的 django setting.py中中间件注册(参考django源码得知)
class SqlServerHelper(object):
def fetchone(self):
"""
链接SQLServer,获取一条数据
:return:
"""
print('SQLServer.fetchone')
sqlserver.py
class MySQLHelper(object): def fetchone(self):
"""
链接MySQL,获取一条数据
:return:
"""
print('MySQL.fetchone')
mysql.py
# DB_PATH = "db.mysql.MySQLHelper"
DB_PATH = "db.sqlserver.SqlServerHelper"
settings.py
from 反射.settings import DB_PATH def func():
# 导入文件
# 反射
# DB_PATH = "db.mysql.MySQLHelper"
module_path,cls_name = DB_PATH.rsplit('.',maxsplit=1) # 以字符串的形式导入模块
# from db import mysql
import importlib
module_obj = importlib.import_module(module_path) # 去模块中导入类
cls = getattr(module_obj,cls_name) # 类实例化
obj = cls()
obj.fetchone() if __name__ == '__main__':
func()
app.py
11、对象加减乘除
加法
class Foo(object): def __init__(self,age):
self.age = age def __add__(self, other):
# return self.age + other.age
return Foo(self.age + other.age) obj1 = Foo(19)
obj2 = Foo(18) obj3 = obj1 + obj2
其他方法也有对应的方法 直接调用仿照上面即可
Django-自定义增删改查组件的一些体会的更多相关文章
- 基于django做增删改查组件,分页器组件
增删改查组件 一.Djangoadmin的启发 二.基于Djangoadmin实现数据的增删改查 分页器组件 分页器组件的介绍以及源码解读 补充:源码下载,
- day84-仿照admin实现一个自定义的增删改查组件
一.admin的使用 app01的admin.py文件: class BookConfig(admin.ModelAdmin): list_display=[] list_display_links= ...
- popup的简单应用举例(具体在增删改查组件中用到)以及补充的知识点
一.首先说一下自执行函数 1. 立即执行函数是什么?也就是匿名函数 立即执行函数就是 声明一个匿名函数 马上调用这个匿名函数 2.popup的举例 点击,弹出一个新的窗口.保存完事,页面不刷新数据就返 ...
- django ORM 增删改查 模糊查询 字段类型 及参数等
ORM 相关 #sql中的表 #创建表: CREATE TABLE employee( id INT PRIMARY KEY auto_increment , name VARCHAR (), gen ...
- 饮冰三年-人工智能-Python-24 Django ORM增删改查
一:首先使用默认的sqlite3创建表 1:现在在models.py中添加表模型 from django.db import models # Create your models here. cla ...
- Django项目----快速实现增删改查组件(起步阶段!!!)
一.相关知识点回顾 1.什么是反射? 可以用字符串的方式去访问对象的属性 2.反射有四种方法? hasattr(object,name):判断一个对象是不是有name属性或者方法 getattr: ...
- django数据库增删改查
django中数据库基本操作: 1.同步数据库 python manage.py makemigrations #生成migrations python manage.py migrate #应用mi ...
- django模型(增删改查等)
Django提供的模型操作起来数据库非常方便 以自定义模型名字Demo为例: 获取所有数据:all() demo.objects.all() #返回queryset对象 #这个语句和Select * ...
- C/C++ Qt 数据库QSql增删改查组件应用
Qt SQL模块是Qt中用来操作数据库的类,该类封装了各种SQL数据库接口,可以很方便的链接并使用,数据的获取也使用了典型的Model/View结构,通过MV结构映射我们可以实现数据与通用组件的灵活绑 ...
随机推荐
- uoj#188. 【UR #13】Sanrd(Min_25筛)
题面 传送门 题解 这是一道语文题 不难看出,题目所求即为\(l\)到\(r\)中每个数的次大质因子 我们考虑\(Min\_25\)筛的过程,设 \[S(n,j)=\sum_{i=1}^nsec_p( ...
- POJ 3243 // HDU 2815(改下输出,加个判断)
A^x = B (mod C) 的模板题,不够要用扩展BSGS (虽然AC,但完全理解不了模板0.0,以后学好数学在来慢慢理解555555) #include <iostream> #in ...
- Linux(CentOS7)安装zip、unzip命令
安装命令: yum install -y unzip zip
- Go语言规格说明书 之 select语句(Select statements)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- jquery之源码
1.插件扩展机制 所有的Jquery代理对象的实例,都是扩展自$.fn对象的 意味着只要我们继续扩展$.fn这个对象的功能,就相当于扩展了所有的Jquery代理对象的实例的功能 代码 var $bod ...
- bert 词典扩充方案
- IOS支持多国语言
- confusion_matrix(混淆矩阵)
作者:十岁的小男孩 凡心所向,素履可往 目录 监督学习—混淆矩阵 是什么?有什么用?怎么用? 非监督学习—匹配矩阵 混淆矩阵 矩阵每一列代表预测值,每一行代表的是实际的类别.这个名字来源于它可以非常容 ...
- php-fpm 配置文件检测
用过 Nginx 的兄弟都知道,修改 Nginx 配置文件之后,可以使用 nginx -t 来检测配置文件是否有语法错误. 今天配置 opcache 的时候,发现 php-fpm 也可以检测 php- ...
- python 全栈开发,Day114(装饰器,排序规则,显示列,添加按钮,定制ModelForm,自定义列表页面,自定制URL)
一.装饰器 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用场景:比如插入日志,性能测试,事务处理, ...