django總結

0Django階段性總結
1、Django簡介
Django是一個開放源代碼的Web應用框架,由Python寫成。採用了MTV的框架模式,即模型M,模板T和視圖V。它最初是被開發來用於管理勞倫斯出版集團旗下的一些以新聞內容爲主的網站的,即是CMS(內容管理系統)軟件。並於2005年7月在BSD許可證下發布。這套框架是以比利時的吉普賽爵士吉他手Django Reinhardt來命名的。

2、Django使用框架模式(MTV)
M:Model –> 負責數據庫的CRUD,表結構的定義;
T:Template –> 負責把渲染的頁面及特定的內容展示給用戶;
V:View –> 負責業務邏輯處理,Model與Template間的橋樑。Django中還有一個url分發器,也叫作路由。主要用於將url請求發送給不同的View並進行相關的業務邏輯處理。

3、Django的常規操作¬
1)pip install virtualenv: 安裝virtualenv(虛擬環境)(注:創建pycharm項目時需要指定虛擬環境,可以將不同版本的項目隔離開來,項目上線時要將環境和項目分離開);
2)pip install django==1.11: 安裝django環境;
3)virtualenv –no-site-packages -p xxx 文件名: 安裝env環境;
xxx –> 指定python版本所在的路徑。沒有則使用默認版本的python解釋器–no-site-packages –> 純淨的虛擬環境,不包括外界的包/模塊(Pycharm創建的虛擬環境自帶多種包/模塊)
4)cd envname/Scripts –> activate | deactivate: 進入|退出env;
5)django-admin startproject 項目名: 創建django項目,項目文件夾名及其中的工程名一致;
Project(工程內部文件簡介):
init.py: 初始化,配置pymysql連接的地方
setting.py: 配置文件,具體配置項目如下:
– 在INSTALLED_APPS下添加包/模塊,第三方庫(如:rest_framework)
– 在MIDDLEWARE添加再定義中間件(如:訪問前登錄),在POST提交時注意crsf中間件的存在
– 在TEMPLATES中配置承載前端頁面的templates路徑,並在工程同級處創建templates文件;
– 在DATABASES中配置數據庫相關參數,同時在項目外創建相應utf8編碼類型的數據庫(數據庫名稱,用戶,密碼等參數需保持一致)
– LANGUAGE_CODE:配置語言(如:zh-hans),TIME_ZONE:配置時區 (‘Asia/Shanghai’)
– 在STATIC_URL,STATICFILES_DIRS中配置靜態文件路徑,用於存放CSS、JS、IMAGE,fonts相關文件
– MEDIA_URL、MEDIA_ROOT中配置上傳文件(如:頭像)的路徑,使用前先轉爲動態(static)文件並加至路由(urlpatterns)中
– 在REST_FRAMEWORK中配置restframework相關信息,如分頁等
urls.py: 配置路由信息,可設置命名空間namespace
wsgi.py: 網關

6)python manage.py startapp hello_app: 創建app(模塊)。該命令是在工程下創建一個名爲hello_app的app,並與工程同級
app(模塊內部文件簡介):
urls.py(自創): url路由,給每個請求尋找對應的方法
admin.py: 管理後臺、註冊模型
apps.py: settings.py裏面註冊app的時候需要使用到,一般不推薦直接使用
models.py:存放模型的地方,定義數據庫中的表結構
views.py:寫處理業務邏輯的地方
7)settings
7.1)在settings.py文件中INSTALLED_APPS中寫入app name
7.2)修改databases
7.3)修改templates – os.path.join(BASE_DIR, ‘templates’)
7.4)設置語言 – LANGUAGE_CODE = ‘zh-hans’
7.5)修改時區 – TIME_ZONE = ‘Asia/Shanghai’

8)建立模型 – 定義的模型繼承於models.Model
A 模型字段:
– CharField: 字符串
– IntegerField: 整數
– FloatField: 浮點數
– BooleanField: 布爾類型(1,0)
– DateField(auto_now_add=True/auto_now=True): 存放日期(年月日)
auto_now_add=True:第一次創建數據時設置時間(1次)
auto_now=True:每次登錄、修改操作都會更新到最新時間(多次)
– DateTimeField:年月日 時分秒
auto_now_add:同上
auto_now:同上
– AutoField: 自動增長
– DecimalField:
models.DecimalField(max_digits=3,decimal_places=1) 最大值99.9
max_digits: 總位數
decimal_places: 小數點後的位數
– TextField: 存長文本信息,頁面等
– FileField: 文件上傳字段
– ImageField(upload_to=”): 上傳圖片
upload_to=”xxx”:指定上傳圖片的路徑

B 模型參數:
– default=’xxx’:設置默認值
null=True: 設置是否爲空,針對數據庫中該字段是否可以爲空
blank=True:設置是否爲空,針對表單提交中該字段是否可以爲空
– primary_key=True:創建主鍵
– unique:唯一
– max_length: 最大長度
6. – choices,示例如下:
在student模型中添加就讀狀態屬性,使用choices字段使得值只能從STATUS列表中選取(注:STATUS爲規定關鍵字,其類型只能爲列表或元組,可以強制轉換爲字典從而採用鍵值對的方式進行操作)

