項目功能開發流程
1 先寫列表頁(加載出來數據就行)
ob = User_vip.objects.filter(is_del='004001').order_by('-cts')
2 寫添加功能
2.1 創建addOrDoadd視圖方法
2.2 添加訪問addOrDoadd的路由
2.3 在index.html頁面吧添加的按鈕的鏈接不全
<a style="color:#fff;" href="{% url 'myadmin/user/add' %}"><span class="am-icon-plus"></span>新增
</a>
2.4 構建視圖邏輯
2.4.1 判斷請求方法
如果是get就加載模板,如果是post就處理邏輯
2.4.2 處理邏輯
- 接受參數
(data = request.POST.dict())
- 刪除
csrf(data.pop('csrfmiddlewaretoken'))
- 驗證所有信息是否添加規范
- 驗證添加的信息是否重復
- 拋異常,調用模型執行添加操作
- 保存操作
- 返回提示信息
3 寫修改功能
3.1.創建editOrDoedit的視圖函數
3.2 在子路由中添加訪問editOrDoedit的路徑
3.3 在index.html中修改的鏈接不全
3.4 把add.html復制一份名稱修改成edit.html
3.5 構建視圖邏輯
3.5.1 判斷請求方法
- 如果為get就加載模板
- 如果為post就處理數據
- 根據傳過來id查詢信息
- 發送至模板,展示在html的表單中
3.5.2 處理邏輯
- 接收參數
- 接受id
- 刪除csrf
- 驗證所有信息
- 驗證修改是否重復(注意:要去除自身)
num = User_vip.objects.filter(nick_name=data['nick_name'],\
is_del="004001").exclude(id=data['uid']).count()
- 構建修改數據
- 拋異常,實例化對象
- 保存操作
- 返回提示信息
4 寫刪除
4.1 修改index.html的刪除按鈕的路徑
4.2 創建user_del的視圖函數
4.3 創建可以訪問user_del的路徑
4.4 構建視圖函數的邏輯
- 接受參數
- 構建修改數據
- 拋異常,實例化對象
- 保存操作
- 返回提示信息
5 完善index.html當中表格中的select修改狀態(使用ajax技術)
5.1 給select添加class=“sel_status"和uid=”{{ v.id }}"
5.2 在本頁面代碼的最后一個{% endblock %}之前構建js程序
<script></script>
5.3 在script標簽中構建select的change(下拉框改變事件)事件,并且獲取到狀態的值和
id{$(.sel_status).change(function(){// 獲取狀態的值var status = $(this).val() // 獲取idvar uid = $(this).attr('uid')})
}
5.4 在change事件中構建ajax請求
// 構建ajax$.get('{% url 'myadmin/user/edit_status' %}',{'uid':uid,'status':status},function(data){},'json')1
5.5 構建視圖函數邏輯
- 引入JsonResponse方法
- 接受ajax傳過來的參數
- 實例化對象
- 構建修改數據
- 拋異常,保存操作
- 返回提示信息
return JsonResponse({'msg':'修改成功!'})
5.6 在第4步中的ajax請求的function函數中彈出返回的信息
alert(data.msg)
6 完善index.html中的組合搜索
6.1 修改select和input提交的名稱
<select data-am-selected="{btnSize: 'sm'}" style="display: none;" name="type">
<input type="text" class="am-form-field " placeholder="可以組合搜索" name="keywords">
- 把button按鈕中的
type="button"
刪掉 - 在第1步,和第2步的最外面添加form表單,并且提交地址為myadmin/user/list
<form action="{% url 'myadmin/user/list' %}"></form>
6.2 在index的視圖函數(整個開發步驟的第一步)中完善邏輯
# 接受查詢的參數user_type = request.GET.get('type',None)keywords = request.GET.get('keywords',None)# 導入Q方法from django.db.models import Qif user_type:if user_type == 'all':if keywords:# SELECT * FROM User_vip WHERE LIKE (nick_name '%keywords%',age '%keywords%')ob = ob.filter(Q(nick_name__contains=keywords)|Q(age__contains=keywords)|Q(sex__contains=keywords)|Q(email__contains=keywords)|Q(phone__contains=keywords)|Q(intergral__contains=keywords)|Q(status__contains=keywords)|Q(price__contains=keywords))else:search = {user_type+'__contains':keywords}ob = ob.filter(**search)
6.3 在本功能的第一步中完善默認值
完善index視圖函數,把type和keywords傳遞到模板中
<select data-am-selected="{btnSize: 'sm'}" style="display: none;" name="type"><option value="all" {% if type == 'all' %}selected{% endif %}>所有類別</option><option value="nick_name" {% if type == 'nick_name' %}selected{% endif %}>昵稱</option><option value="age" {% if type == 'age' %}selected{% endif %}>年齡</option><option value="sex" {% if type == 'sex' %}selected{% endif %}>性別</option><option value="email" {% if type == 'email' %}selected{% endif %}>郵箱</option><option value="phone" {% if type == 'phone' %}selected{% endif %}>電話</option><option value="intergral" {% if type == 'intergral' %}selected{% endif %}>積分</option><option value="status" {% if type == 'status' %}selected{% endif %}>狀態</option><option value="price" {% if type == 'price' %}selected{% endif %}>資產</option>
</select>
<input type="text" class="am-form-field " placeholder="可以組合搜索" name="keywords" {% if keywords %}value="{{ keywords }}"{% endif %}>
注:以上if中間的內容為補全內容
7 完善優化分頁
7.1 在views文件夾的同級目錄中創建templatetags的文件夾(文件夾名稱只能是templatetags)
7.2 在templatetags文件夾中創建pagetag.py
7.3 填寫pagetag.py中的內容
from django import templatefrom django.utils.html import format_htmlregister = template.Library()@register.simple_tag# 定義分頁優化的函數def PageShow(count,request):# count 是總頁數# request 請求對象# count = int(count)# p接收當前的頁碼數p = int(request.GET.get('page',1))# 獲取url中的所有參數data = request.GET.dict()print(count,type(count))args = ''for k,v in data.items():if k != 'page':args += '&'+k+'='+v# 開始start = p-5# 結束end = p+4# 判斷當前頁是否小于5if p <= 5:start = 1end = 10# 判斷當前頁大于總頁數if p > count-5:start = count-5end = count# 判斷總頁數小于10if count < 10:start = 1end = countpageHtml = ''# 首頁pageHtml += '<li><a href="?page=1{args}">首頁</a></li>'.format(args=args)# 上一頁if p>1:pageHtml += '<li><a href="?page={p}{args}">上一頁</a></li>'.format(p=p-1,args=args)for x in range(start,end+1):if p == x:pageHtml += '<li class="am-active"><a href="?page={p}{args}">{p}</a></li>'.format(p=x,args=args)else:pageHtml += '<li><a href="?page={p}{args}">{p}</a></li>'.format(p=x,args=args)# 下一頁if p<count:pageHtml += '<li><a href="?page={p}{args}">下一頁</a></li>'.format(p=p+1,args=args)# 尾頁pageHtml += '<li><a href="?page={p}{args}">尾頁</a></li>'.format(p=count,args=args)return format_html(pageHtml)
7.4 在index的視圖函數(整個開發步驟的第一步)中完善邏輯
# 導入分頁類from django.core.paginator import Paginator# 實例化分頁類p = Paginator(ob,5)# 獲取當前的頁碼數pageindex = request.GET.get('page',1)# 獲取當前頁的數據userlist = p.page(pageindex)# 獲取所有頁碼# pages = p.page_range# 獲取總頁數pages = p.num_pages
7.5 把第4步pages傳遞到模板中
7.6 修改index.html頁面中的分頁內容
{% load pagetag %}{% PageShow page request %}
作者:秋葉夏風
出處:https://blog.csdn.net/qq_40223983
本文版權歸作者和CSDN博客共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接!