1、后台管理的左側菜單,默認只有第一個頁簽下面的選項是顯示的,點了別的頁簽再顯示別的頁簽下面的選項,問題是:點了任何菜單的選項后,左側菜單又成了第一個頁簽的選項顯示,別的頁簽隱藏,也就是左側的菜單刷新了一遍。
2、登錄頁面,用戶輸入了用戶名和密碼,點了登錄,如果輸入的是錯誤的,則當前頁面會刷新一遍(提交后就會刷新),用戶已經輸入的內容就全沒有了;這需要用到ajax實現靜默提交。
3、登錄網址是login.html,后台管理網址是index.html,如果用戶不進入login.html而直接進入index.html的話,事實上用戶就不用登錄即可訪問后台了;這需要用會話保持做限制(cookie、session),如果沒有保存登錄信息,輸入index.html會自動跳轉到login.html。
1.路由系統
1.1 簡單描述
django的每個url都對應一個python方法,
,比如用戶輸入的網址是127.0.0.1:8000/login,則django會默認從urls.py里配置的url,從上到下匹配,有匹配成功的,就執行對應方法,下面的就不匹配了;沒有匹配的,就返回404。
1.2 使用正則表達式配置url
,這些數字頁簽,每一個都對應一個url,比如有1000頁,是不是也要在urls.py里寫一千個路由記錄?並不是,而是用正則表達式,見下,
urls.py,
# 使用正則表達式 url(r'^detail/(\d+)/' ,views.detail)
views.py,
# 如果urls.py里的url是兩個值,比如/detail/123/那么對應的函數必須接收兩個參數,如下,一個request,一個nid,不然會報錯。 def detail(request,nid): print(nid) return render(request,'back.html')
根據取到的這個nid,就可以去數據庫里取數據了,比如第一頁取前十條數據,第二頁取11條-20條數據。
1.3 url設置關鍵參數
urls.py,
urlpatterns = [ #url(r'^admin/', admin.site.urls), url(r'^index/$', views.index), url(r'^back/$', views.back), url(r'^check/$', views.check), url(r'^detail/(\d+)/' ,views.detail), #設置關鍵參數,“?P<n1>” url(r'^detail1/(?P<n1>\d+)/(?P<n2>\d+)' ,views.detail1), ]
views.py,
#n1、n2是取的關鍵參數 def detail1(request,n1,n2): print(n1,n2) return render(request,'back.html')
2.實現分頁展示和查看詳情
urls.py,
urlpatterns = [ url(r'^pageTest/(\d+)/$', views.pageTest), url(r'^details/(\d+)/$', views.details), ]
views.py,
from django.shortcuts import render from django.shortcuts import redirect from django.shortcuts import HttpResponse from cmdb import models # Create your views here. user_list1 = [] for item in range(99): temp = {'id':str(item),'username':'zsc' + str(item),'email':'email' + str(item)} user_list1.append(temp) def pageTest(request,page): #1,0-9 #2,10-19 #3,20-29 page = int(page) startpoint = (page - 1) * 10 endpoint = page * 10 user_list = user_list1[startpoint:endpoint] return render(request,'page.html',{'user_list':user_list}) def details(request,nid): nid = int(nid) current_details = user_list1[nid] return render(request,'details.html',{'current_details':current_details})
details.html,
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> <li>{{ current_details.id }}</li> <li>{{ current_details.username }}</li> <li>{{ current_details.email }}</li> </ul> </body> </html>
page.html,
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table> <tr> <td>id</td> <td>username</td> <td>details</td> </tr> {% for item in user_list %} <tr> <td> {{ item.id }} </td> <td> {{ item.username }} </td> <td> <a href="/details/{{ item.id }}" target="_blank">see the details</a> </td> </tr> {% endfor %} </table> </body> </html>

3. 路由系統根據app分流
一個項目有很多個app,比如web是主站,manger是后台,那urls.py怎么配置更合理呢?答案是根據app來實現url分流處理,見下以web為例配置的urls.py,
項目里的urls.py,
from django.conf.urls import url,include urlpatterns = [ #以web開頭的所有訪問都拋給web這個app下面的urls.py url(r'^web/',include('web.urls.py')), ]
在web這個app下面新建一個urls.py,
from web import views urlpatterns = [ url(r'^pageTest/(\d+)/$', views.pageTest), url(r'^details/(\d+)/$', views.details), ]
這樣配置好后,比如訪問127.0.0.1:8000/web/pageTest/1,就會將這個url拋給web下面的urls.py里對應的函數處理。
這樣,monitor的url交給monitor處理,manager的url交給manger處理,更清晰。
4.模版語言之基本操作和filter
,如左面兩個圖所示,模板渲染的過程,其實就是把html轉化為python方法的過程,在python方法里新建一個列表,然后把常量值都append進去,遇到變量值的話,再獲取變量值然后append到列表里,最后將這些解析好的代碼拼接成一個html頁面,再return給用戶。
http://www.cnblogs.com/wupeiqi/articles/5237704.html
4.1 基本操作
urls.py,
urlpatterns = [ url(r'^templateTest/$', views.templateTest), ]
templateTest.html,
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>{{ k1 }}</p> <p>{{ k2 }}</p> #根據下標取列表的值時,不能用“[]”,必須用“.” <p>{{ k2.0 }}</p> {% for item in d1 %} # forloop.counter,從1開始依次輸出; # forloop.counter0,從0開始依次輸出; # forloop.first,判斷是否是第一個值,如果是就返回true <p>{{ item }},{{ forloop.counter }},{{ forloop.counter0 }},{{ forloop.first }},{{ forloop.last }},{{ forloop.revcounter }}</p> {% endfor %} {% if k1 == 'v1' %} <h1>v1</h1> {% elif k1 == 'v2' %} <h1>v2</h1> {% else %} <h1>77777</h1> {% endif %} </body> </html>
views.py,
def templateTest(request): return render(request,'templateTest.html',{'k1':'v2','k2':[11,22,33],'d1':{'kk1':'vv1','kk2':'vv2','kk3':'vv3'}})
4.2 模板內置方法
{{ item.event_start|date:"Y-m-d H:i:s"}},將時間格式化輸出
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }},將列表的第一個元素大寫
{{ name|lower }},將name的值小寫。
4.3 模板里自定義filter方法
模板里內置的方法略顯死板,所以還是有必要自己建模板方法的,步驟見下:
1、在app(這里說的app意思是小程序,並不是名字叫app)目錄下新建一個目錄“templatetags”,目錄名必須是這個,定死的;
2、在templatetags目錄下新建一個.py文件,比如說是tempTest.py,內容見下,
#下面兩行是必須導入的 from django import template from django.utils.safestring import mark_safe #這里的register、template.Library()都是固定的,不能改名!!! register = template.Library() #加上下面這個裝飾器后,這個python方法就變成了模板方法。 #這個filter裝飾器最多接收兩個參數,第一個參數必須有,第二個參數可有可無;后面講的simple_tag的裝飾器支持多個參數。 #如果想用filter處理多個參數怎么辦?可以將多個字符串當成一個值傳給函數,然后再做切片處理,如{{ k1 | f1:"zsc,aqq" }} @register.filter() def f1(v1,arg): return v1 + "666" + arg
3、在html中引入模板方法,
{% load tempTest %}
#我們一般在第一行引入模板方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
#調用模板方法並傳參數
{{ k1|f1:"zsc" }}
</body>
</html>
4、使用模板方法
{{ k1|f1 }}
#f1是tempTest.py里的方法
5、在settings中配置當前app,不然django無法找到自定義的simple_tag
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', #此處app的名稱是app01 'app01', )
5. 模版語言之simple_tag
5.1 創建simple_tag模板語言
from django import template from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag def f2(s1,s2,s3,s4): return s1 + s2 + s3 + s4
在html里調用方式: {% f2 "zsc" "1" "anqingqing" "xiaoxixi" %}
5.2 filter和simple_tag對比
filter:
限制參數個數;
支持作為模板語言if判斷的條件,也就是可以用{% if k1|filterfunc %}這種形式,如果funcone返回true,就為真,返回false就為假。
simple_tag:
不限制參數個數;
不支持作為模板語言if判斷的條件,也就是不能用{% if simple_tag_func arg1 %}這種形式,不論simple_tag_func返回true或false都沒作用。
下例為html中的模板語言將filter作為if判斷條件的例子:
testTemp.py: from django import template from django.utils.safestring import mark_safe register = template.Library() @register.filter def f3(v1): if v1 == 'vvv': return True else: return False templateTest.py: {% if k1|f3 %} <h1>true</h1> {% else %} <h1>false</h1> {% endif %}
6.模版語言之母板
網站后台的格局一般是header、body、footer,body的左邊是menu,右邊是content,一般header和footer都是不變化的,點擊menu里的選項后,比如點擊“用戶管理”,“用戶管理”變成被選中的樣式,同時右邊的content區域出來用戶的管理信息,點擊“服務器管理”,“服務器管理”變成被選中的樣式,同時右邊的content區域出來服務器的管理信息。這其實是在“用戶管理”和“服務器管理”上分別加了不同的url,跳轉到不同的頁面。這時候有個問題,跳轉到不同的url,這倆html頁面的header、footer都是不變化的,那用戶管.html和服務器管理.html都要重新寫一遍header和footer的內容嗎?答案是否定的。這時候就要用到母板,創建一個母板,然后子html頁面引用母板即可,就像導入python模塊似的,見下例,
urls.py,
urlpatterns = [ url(r'^motherModel/$', views.motherModel), url(r'^userinfo/$', views.userinfo), url(r'^serverinfo/$', views.serverinfo), ]
views.py,
def motherModel(request): return render(request,'motherModel.html') def userinfo(request): return render(request, 'userinfo.html', {'user_list': user_list1}) def serverinfo(request): return render(request, 'serverinfo.html')
motherModel.html,
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .page-header{ width:100%; height:100px; background-color:red; } .page-body{ min-height:400px; } .page-footer{ width:100%; height:50px; background-color:green; } .menu{ width:20%; float:left; } .content{ width:80%; float:left; } </style> </head> <body> <div class="page-header"> </div> <div class="page-body"> <div class="menu"> <ul> <li><a href="/userinfo/">userManage</a></li> <li><a href="/serverinfo/">serverManage</a></li> </ul> </div> <div class="content"> #可以定義多個block,content是當前block的名稱 {% block content%}{%endblock%} </div> </div> <div class="page-footer"> </div> </body> </html>
userinfo.html,
#導入母板html {% extends "motherModel.html" %} #這里也要寫上{% block content %},與母板里的block對應 {% block content %} <table> {% for item in user_list %} <li>{{ item.id }},{{ item.username }} ,{{ item.email }}</li> {% endfor %} </table> {% endblock %}
serverinfo.html,
{% extends "motherModel.html" %}
{% block content %}
<table>
i am is a server,hello.
</table>
{% endblock %}
7.模板導入js
在上面的基礎上,加了一個點擊菜單后給菜單添加背景色效果。
templateModel.html,
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .page-header{ width:100%; height:100px; background-color:red; } .page-body{ min-height:400px; } .page-footer{ width:100%; height:50px; background-color:green; } .menu{ width:20%; float:left; } .content{ width:80%; float:left; } .activego{ background-color:green; } </style> </head> <body> <div class="page-header"> </div> <div class="page-body"> <div class="menu"> <ul> <li><a id="userinfo" href="/userinfo/" class="usermanage">userManage</a></li> <li><a id="serverinfo" href="/serverinfo/">serverManage</a></li> </ul> </div> <div class="content"> {% block content %}{% endblock %} </div> </div> <div class="page-footer"> </div> #此處導入一個js,使左側菜單點擊后添加背景 {% block js %} {% endblock %} </body> </html>
userinfo.html,
{% extends "motherModel.html" %}
{% block content %}
<table>
{% for item in user_list %}
<li>{{ item.id }},{{ item.username }} ,{{ item.email }}</li>
{% endfor %}
</table>
{% endblock %}
{% block js %}
<script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
<script>
$("#userinfo").addClass("activego")
</script>
{% endblock %}
serverinfo.html,
{% extends "motherModel.html" %}
{% block content %}
<table>
i am is a server,hello.
</table>
{% endblock %}
{% block js %}
<script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
<script>
$("#serverinfo").addClass("activego")
</script>
{% endblock %}
8.include小組件
html頁面有很多輸入框、展示框,可以用引入的方式避免代碼重復編寫,見下,
<body>
<form>
<input />
<input />
<input />
</form>
</body>
等同於下面,
<body>
{% include 'x.html' %}
{% include 'x.html' %}
{% include 'x.html' %}
</body>
x.html,
<form>
<input />
<input />
<input />
</form>
9.Ajax使用(一)
網站的注冊登陸、網頁版微信QQ,以及幾乎所有的網站都在使用ajax,因為它可以做到不刷新頁面就把數據提交到后台,讓用戶無感知。試想,如果網頁版QQ,每發送一條信息都刷新一次網頁,那閃瞎了該。
正因為ajax的廣泛使用及重要,所以有必要詳細了解一下它。
這里我們會基於jquery來使用ajax,因為jquery支持ajax支持的非常好。