Model.py
STATUS =[
(‘NONE’,’正常’),
(‘NEXT_SCH’,’留級’),
(‘DROP_SCH’,’退學’),
(‘LEAVE_SCH’,’休學’)
]
s_status = models.CharField(choices=STATUS,max_length=20,null=True)

Views.py
status = request.GET.get(“status”) # 狀態
status_dict = dict(Student.STATUS) — {‘NONE’:’正常’ ……}
for key,value in status_dict.items():
if value == status:
stus = Student.objects.filter(s_status=key)

9)加載數據庫
import pymysql
pymysql.install_as_MySQLdb():當成是mysqldb一樣使用,當然也可以不寫這句,那就按照pymysql的方式

10)數據庫遷移
python manage.py makemigrations
python manage.py migrate
python manage.py makemigrations stu:強制找到stu模塊進行遷移
Navicat中指定數據庫中的表django_migrations記錄了所有遷移記錄
注:Django裏面自帶user – request裏的user默認爲AnonymousUser,其中的id,username等屬性爲空

11)配置DEBUG
Run – Debug – Edit Configuration – + – Python – 配置Script path(manage.py) Parameters(runserver 8000) – Apply
12)啓動項目
python manage.py runserver ip:端口號(默認8000端口):啓動django項目,端口號可以不用寫,啓動的時候會默認隨機創建一個可以使用的端口

13)(*暫時可有可無)創建超級管理員的帳號和密碼
python manage.py createsuperuser

4、Django過濾
科普知識:ORM(objects relational mapping) – 對象關係映射,翻譯機
1)通過modelname.objects來實現數據的增刪查改(CRUD)操作
.all() – 獲取全部信息
.filter() – 獲取指定信息(.first():獲取過濾後的第一條信息,.last():… 最後一條 …
.create() – 創建指定信息
.get() – 只能獲取一條數據,獲取不到或數據有多條則會報錯,不建議使用
2)F()和Q()函數
F() – F()允許Django在未實際鏈接數據的情況下具有對數據庫字段的值的引用。通常情況下我們在更新數據時需要先從數據庫裏將原數據取出後方在內存裏,然後編輯某些屬性,最後提交。
例1
常規操作:
order = Order.objects.get(orderid=’123456789’)
order.amount += 1
order.save()

使用F()方法:
from django.db.models import F
from core.models import Order

order = Order.objects.get(orderid=’123456789’)
order.amount = F(‘amount’) - 1
order.save()
例2
有一張表,保存着公司員工的工資,公司普漲工資,代碼如下:
from django.db.models import F
UserInfo.objects.filter().update(salary=F(‘salary’)+500)

Q() – Q對象(django.db.models.Q)可以對關鍵字參數進行封裝,從而更好地應用多個查詢。可以組合使用 &(and),|(or),~(not)操作符,當一個操作符是用於兩個Q的對象,它產生一個新的Q對象。

代碼
Order.objects.get(
Q(desc__startswith=’Who’),
Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6))
)
相應的SQL語句
SELECT * from core_order WHERE desc LIKE ‘Who%’ AND (create_time = ‘2016-10-02’ OR create_time = ‘2016-10-06’)

注:Q對象可以與關鍵字參數查詢一起使用,不過一定要把Q對象放在關鍵字參數查詢的前面

正確寫法
Order.objects.get(
Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6))
desc__startswith=’Who’,
)
錯誤寫法
Order.objects.get(
desc__startswith=’Who’,
Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6))
)

5、關聯
1) 1:1 OneToOneField: 主鍵和外鍵是一對一關係,在關聯表中,只能關聯一個主表的id (一般添加到擴展表,關聯到主表)
拓展表找主表 – 拓展信息對象.關聯字段
主表找拓展表 – 主表對象.關聯表的modelname(小寫)
2)1:N OneToManyField(用戶、訂單)
拓展表找主表 – 拓展信息對象.關聯字段
主表找拓展表 – 主表對象.關聯表的modelname(小寫)_set
3) N:N MangToManyField
A在數據庫表中的多對多,有兩種方式:
方式1 – 自定義第三張表

class B2G(models.Model):
b_id = models.ForeignKey(‘Boy’)
g_id = models.ForeignKey(‘Girl’)

class Boy(models.Model):
name = models.CharField(max_length=16)

class Girl(models.Model):
name = models.CharField(max_length=16)

方式2 –使用models中自帶的ManytoManyField自動創建第三張表
class Boy(models.Model):
name = models.CharField(max_length=16)

class Girl(models.Model):
name = models.CharField(max_length=16)
b = models.ManyToManyField(‘Boy’)
注:使用多對多自動創建後,會創建第三張表,第三張表中會將操作的前兩張表中的ID做對應
B 多對多查詢
#正向查詢

獲取一個女孩對象

