django 武沛齊老師-最後一篇隨筆

基礎 https://www.cnblogs.com/wupeiqi/articles/5237704.html

進階 https://www.cnblogs.com/wupeiqi/articles/5246483.html

安裝 pip install django==1.11.14 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com  卸載 pip uninstall django 建立 django 項目 django-admin startproject 項目名 django-admin startproject victory 運行 django 項目 cd victory python manage.py runserver 建立 app python manage.py startapp app名稱 python manage.py startapp app01 urls 文件 urlpatterns = [ ] 對應 url 映射的列表 urlpatterns = [ url(r'^網址名稱/', 包模塊.函數名), url(r'^網址名稱/', 函數名), ] wsgi 一套規則,接口,建立 socket 產品上線不使用默認的 wsgi , 使用 uwsgi + nginx manage.py 管理 django 程序 settings 配置文件 app 註冊 app 名稱.apps.app 名稱Config 或 app 名稱 app01.apps.App01Config 或 app01 templates 模板註冊 'DIRS': [os.path.join(BASE_DIR, 'templates')], 配置靜態文件夾 static 建立 static 靜態文件夾 STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), ) 設置中文 LANGUAGE_CODE = 'zh-hans' 設置時區 TIME_ZONE = 'Asia/Shanghai' 設置數據庫爲 mysql (注:先安裝 mysqlclient, pip install mysqlclient) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '數據庫名稱', 'USER':'用戶名', 'PASSWORD':'密碼', 'HOST':'127.0.0.1', 'PORT':'3306' } } DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'app02', 'USER':'root', 'PASSWORD':'root', 'HOST':'127.0.0.1', 'PORT':'3306' } } ORM 對象關係映射,建立數據庫表不須要使用select , insert 語句了 數據庫遷移 python manage.py makemigrations python manage.py migrate app 目錄 migrations 記錄作過哪些修改數據表結構的操做 __init__ 文件,python3 能夠刪除,python2 不能夠刪除 python2 默認 不帶 __init__ 文件爲普通文件夾,導入會報錯 admin 後臺管理 在 admin 中,導入 app 的 models 文件 from app01 import models 將 models 裏面的數據表進行註冊 admin.site.register(models.UserInfo) admin.site.register(models.UserType) 兩張表內容以下 class UserType(models.Model): name = models.CharField(max_length=32) class UserInfo(models.Model): username = models.CharField(max_length=32) pwd = models.CharField(max_length=32) email = models.CharField(max_length=32) user_type = models.ForeignKey('UserType') # 使用 '' 將類名包裹,進行建立外鍵 建立超級用戶 python manage.py createsuperuser 示例: 用戶名 hany 密碼 hany12345. 超級用戶登陸後,能夠對數據表增長數據等操做 apps 配置當前 app models ORM 操做,經過命令建立數據庫表結構 tests 單元測試 views 業務邏輯文件,寫函數 假裝數據庫 項目的 __init__ 文件下 import pymysql pymysql.install_as_MySQLdb() 生命週期 用戶發送請求到路由系統,若是匹配成功,執行相對應的 views 中的函數 到數據庫中取出數據,在模板 html 上進行頁面渲染數據 返回到用戶的瀏覽器上 urls 操做 url(r'^路由映射/', views.函數名), url(r'^register/', views.register), url(r'^路由映射-(?P<形參名>\d+).html', views.函數名), url(r'^detail-(?P<cid>\d+).html', views.detail), url(r'路由映射',include("app名稱.urls")) url(r'app02',include("app02.urls")) 注:include 內參數加引號,urls 須要本身建立 在用戶建立的 urls 中,繼續進行地址映射,寫在 urlpatterns = [ ]中 app 不要忘記在 settings 中進行註冊 models 操做 建立數據表時,繼承 models.Model 示例 class UserInfo(models.Model) 建立字符串類型數據 models.CharField 示例 username = models.CharField(max_length=32) id 主鍵會自動建立,並遞增 使用 AutoField,而且聲明主鍵 primary_key=True 能夠不讓系統建立 id 列 示例 uid = models.AutoField(primary_key=True) 字段參數 null 字段是否爲空 default 默認值 示例 code = models.CharField(max_length=32,null=True,default="SA") primary_key 主鍵 db_column 列名 db_index 索引 , unique 惟一索引 unique_for_date 對日期作索引,unique_for_month 對月作索引, unique_for_year 對年作索引 auto_now=True 建立時生成時間 示例 ctime = models.DateField(auto_now=True,null=True) auto_now_add=True 修改時自動更新時間 choice 選項 示例 , choices 爲 一個嵌套的元組對象 user_type_choices = ( (1,'super man'), (2,'common man'), (3,'man'), ) user_type_id = models.IntegerField(choices=user_type_choices,default=2) verbose_name 備註字段 editable 字段是否能夠被編輯 help_text 字段輸入提示 validators 自定義錯誤信息 to_field 與哪一列進行關聯 建立整數類型數據 models.IntegerField 示例 user_type_id = models.IntegerField(choices=user_type_choices,default=2) 外鍵關聯 models.ForeignKey 示例 第一個參數爲類名,uid 爲關聯的字段 usergroup = models.ForeignKey('UserGroup',to_field='uid') 會自動生成 usergroup_id 列,usergroup 爲對象,可使用 usergroup.uid 進行獲取外聯表的數據 建立 ip 示例 , protocol默認爲 'both' ip = models.GenericIPAddressField(protocol="ipv4",db_index=True) 多對多 , 不能加額外字段列 models.ManyToManyField('類名') 一對多,多對多示例 class Business(models.Model): caption = models.CharField(max_length=32) code = models.CharField(max_length=32,null=True,default="SA") class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = models.CharField(max_length=32,db_index=True) ip = models.GenericIPAddressField(protocol="ipv4",db_index=True) port = models.IntegerField() b = models.ForeignKey(to="Business", to_field='id') class Application(models.Model): name = models.CharField(max_length=32) r = models.ManyToManyField("Host") 注:會自動建立一個新的表,內部爲其餘表的 id 主鍵 obj = Application.objects.get(id=1) 增長數據 obj.r.add(1) obj.r.add(1,2,3) obj.r.add(*[1,2,3]) 刪除數據 obj.r.remove(2,4,5) obj.r.clear() 更新數據 obj.r.set([3,5,7]) 多對多 , 自定義建立第三張表 , 能夠本身定義第三張表的字段 示例 class HostApp(models.Model): hobj = models.ForeignKey(to='Host',to_field='nid') aobj = models.ForeignKey(to='Application',to_field='id') status = models.CharField(max_length=32) 增長數據 HostApp.objects.create(hobj_id='xxx',aobj='xxx',status='xxx') html 操做 導入 jquery <script src="/static/jquery.min.js"></script> 導入靜態文件 <link rel="stylesheet" href="/static/commons.css"> 使用 {{ 變量名 }} 進行顯示變量 <span style="color: red;">{{ error_msg }}</span> for 循環 {% for 對象 in 傳遞過來字典的鍵 %} <ul> <li> {{ 對象 }} </li> </ul> {% endfor %} 遍歷字典中的鍵 {% for num in user_num.keys %} <ul> <li> {{ num }} </li> </ul> {% endfor %} 遍歷字典中的值 {% for num in user_num.values %} <ul> <li> {{ num }} </li> </ul> {% endfor %} 遍歷字典的全部元素 {% for key,value in user_num.items %} <ul> <li> {{ key }} - {{ value }}</li> </ul> {% endfor %} 遍歷列表 {% for name in user_list %} <ul> <li> {{ name }} </li> </ul> {% endfor %} 取索引對象 第一個元素 對象.0 {{ user_list.0 }} 對應索引元素名 對象.元素名 {{ user_num.zero }} if 語句 {% if 條件%} 語句 {% else %} 語句 {% endif %} {% if 條件 %} 語句 {% elif 條件 %} 語句 {% else %} 語句 {% endif %} 跳轉連接 href <a href="app名稱/路由">內容</a> 示例 , 跳轉到 app02 下的 student 中 <a class="menu" href="/app02/student">學生管理</a> 循環計數 forloop 從 1 開始 {{ forloop.counter }} 從 0 開始 {{ forloop.counter0 }} 是不是第一個 , 返回 True 或 False {{ forloop.first }} 是不是最後一個 , 返回 True 或 False {{ forloop.last }} 倒序到 1 爲止 {{ forloop.revcounter }} 倒序到 0 爲止 {{ forloop.revcounter0 }} 上一層循環 {{ forloop.parentloop }} ajax $.ajax({ url:"路由地址", type:"GET 或 POST 請求方式", data:數據, data: $('#select 標籤的 id 值').serialize(), 獲取序列化數據 dataType:'數據類型' success: function(data){ 對獲取到的數據 data 要進行的操做 JSON.parse(data) 對返回的字符串轉換爲對象 location.reload(), 刷新 location.href = '某個地址' , 跳轉 } } views 操做 形參可使用 request , *args , **kwargs request.method 提交方式 GET , POST 以及其餘方式 request.environ 獲取全部的請求信息 獲取 cookies request.COOKIES 獲取用戶輸入的值 request.POST['html 中的name 屬性的值'] request.POST.get('html 中的name 屬性的值',None) password = request.POST.get('password',None) request.POST.getlist('html 中的name 屬性的值') request.POST.getlist('favor') 返回頁面上顯示的字符串 return HttpResponse('<標籤名>字符串</標籤名>') return HttpResponse('<h2>Hello</h2>') 頁面跳轉 return redirect('網址') return redirect('/home/') 注: home 前面的 / 爲 ip : 端口號/ 頁面渲染 return render(request,'html文件名.html'[,變量]) return render(request,'login.html') return render(request,'login.html',{'error_msg':error_msg}) 注: 字典的鍵爲在 html 中使用的變量名稱 數據庫增刪改查 字段值大於 1 的 models.類名.objects.filter(字段__gt=1) 字段值大於等於 1 的 models.類名.objects.filter(字段__gte=1) 字段值等於 1 的 models.類名.objects.filter(字段=1) 字段值小於 1 的 models.類名.objects.filter(字段__lt=1) 字段值小於等於 1 的 models.類名.objects.filter(字段__lte=1) 獲取指定字段的值 models.類名.objects.all().values('字段1','字段2') 注:返回的是 QuerySet 類型,內部爲字典對象 models.類名.objects.all().values_list('字段1','字段2') 注:返回的是 QuerySet 類型,內部爲元組對象 示例 models.UserInfo.objects.all().values('username', 'password') 獲取文件 注: 在文件上傳時,在 form 表單中加入 enctype="multipart/form-data" 表示上傳的是文件 上傳的文件到 request.FILES 中進行查找 file = request.FILES.get('html 中的name 屬性的值') file.chunks() 一個可迭代對象,包含有上傳的文件 file.name 文件名 file.size 文件大小 獲取上傳文件示例(fff 爲 name 的值,upload爲在項目根路徑下建立的文件夾): file = request.FILES.get('fff') import os file_location = os.path.join('upload',file.name) f = open(file_location,mode = 'wb') for i in file.chunks(): f.write(i) f.close() 根據用戶點擊的不一樣,生成不一樣的詳細信息 示例: views 中: user_info = { '1':['xiaoming','nv','21'], '2':['xiaolang','nan','22'], '3':['xiaomi','nv','23'], '4':['xiaole','nan','24'], } def index(request): return render(request,'index.html',{'user_info':user_info}) def detail(request,cid): detail_info = user_info[cid] return render(request,'detail.html',{'detail_info':detail_info}) urls 中 url(r'^detail-(?P<cid>\d+).html',views.detail), 在括號中寫入 ?P<cid> 表示傳遞給形參 cid html index 中 {% for user_key in user_info.keys %} <a href="/detail-{{ user_key }}.html">{{ user_key }}</a><br/> {% endfor %} detail 中 <h2>詳細信息</h2> <div style="margin: auto;color: burlywood"> 用戶名:{{ detail_info.0 }}<br/> 性別:{{ detail_info.1 }}<br/> 年齡:{{ detail_info.2 }}<br/> </div> 獲取當前 url request.path_info 增長數據 第一種 models.類名.objects.create( 字段1=值1, 字段2=值2, ... ) 示例 models.UserInfo.objects.create( username='www', password='111' ) 第二種 obj = models.類名(字段1=值1,字段2=值2) obj.save() 示例 obj = models.UserInfo(username='two',password='...') obj.save() 查詢數據 查詢所有數據 models.類名.objects.all() 示例 username 爲字段名 all = models.UserInfo.objects.all() for user in all: print(user.username,user.password) 查詢指定某一行數據 models.類名.objects.filter(字段1=值1[,字段2=值2]) 示例,對查詢到數據能夠進行循環輸出數據 result = models.UserInfo.objects.filter(username='hany') for user in result: print(user.username,user.password) 示例 , 獲取外鍵所在表的數據 , 外鍵名爲 b 經過.進行獲取數據,b_id 爲在表中的字段 v1 = models.Host.objects.filter(nid=1).first() print(v1.nid,v1.hostname,v1.ip,v1.port,v1.b_id) print(v1.b.id,v1.b.caption) 注:若是報錯,能夠考慮使用 __ 進行查詢 b__caption v2 = models.Host.objects.filter(nid=1) print(v2.values('b__caption')) 刪除數據 刪除所有數據 models.類名.objects.all().delete() 示例 models.UserInfo.objects.all().delete() 刪除一條數據 models.類名.objects.filter(條件).delete() 示例 models.UserInfo.objects.filter(username='www').delete() 更新數據 更新所有數據 models.類名.objects.all().update(字段=值) 示例 models.UserInfo.objects.all().update(password='666') 更新一條數據 models.類名.objects.filter(條件).update(字段=值) 示例 models.UserInfo.objects.filter(id=1).update(password='111') filter 後能夠跟 count() 獲取數據個數 示例 , 當不存在對應數據時,obj_count 爲 0 obj_count = models.UserInfo.objects.filter(username=username,password=password).count() print(obj_count) first() 獲取第一條數據 示例 , 使用了 first 以後,可使用對象直接輸出字段值 obj = models.UserInfo.objects.filter(username=username,password=password).first() print(obj.username) 登陸示例 , 沒有獲取到數據爲 None if not obj: error_msg = 'name or password is error ' return render(request,'登陸.html',{'error_msg':error_msg}) else: return render(request, '主頁.html') 問題 SyntaxError: Generator expression must be parenthesized (widgets.py, line 152) 問題 去掉最後面的 , 號 跨站請求僞造 Forbidden (403) CSRF verification failed. Request aborted. 找到 settings 中的 MIDDLEWARE 將 csrf 註釋掉 You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. 模板中提交的 action 數據要和 urls 的 urlpatterns 的 網址名稱同樣,要麼都帶 / , 要麼都不帶 /

2020-08-17css

相關文章
相關標籤/搜索