注冊
form組件給input 的標簽 添加樣式類 參見 這篇博客(點擊)
上傳圖像
1.解決 一點擊圖像就會直接打開上傳文件的按鈕
#這兒利用了 label標簽和input的特殊的聯動功能 <div class="form-group"> <label for="avatar"> 上傳頭像 <img id="avatar_img" src="/static/image/default.png" alt="頭像" width="40" height="40"> </label> <input type="file" style="display: none" id="avatar"> </div>
jequery 注意: 返回false的情況:
- " " 即:空字符串
- 0
- -0
- undefined
- false
- null
- NaN
其他的的都返回True ,包括空數組和對象
日期歸檔
我們在數據庫中建立一個表datatime,里邊有一個字段time 類型 date
SELECT * from datetime;
結果:

現在有一個需求,我們想要取這個日期的年月,怎么辦,這時候我們就用到了一個時間格式函數 ,注意這個只能用在MySQL數據庫中
date_format(data,時間格式): DATE_FORMAT() 函數用于以不同的格式顯示日期/時間數據
1.把字符串轉為日期格式
實例:
SELECT DATE_FORMAT('2017-09-20 08:30:45', '%Y-%m-%d %H:%i:%S');
輸出結果:
2017-09-20 08:30:45(日期Date格式)
我們那道題就應該這樣寫:
select DATE_FORMAT(time,"%Y-%m") as time from datetime;
結果:

extra()
有時候, Django 提供的查詢語法不太夠用. 為了滿足這些邊緣需求, Django 提供了 extra() 結果集修改器 - 一種提供額外查詢參數的機制.
注意:這個函數只能用querset才能 調
要注意這些額外的方式對不同的數據庫引擎可能存在移植性問題.(因為你在顯式的書寫SQL語句),除非萬不得已,盡量避免這樣做:
sql中可以這樣寫
select name ,(select count(1) from app1_author) as n from publish
但是在orm中不能這么寫,只能用extra來實現
a=models.Publisher.objects.all().extra(select={'n':'select count(1) from app1_author"}) #注意sql語句不要加;加上會報錯
## select提供簡單數據
# SELECT age, (age > 18) as is_adult FROM myapp_person;
Person.objects.all().extra(select={'is_adult': "age > 18"}) # 加在select后面
## where提供查詢條件
# SELECT * FROM myapp_person WHERE first||last ILIKE 'jeffrey%';
Person.objects.all().extra(where=["first||last ILIKE 'jeffrey%'"]) # 加一個where條件
## table連接其它表
# SELECT * FROM myapp_book, myapp_person WHERE last = author_last
Book.objects.all().extra(table=['myapp_person'], where=['last = author_last']) # 加from后面
## params添參數
# !! 錯誤的方式 !!
first_name = 'Joe' # 如果first_name中有SQL特定字符就會出現漏洞
Person.objects.all().extra(where=["first = %s" % first_name])
# 正確方式
Person.objects.all().extra(where=["first = %s"], params=[first_name])
extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
有些情況下,Django的查詢語法難以表達復雜的where子句,對于這種情況, Django 提供了extra()QuerySet修改機制 。它能在QuerySet生成的SQL從句中注入新sql語句,extra可以指定一個或多個參數,例如select、where或tables。 這些參數都不是必須的,但是至少要使用一個。注意是Queryset才能調用extra()函數
參數之select
The select 參數可以讓你在 SELECT 從句中添加其他字段信息,它是一個字典,存放著屬性名到 SQL 從句的映射。
queryResult=models.Article
.objects.extra(select={'is_recent': "create_time > '2017-09-05'"})
結果集中每個 Entry 對象都有一個額外的屬性is_recent, 它是一個布爾值,表示 Article對象的create_time 是否晚于2017-09-05.
例題:
date_list=Article.objects.filter(user=user).extra(select={"create_ym":'DATE_FORMAT(create_time,"%%Y-%%m")'})
.values("create_ym").annotate(c=Count("nid"))\
.values("create_ym","c")#這里要注意在SQL中表示年月格式是這樣的DATE_FORMAT(create_time,"%Y-%m"),d但是在extra中需要再加一個%
以后工作中盡量使用extra函數,有很大的bug
參數之where
在BBS中如果你用mysql作為數據庫時它有很大的一個bug至少是我認為的,它不能用字段__month來過濾出月份來,但是用字段__year可以過濾出年份來
比如這個代碼就不能執行
article_list = Article.objects.filter(user=user).filter(create_time__year=year, create_time__month=month)
這里必須用extra的參數where:
article_list = Article.objects.filter(user=user).extra(where=["YEAR(create_time)=%s and Month(create_time)=%s"],params=[year,month]) #where=列表里寫上
SQL語句,如果有參數,就用params=列表里寫上參數,注意params這個名稱不能改變
django事務
Django的默認事務處理行為
Django 的默認行為是運行在自動提交模式下。 任何一個查詢都立即被提交到數據庫中,除非激活一個事務。 詳細信息請參考下文。
Django 用事務或者保存點去自動的保證復雜ORM各種查詢操作的統一性,尤其是 delete() 和update() 查詢.
開啟事務的方式有兩種種詳細見:http://www.rzrgm.cn/clschao/articles/10463267.html
很好的一篇文章:http://www.rzrgm.cn/HZHST/p/11479732.html
全局開啟事務和局部開啟事務
全局開啟事務,很少用,我們來聊一下,局部局開啟事務
atomic
Django提供了單一的API來控制數據庫事務。
在Django中可以通過django.db.transaction模塊提供的atomic來定義一個事務,atomic提供兩種用法,一種是裝飾器,一種是with語句。
atomic(using=None, savepoint=True)-
atomic接受一個using參數,它必須是數據庫的名字。 如果這個參數沒提供,Django默認使用"default"數據庫。 -
原子性是由數據庫的事務操作來界定的。
atomic允許我們在執行代碼塊時,在數據庫層面提供原子性保證。 如果代碼塊成功完成, 相應的變化會被提交到數據庫進行commit; 如果執行期間遇到異常,則會將該段代碼所涉及的所有更改回滾。atomic塊可以嵌套。 在下面的例子里,使用with語句,當一個內部塊完成后,如果某個異常在外部塊被拋出,內部塊上的操作仍然可以回滾(前提是外部塊也被atomic裝飾過)。
第一種方式
from django.db import transaction with transaction.atomic(): if pid: #說明是子評論 #找到回車鍵的索引 a=content.find("\n") #切片 content=content[a+1:] comment = Comment.objects.create(content=content, article_id=article_id, user_id=user_id,parent_comment_id=pid) #如果是根評論 parent_comment_id 不需要賦值 else: comment= Comment.objects.create(content=content,article_id=article_id,user_id=user_id) Article.objects.filter(pk=article_id).update(comment_count=F("comment_count") + 1)
第二種方式:
from django.db import transaction @transaction.atomic def viewfunc(request): # This code executes inside a transaction. do_stuff()
前端頁面知識點
富文本編輯器(kindedit)
詳細信息見官方文檔
HTML部分頁面
<script> KindEditor.ready(function (K) { window.editor = K.create('#text_area', { width: "700px", uploadJson:"/upload_file/", extraFileUploadParams : { "csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val(), } }); }); </script>
浙公網安備 33010602011771號