ajax示例,
urls.py,
url(r'^ajaxTest/$', views.ajaxTest),
ajaxTest.html,
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <input type="text" value="username" id="username" name="username"/> </div> <div> <input type="password" value="password" id="password" name="password"/> </div> <div> <input type="button" value="submit" id="submit" onclick="submitClick();" /> </div> <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script> <script> function submitClick(){ $.ajax({ #form里的action的鏈接可以不帶“/”,但是ajax里的url參數必須帶“/” url: "/ajaxTest/", type: "POST", #將數據傳給上面的url data:{'username':$('#username').val(),'password':$('#password').val()}, #data是上面的url的返回值 success:function(data){ if(data == '1') { location.href = 'http://www.baidu.com'; }else{ alert('false'); } } } ) } </script> </body> </html>
9.Ajax使用(二)
上面是根據返回的數值來判斷是否合法,如果返回1就合法,返回2就不合法。事實上前端開發和后端開發是分開的,也就是事先必須約定好,到底1是合適,還是2是合法,還是0是合法,所以如果前端人員想改規則,則必須告訴后端人員,雙方都需要改代碼,所以最好是用json來通信,見下面代碼,后端給前端返回一個包含狀態和報錯信息和的字典,然后前端取到狀態,根據狀態來決定做什么,
ajaxTest.html,
<script> function submitClick(){ $.ajax({ url: "/ajaxTest/", type: "POST", data:{'username':$('#username').val(),'password':$('#password').val()}, success:function(data){ #將收到的序列化字符串,反序列化成字典 var data = JSON.parse(data) if(data.status) { location.href = 'http://www.baidu.com'; }else{ alert(data.message); } } } ) } </script>
views.py,
import json def ajaxTest(request): if request.method == 'POST': ret = {'status':False,'message':''} username = request.POST.get("username",None) password = request.POST.get("password",None) if username=='111' and password=='222': ret['status'] = True return HttpResponse(json.dumps(ret)) else: ret['message'] = 'invalid username or password.' return HttpResponse(json.dumps(ret)) return render(request,'ajaxTest.html')
10. ajax進階
jquery沒有ajax功能,瀏覽器有一個模塊是來實現ajax功能的,jquery是調用瀏覽器的這個模塊,實現了ajax功能。瀏覽器包含一個XMLHttpRequest對象,正是用這個對象實現的ajax功能,jQuery通過調用XMLHttpRequest對象,封裝了一些功能,讓用戶能簡單的使用ajax。
如果是跨域名提交ajax請求,瀏覽器會做攔截,自己的瀏覽器能發到對端的瀏覽器,對端的瀏覽器也能返回數據,但是返回來的數據會被自己的瀏覽器攔截。解決辦法有兩個:jsonp和修改瀏覽器設置,遇到了再說吧。
11. Models創建數據庫表
from django.db import models class userinfo(models.Model): name = models.CharField(max_length=30) email = models.EmailField() memo = models.TextField()
上面這個類就創建一個數據庫表userinfo,name字段的數據類型是CharField,可以存儲string類型數據;memo字段的數據類型是TextField;email字段的類型寫的是EmailField,對數據庫而言,沒有EmailField這個數據類型,它也是存儲string類型的數據,那為什么這里定義成EmailField呢,因為結合別的模塊使用時會有特殊功能,比如結合admin.py(admin.py自帶驗證功能)來用,如果是EmailField類型的,admin.py會自動檢測用戶輸入的內容是否符合郵箱格式。
11.1 更多字段
1、models.AutoField(primary_key=True) 自增列 = int(11) 每個表默認會帶一個自增id的字段,如果要顯示的控制自增id字段,可以這樣, class userinfo(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=30) 2、models.CharField 字符串字段 必須指定max_length 參數 3、models.BooleanField 布爾類型=tinyint(1) 不能為空,Blank=True 4、models.ComaSeparatedIntegerField 用逗號分割的數字=varchar 繼承CharField,所以必須指定max_lenght 參數。 這個字段跟EmialField類似,對數據庫而言就是一個存儲string的字段而已,只是他要求用戶輸入的內容必須是以逗號分隔的數字,見下, 11,223,32322。這樣的數字是合法的,不然會提示不合法。 5、models.DateField 日期類型 date 對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次創建添加,之后的更新不再改變。 6、models.DateTimeField 日期類型 datetime 同DateField的參數 7、models.Decimal 十進制小數類型 = decimal 必須指定整數位max_digits和小數位decimal_places 8、models.EmailField 字符串類型(正則表達式郵箱) =varchar 對字符串進行正則表達式 9、models.FloatField 浮點類型 = double 10、models.IntegerField 整形 11、models.BigIntegerField 長整形 integer_field_ranges = { 'SmallIntegerField': (-32768, 32767), 'IntegerField': (-2147483648, 2147483647), 'BigIntegerField': (-9223372036854775808, 9223372036854775807), 'PositiveSmallIntegerField': (0, 32767), 'PositiveIntegerField': (0, 2147483647), } 12、models.IPAddressField 字符串類型(ip4正則表達式);這個可能快過期了,在django1.10之后可能就不能用了,用下面的GenericIPAddressField代替。 13、models.GenericIPAddressField 字符串類型(ip4和ip6是可選的) 參數protocol可以是:both、ipv4、ipv6 驗證時,會根據設置報錯 14、models.NullBooleanField 允許為空的布爾類型 15、models.PositiveIntegerFiel 正Integer 16、models.PositiveSmallIntegerField 正smallInteger 17、models.SlugField 減號、下划線、字母、數字 18、models.SmallIntegerField 數字 數據庫中的字段有:tinyint、smallint、int、bigint 19、models.TextField 字符串=longtext 20、models.TimeField 時間 HH:MM[:ss[.uuuuuu]] 21、models.URLField 字符串,地址正則表達式;對數據庫而言就是string,帶有URL驗證的功能。 22、models.BinaryField 二進制 23、models.ImageField 圖片;對數據庫而言就是個存儲string的字段,對amdin.py而言,會生成一個帶上傳功能的框,默認上傳到項目的根目錄。 24、models.FilePathField 文件;對數據庫而言就是個存儲string的字段,對amdin.py而言,會生成一個帶上傳功能的框
11.2 創建表(一對多)並啟用admin.py
admin.py提供了很強大的后台管理功能,下面簡單說一下,就能看出來它的方便和強大之處了。
urls.py,
url(r'^admin/', admin.site.urls),
models.py,
class UserType(models.Model): name = models.CharField(max_length=32) #這個方法是為了讓admin頁面顯示出name的真實值,默認是顯示object.name def __str__(self): return self.name class UserInfo(models.Model): user = models.CharField(max_length=32) passwd = models.CharField(max_length=32) #由於email和memo和user_type都是新加的字段,也就是說本來有user和passwd字段,只有這倆字段的時候做過一次python manage.py makemigrations,新增了字段再python manage.py makemigrations,就會提示一些東西,所以必須給新增的字段加上null=True,表示數據庫允許該字段為空。 email = models.EmailField(null=True) memo = models.TextField(null=True) # img = models.ImageField() #設置外鍵;blank=True是允許admin頁面該項為空。 user_type = models.ForeignKey("UserType",null=True,blank=True) def __str__(self): return self.user
admin.py,
from django.contrib import admin # Register your models here. from cmdb import models #將表注冊到admin admin.site.register(models.UserInfo) admin.site.register(models.UserType)
更新數據表和創建超級用戶,
python manage.py makemigrations python manage.py migrate #這個只需要執行一次,創建的是登錄admin頁面的管理員用戶 python manage.py createsuperuser
userinfos 和user types就是我們創建的表,點擊add就能添加了。
11.3 創建表的多對多關系
方法一:
class Boy(models.Model): name = models.CharField(max_length=32) class Girl(models.Model): name = models.CharField(max_length=32) #加上這個后,就創建了Boy和Girl表的多對多關系。存儲多對多關系的這個表是不可見的,名稱就是Boy_Girl f = model.ManyToManyField(Boy)
方法二:
#主動創建一個表來存儲多對多關系 class B2G(models.Model): boy = models.ForeignKey('Boy') girl = models.ForeignKey('Girl') class Boy(models.Model): name = models.CharField(max_length=32) class Girl(models.Model): name = models.CharField(max_length=32) f = model.ManyToManyField(Boy)
11.4 創建一對一關系表
比如一個用戶表,一個用戶類型表,如果用戶表里的user_type值設置為unique,那其實就實現了一對一的關系,比如用戶張三的用戶類型是超級用戶,則不能再插入一個普通用戶的張三。
user_type = models.OneToOneField("UserType",null=True,blank=True)
11.5 更多參數
1、null=True,數據庫中字段是否可以為空 2、blank=True,django的Admin中添加數據時是否可允許空值 3、primary_key=Flase,主鍵,對AutoField設置主鍵后,就會代替原來的自增id列 4、auto_now=True,自動創建-----無論添加或修改,都是當前操作的時間;auto_now_add=True,自動創建-----永遠是創建時得時間。 5、chocies GENDER_CHOICE = { (0,'Male'), (1,'Female'), } gender = models.CharField(max_length=2,choices=GENDER_CHOICE,defalut=1) 用戶在頁面上看到的性別是Male和Female,真是存儲到數據庫里的數據是0和1,這樣就省去了性別和數字的聯表操作。 6、max_length 7、defalut 默認值 8、verbose_name Admin頁面中字段的顯示名稱,比如name = CharField(max_length=32,verbose_name="用戶名"),那admin頁面就會顯示用戶名,而不是顯示name。 9、db_column,數據庫中的列名;name = CharField(max_length=32)這一列的列名默認是name,如果name = CharField(max_length=32,db_column='n'),那么name這一列的列名就是n了。 10、unique=True,不允許重復 11、db_index=True,數據庫索引 12、editable=True,在Admin里是否可以編輯;如果設置為False,則這一項直接在admin頁面上不顯示了,還編輯個毛。 13、error_messages=None,指定顯示的錯誤信息,比如“用戶名不能為空”。 14、auto_created=False,自動創建 15、help_text,在Admin中添加幫助信息 16、validators=[],可以在里面放函數,比如放一個校驗是否是合法手機號的函數,然后用戶輸入的內容就會根據這個函數去校驗。 17、upload_to,設置上傳目錄。img = models.ImageField(upload_to="upload")
12.Model之基本數據操作
利用雙下划線將字段和對應的操作連接起來
# 獲取個數 # # models.Tb1.objects.filter(name='seven').count() # 大於,小於 # # models.Tb1.objects.filter(id__gt=1) # 獲取id大於1的值 # models.Tb1.objects.filter(id__lt=10) # 獲取id小於10的值 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id大於1 且 小於10的值 # in # # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 獲取id等於11、22、33的數據 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in # contains,這個就等同於mysql里的like,模糊查詢 # # models.Tb1.objects.filter(name__contains="ven") # models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感 # models.Tb1.objects.exclude(name__icontains="ven") # range # # models.Tb1.objects.filter(id__range=[1, 2]) # 范圍bettwen and # 其他類似 # # startswith,istartswith, endswith, iendswith, # order by # # models.Tb1.objects.filter(name='seven').order_by('id') # asc # models.Tb1.objects.filter(name='seven').order_by('-id') # desc # limit 、offset # # models.Tb1.objects.all()[10:20] #這就可以實現分頁查詢了。 # group by from django.db.models import Count, Min, Max, Sum # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) #以values里的值進行groupby # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id" #如果想知道django里的數據庫操作語句對應的mysql語句是什么,可以通過下面的方法。 obj = models.Tb1.objects.filter(name='seven').count() print(obj.query)
13.用ajax實現刪除條目和編輯條目
用ajax刪除條目,后台數據庫刪除了數據,但是前端依然顯示這一條記錄,兩個解決辦法:
1.點了刪除后強制讓頁面刷新;
2.點刪除后,將這個條目的div移除($().remove()),然后替換成一個“刪除成功”的div。
編輯條目:
1.點編輯后跳轉到新的url;
2.點編輯后彈出編輯框。