g1 = Girl.objects.get(id=1)

獲取和當前女孩有關聯的所有男孩

g1.b.all() #獲取全部

反向查詢

b1 = Boy.objects.get(id=1)
b1.girl_set.all() #獲取全部

連表查詢

正向連表

Girl.objects.all().values(‘id’,’name’,’b__username’)

反向連表

Boy.objects.all().values(‘id’,’name’,’girl__name’)

注意此處爲girl__name,並非girl_set__name.

6、前端操作
科普知識:Jinja2 –> Python下一個被廣泛應用的模版引擎,他的設計思想來源於Django的模板引擎,並擴展了其語法和一系列強大的功能。其中最顯著的一個是增加了沙箱執行功能和可選的自動轉義功能,這對大多應用的安全性來說是非常重要的。它基於unicode並能在python2.4之後的版本運行,包括python3
過濾器(|):在變量顯示前修改
example: 語文成績:{{stu.stu_chinese | add:10}} – add:加法,增加值

時間 date:(在數據庫中時間會比頁面顯示中少8個小時,操作時需要注意)
Y-完整年份(四位年) m:月
y-簡寫年份(兩位年) d:日
H-時 24小時制 m:分
h-時 12小時制 s:秒
example: 創建時間:{{ stu.stu_create_time | date:’Y-m-d H:m:s’ }}
註釋
{# #}:單行註釋()
{% comment %}{% endcommet %}:多行註釋

 大小寫
      upper | lower
      example : 姓名:{{ stu.stu_name | upper}} 

分數乘法運算
widthratio 數 分母 分子
example: 語文成績乘以10:{% widthratio stu.stu_chinese 1 10 %}

 整除運算
      divisibleby:2  整除2,返回True,否則返回False
      example: 數學成績:{{ stu.stu_math | divisibleby:2}}  
                       <!-- 判斷數學成績是否能整除2 -->

 命名空間
      {% url 'namespace:name' value %}
      工程url中定義namespace
      模塊url中定義name

 靜態資源加載
      1)<img src="/static/images/xxx.png">
      2) {% load static %}
               <img src="{% static 'images/enemy1.png' %}">

 for
         {% for stu in stus %}
         {% empty %}  # for中內容爲空時執行的操作
         {% endfor %}

 if
         {% if xxx %}
         {%  else  %}
         {%  endif %}

 ifequal  --  如果相等時的操作
         {% ifequal xxx 1 %}
         {% else %}
         {% endifequal %}

 forloop
         計數從0開始: {{ forloop.counter0 }}
         計數從1開始: {{ forloop.counter }}
         計數從最後開始,到1停: {{ forloop.revcounter }}
         計數從最後開始,到0停: {{ forloop.revcounter0 }}

7、REQUEST處理
post – 提交數據隱藏了
get – 提交數據在url上, ?後跟參數,&用來連接多個參數,但是對參數的數量有限制,每個瀏覽器的限制不同
put 更新全部數據
patch 更新局部數據
delete:刪除數據
example: stu_id = request.GET.get(‘stu_id’)
Student.objects.filter(id=stu_id).delete()

8、COOKIE
cookie: 隨着url移動,在瀏覽器
session: 在數據庫
set_cookie(key,value,seconds): 設置cookie,併爲其綁定令牌,令牌有過期時間,可以設置並存放在mysql或mongodb
1)綁定令牌到cookie裏面,並將cookie存在前端
ticket = ‘lalala’
response = HttpResponse()
response.set_cookie(‘ticket’,ticket)
return response
2)cookie存在數據庫中
user.u_ticket = ticket
user.save()
3)從瀏覽器及數據庫中刪除cookie
response = HttpResponseRedirect(“/shopapp/login/”)
ticket = request.COOKIES.get(“ticket”)
response.delete_cookie(“ticket”)
UserSession.objects.get(session_data=ticket).delete()
return response

9、Ajax
前端JS
function add(){
csrf = (input[name=csrfmiddlewaretoken]).val();sname= (‘#s_name’).val();
s_tel = (‘#s_tel’).val(); .ajax({
url:’/stuapp/student/’,
type:’POST’,
data:{‘s_name’:s_name,’s_tel’:s_tel}, //向後端傳遞數據,以字典的形式
dataType:’json’,
headers:{‘X-CSRFToken’:csrf},
success:function (msg) {
alert(‘添加成功’)
},
error:function () {
alert(‘添加失敗’)
}
});
}
前端HTML頁面
{% csrf_token %}

後端邏輯處理函數
JsonResponse(data) data不能是QuerySet

– form表單提交(POST) 刪除(DELETE) 局部更新(PATCH)
1) 開啓中間件django.middleware.csrf.CsrfViewMiddleware
2) {% csrf_token %},等同如下:

3) (ajax之外用不到
)csrf = $(‘input[name=”csrfmiddlewaretoken”]’).val()
headers:{‘X-CSRFToken’: csrf}
上述部分缺失會出現403 Forbidden錯誤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章