Django后臺項目之用戶管理功能開發流程

項目功能開發流程

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博客共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455627.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455627.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455627.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

套接字 資料查閱

(3)套接字(socket) 一個完整的網絡應用程序包括客戶端和服務器兩個部分。網間通信進程需要由兩個進程組成&#xff0c;并且只能用同一種協議。也就是說&#xff0c;不能在通信的一端使用TCP協議&#xff0c;而另一端則用UDP協議。一個完整的網絡通信需要一個五元組來標識…

linux mysql安裝_Linux下安裝mysql服務(超詳細)

Mysql數據庫的安裝對于開發者來說&#xff0c;是我們必然會面對的問題&#xff0c;它的安裝過程其實并不復雜&#xff0c;并且網絡上的安裝教程也非常多&#xff0c;但是對于新手來說&#xff0c;各種不同形式的安裝教程&#xff0c;又給新手們帶來了要選擇哪種方式進行安裝的難…

dash 和 bash 切換

#先看看是用的哪個 shellls -al /bin/sh #如果是dash&#xff0c;切換到bashsudo ln -fs /bin/bash /bin/sh轉載于:https://www.cnblogs.com/abolide/p/6874265.html

Django中使用ajax技術概述

ajax 1.什么是ajax ajax就是在不刷新整個頁面的情況下&#xff0c;去更新局部頁面的內容&#xff08;無刷新技術&#xff09; 2.ajax有什么優點 最大的一點是頁面無刷新&#xff0c;在頁面內與服務器通信&#xff0c;給用戶的體驗非常好。 使用異步方式與服務器通信&#x…

IE、FF腳本兼容性問題

1.window.event IE有這個對象&#xff1b;FF沒有&#xff0c;FF通過參數傳遞 2.獲取事件源 IE&#xff1a;srcElement FF&#xff1a;target 3.添加與去除事件 IE&#xff1a;element.attachEvent("onclick", function(){}) element.detachEvent("onclick"…

ARM MOV和 LDR指令關系

ARM是RISC結構&#xff0c;數據從內存到CPU之間的移動只能通過L/S指令來完成&#xff0c;也就是ldr/str指令。比如想把數據從內存中某處讀取到寄存器中&#xff0c;只能使用ldr比如&#xff1a;ldr r0, 0x12345678就是把0x12345678這個地址中的值存放到r0中。而mov不能干這個活…

day2 操作系統

一.為何要有操作系統 程序員無法把所有的硬件操作細節都了解到&#xff0c;管理這些硬件并且加以優化使用是非常繁瑣的工作&#xff0c;這個繁瑣的工作就是操作系統來干的&#xff0c;有了他&#xff0c;程序員就從這些繁瑣的工作中解脫了出來&#xff0c;只需要考慮自己的應用…

Django之model模型

模型 1.如何安裝pymysql 1.file->settings->Project Interpreter 2.點擊右邊的"" 3.搜索pymysql 4.點擊最下面的"install package" 5.安裝成功會提示"Package "pymysql" install successfully"2.如何在django中配置mysql 1.在…

python安裝不了jupyter_python學習筆記——Windowns下Python3之安裝jupyter

Windowns下Python3之安裝jupyter Jupyter notebook&#xff1a; 一個交互式筆記本&#xff0c;支持運行40多種編程語言。 利用它來寫Python&#xff0c;代碼和運行結果都可以保存下載&#xff0c;十分方便。本文主要以自身的安裝過程為例&#xff0c;結合遇到的問題&#xff0c…

Java文件讀寫操作

http://blog.csdn.net/jiangxinyu/article/details/7885518/ 比較齊全&#xff0c;有多種文件讀寫操作轉載于:https://www.cnblogs.com/maowuyu-xb/p/7238170.html

視頻編碼與封裝方式詳解

1. 編碼方式和封裝格式... 1 2. 視頻編碼標準兩大系統... 2 MPEG-1. 2 MPEG-2. 3 MPEG-3. 3 MPEG-4. 3 ITU-T. 4 WMV. 4 3. 常用視頻編碼方式有Xvid( 4 4. 常見存儲封裝格式... 6 5. 幾種常見的轉換格式設置... 7 6. 無損視頻編碼... 9 1. 編碼方式和封裝格式常見…

Binder

問&#xff1a;為什么Android要采用Binder作為IPC機制 答案來自百度知道&#xff1a; &#xff08;1&#xff09;從性能的角度數據拷貝次數&#xff1a;Binder數據拷貝只需要一次&#xff0c;而管道、消息隊列、Socket都需要2次&#xff0c;但共享內存方式一次內存拷貝都不需要…

matlab 三維核密度圖_Matlab精彩畫圖示例:三維網狀圖和三維曲面圖

接上篇&#xff1a;Matlab精彩畫圖示例&#xff1a;繪制圖上圖這篇介紹兩個繪制三維圖的命令&#xff1a;mesh - 繪制三維網狀圖surf - 繪制三維曲面圖matlab代碼如下&#xff1a;繪制三維圖的matlab代碼示例程序運行結果如下&#xff1a;mesh(X,Y,Z) draws a wireframe mesh w…

Django之templates模板

模板的使用 1.如何使用模板 在manage.py的同級文件夾中創建templates在setting.py的文件中把第58行DIRS: [ ],改成DIRS: [os.path.join(BASE_DIR,templates)], 知識點: os.path.join(BASE_DIR,templates) 拼接兩個字符串 BASE_DIR找到項目根目錄127.0.0.1:8000/myadmin/templ…

STL容器刪除元素的陷阱

今天看Scott Meyers大師的stl的用法&#xff0c;看到了我前段時間犯的一個錯誤&#xff0c;發現我寫的代碼和他提到錯誤代碼幾乎一模一樣&#xff0c;有關stl容器刪除元素的問題&#xff0c;錯誤的代碼如下&#xff1a;std::vector<struct> mFriendList;...std::vector&l…

JDBC1

1.jdbc的概述 是sun公司統一提供的一套接口規范,各個數據庫生產商提供實現 注冊驅動,獲得連接,獲得執行的SQL語句對象,釋放資源 package com.learn.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;import org.junit.Test;publ…

無符號哥倫布指數編碼

在H264編解碼中&#xff0c;哥倫布指數編碼是經常用到的&#xff0c;下面是無符號哥倫布指數編碼的C代碼&#xff1a; static inline int bs_read_ue( bs_t *s ){ int i 0; while( bs_read1( s ) 0 && s->p < s->p_end && i < 32 ) { …

django后臺多頁面分頁邏輯python代碼

#!/usr/bin/env python # -*- coding:utf-8 -*- # Created by 秋葉夏風# 本模塊的功能:<>def get_page_list(max_page,curr_page,leng):用于生成頁數列表:param max_page:最大頁數:param curr_page:當前頁數:param leng:分頁步長:return:list# max_page 20# curr_page …

python程序怎么保存到u盤_python實現usb自動拷貝程序的方法

python實現usb自動拷貝程序的方法 發布時間&#xff1a;2020-06-28 09:07:05 來源&#xff1a;億速云 閱讀&#xff1a;135 作者&#xff1a;清晨 這篇文章將為大家詳細講解有關python實現usb自動拷貝程序的方法&#xff0c;小編覺得挺實用的&#xff0c;因此分享給大家做個參考…

young people can also be a leader

2019獨角獸企業重金招聘Python工程師標準>>> The leaders or directors of organizations are often older people. But some people say that young people can also be a leader. To what extent do you agree or disagree? In my view , young people can also …