一、首先說一下自執行函數
1. 立即執行函數是什么?也就是匿名函數
立即執行函數就是
- 聲明一個匿名函數
- 馬上調用這個匿名函數

2、popup的舉例
點擊,彈出一個新的窗口。保存完事,頁面不刷新數據就返回了。(點擊admin的+,彈出的框就是用popup來做的)
具體操作步驟:
1、urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
url(r'^pop/', views.pop),
]
2、views.py
def index(request):
return render(request,"index.html")
def pop(request):
if request.method=="GET":
return render(request,"pop.html")
else:
user = request.POST.get("user")
print(user)
return render(request,"pop_response.html",{"user":user})
3、templaates
index.html
<body>
<h1 id = "a">無所謂</h1>
<a href="#" onclick=popUp("http://www.baidu.com")>點我點我</a>
<script>
function xxxpopupCallback(text) {
document.getElementById('a').innerHTML = text; //找到標簽吧值替換成用戶傳進來的值
}
function popUp(url) {
window.open( '/pop/', "n1","status=1, height:500, width:600, toolbar=0, resizeable=0");
{# window.open( url, "n1","status=1, height:500, width:600, toolbar=0, resizeable=0");#}
}
分析:
index頁面的第一個參數就是url,寫什么路徑就看到什么頁面
n1:彈出窗口的名字,定死了就彈出一個
'/pop/','/pop/' 一個url彈出一個
如果有兩個+最多彈出兩個框
</script> </body>
pop.html
<body>
<form action="" method="post">
{% csrf_token %}
<input type="text" name="user">
<input type="submit" value="提交">
</form>
</body>
pop_response.html
<h1>正在關閉</h1>
<script>
(function () {
// 可以調用popup原頁面的一個函數,
opener.xxxpopupCallback("{{ user }}"); xxxpopupCallback是自定義的函數
window.close(); //傳完數據之后自動關閉
})()
</script>
運行結果截圖


3、Form時時更新的兩種方式

在ModelForm需要知道:
from app03 import models
from django.forms import ModelForm
class UserForm(ModelForm):
class Meta:
model = models.UserInfo
fields = "__all__"
它的內部找到類之后,如果 類里的字段是FK,就會自動生成ModelChoiceField
如果是M2M ,就會自動生成ModelMutilChoiceField
4、isintance和type
class Foo(object):
pass
class Bar(Foo):
pass
obj = Bar()
# isinstance用於判斷,對象是否是指定類的實例 (錯誤的)
# isinstance用於判斷,對象是否是指定類或其派生類的實例
# isinstance不精准
print(isinstance(obj,Foo),id(obj)) #True 35558624
print(isinstance(obj,Bar),id(obj)) #True 35558624
print(type(obj)==Foo) #False
print(type(obj)==Bar) #True
# 思考?
# 對象,判斷是否是某個類型?
# 如果沒有繼承關系用isinstance,
# 如果有繼承關系可以用type,
5、json的補充
import json
v = {"name":"海燕","age":22}
str_dic = json.dumps(v)
print(json.dumps(v),type(str_dic)) #{"name": "\u6d77\u71d5", "age": 22}<class 'str'>
print(json.dumps(v,ensure_ascii=False)) #{"name": "海燕", "age": 22}
6、反射舉例
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()
復制代碼
6、知識點大致整理
- 單例模式
- 文件導入
- 類方法
- 反射
- 導入一個模塊importlib,利用反射找到類
- getattr
- 面向對象
- 遇到封裝數據時、;字典
自己寫一個類,封裝對象來做
- 遇到循環數據時:字典,元組,列表,可迭代對象(__iter__)
- 遇到后台對數據加工在頁面中循環展示,可以通過yield來做(邊循環邊生產)。也可以先處理再循環
- request.GET
- ?name=alex&age=18&age=19 #如果遇到這樣的。
- QueryDict類型 = {"name":["alex",],"age":[18,19]}
- 要想被修改 .mutable = True
params["hobby"] = "魯寧"
QueryDict類型 = {"name":["alex",],"age":[18,19],hobby:["魯寧"],}
params["hobby"] = ["魯寧"] #傳進去的是一個列表套列表
QueryDict類型 = {"name":["alex",],"age":[18,19],hobby:[["魯寧"]],}
- params.setlist("hobby",["魯寧"]) #直接把本身的元素傳進去
QueryDict類型 = {"name":["alex",],"age":[18,19],hobby:["魯寧"],}
- 類
- 組件
- StarkSite,單利模式,用於保存Model類和處理這個類增刪改查的配置類的對象
- StarkConfig:處理增刪改查的基類
- ChangeList:將列表頁面的功能封裝到此類中
- FilterRow:創建的可迭代對象(__iter__),一個對象保存了組合搜索中的一行數據
- FilterOption:封裝組合搜索的配置項(數據庫字段,是否多選,是否choice,條件)
- 使用
- class UserInfo(models.MOdel):....
在stark.py
class UserMOdelForm(MOdelForm):
class Meta:
model = UserInfo
fields = "__all__"
class UserinfoConfig(v1.StarkConfig)
list_display
.....
model_form_class = UserMOdelForm
v1.site.register(UserInfo,UserinfoConfig)
