在 app5.models.py 中添加一個 Order 表 class Order(models.Model): o_num = models.CharField(max_length= 16 ,unique=True) # 建立一個訂單號,設置爲 惟一 o_time = models.DateTimeField(auto_now_add=True) # 建立一個時間,當對象進行保存時便可生成訂單時間 注: auto_now_add 當進行 save() 保存時,就會自動進行設置時間
產生遷移 -> 進行遷移
插入數據 以下所示
修改後的數據
在 urls 中添加獲取訂單的函數 getorders urlpatterns = [ url(r'getuser/',views.get_user), url(r'getusers/',views.get_users), url(r'getorders',views.getorders) ]
在 views.py 中添加獲取 2020年 的函數
def getorders(request):
orders = Order.objects.filter(o_time__year= 2020)
context = {
'orders':orders
}
return render(request,'orders.html',context = context)
在 templates 的 orders.html 中 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for order in orders %} <li>{{ order.o_num }}</li> {% endfor %} </ul> </body> </html>
獲取 9 月的信息 項目根目錄的 settings.py 中的 USE_TZ = False 提早設置好 def getorders(request): orders = Order.objects.filter(o_time__month = 9) context = { 'orders':orders } return render(request,'orders.html',context = context)
Django學習路16_獲取學生所在的班級名
在 urls.py 中先導入getgrades from django.conf.urls import url from app5 import views urlpatterns = [ url(r'getuser/',views.get_user), url(r'getusers/',views.get_users), url(r'getorder',views.getorders), url(r'getgrades',views.getgrades), ]
在 views.py 中編寫 getgrades 函數 def getgrades(request): grades = Grade.objects.filter(student__s_name='qq') # 班級裏包含名字爲 qq 的 for grade in grades: print(grade.g_name) return HttpResponse("獲取成功")
此前的準備工做:建立數據庫表 class Grade(models.Model): g_name = models.CharField(max_length=16) class Student(models.Model): s_name = models.CharField(max_length= 16) s_grade = models.ForeignKey(Grade,on_delete=True) # 設置班級外鍵
Django學習路17_聚合函數(Avg平均值,Count數量,Max最大,Min最小,Sum
使用方法: 類名.objects.aggregate(聚合函數名('表的列名')) 聚合函數名: Avg 平均值 Count數量 Max 最大 Min 最小 Sum 求和 示例: Student.objects.aggregate(Max('sage'))
建立消費者數據表 Customer class Customer(models.Model): c_name = models.CharField(max_length = 16) # 消費者名字 c_cost = models.IntegerField(default = 10) # 消費的金額
產生遷移文件
python manage.py makemigrations
進行遷移
python manage.py migrate
Max 示例 def getcostmax(request): cost_max = Customer.objects.aggregate(Max("c_cost")) print(cost_max) return HttpResponse("獲取成功")
Min示例
def getcostmin(request): cost_min = Customer.objects.aggregate(Min("c_cost")) print(cost_min) return HttpResponse("獲取成功") 注: 不要忘記在 urls.py 中進行註冊
Sum 示例 def getcostsum(request): cost_sum = Customer.objects.aggregate(Sum("c_cost")) print(cost_sum) return HttpResponse("獲取成功")
Count 示例
def getcustomercount(request): customer_count = Customer.objects.aggregate(Count("c_name")) print(customer_count) return HttpResponse("獲取成功") 注: 此時獲取姓名便可,不用獲取價格
Avg 示例
def getcostavg(request): cost_avg = Customer.objects.aggregate(Avg("c_cost")) print(cost_avg) return HttpResponse("獲取成功")
導入的包 from django.db.models import Max, Min, Sum, Count, Avg from django.http import HttpResponse from django.shortcuts import render # Create your views here. from app5.models import User, Order, Grade, Customer
Django學習路18_F對象和Q對象
F 對象: 可使用模型的 A 屬性和 B 屬性進行比較 寫法: 須要的數據對象 = 數據表(類名).objects.filter(列名__條件=F('列名2')) 需求: 查看男生數量比女生少 的公司名稱 companies = Company.objects.filter(c_boy_num__lt=F('c_girl_num')) F 對象支持算術運算 需求: 查看男生數量比女生少 15個的公司名稱 companies = Company.objects.filter(c_boy_num__lt=F('c_girl_num')-15)
在 models.py 中建立數據表 Company class Company(models.Model): c_name = models.CharField(max_length=16) # 公司名字 c_girl_num = models.IntegerField(max_length=16) # 女生人數 c_boy_num = models.IntegerField(max_length=16) # 男生人數
產生遷移文件
python manage.py makemigrations
進行遷移
python manage.py migrate
在 urls.py 中進行註冊 需求: 查看 女生多於男生的公司名稱 url(r'getgirlgtboy',views.getgirlgtboy)
views.py 中建立 getgirlgtboy 函數 def getgirlgtboy(request): companies = Company.objects.filter(c_girl_num__gt=F('c_boy_num')) for company in companies: # 進行遍歷後查看公司名 print(company.c_name) return HttpResponse("獲取成功") 注: F 導包 導入的是 from django.db.models import F
F 對象使用 算數表達式 def getgirlgtboy(request): companies = Company.objects.filter(c_girl_num__lt=F('c_boy_num')-30) # 查看男生比女生多於 30 的 for company in companies: # 進行遍歷後查看公司名 print(company.c_name) return HttpResponse("獲取成功")
Q 對象 過濾器的方法中的參數 經常使用於 組合條件 表名(models中建立的類) .objects.filter(Q(表中列名__條件=值)) 示例: Student.objects.filter(Q(sage_lt=25)) Q對象支持 | & ~ 年齡大於等於 25 的 分析: 不小於 25 示例: Student.objects.filter(~Q(sage_lt=25)) Q 對象能夠對條件進行封裝 封裝後支持邏輯運算 與 & 或 |非 ~
在 urls.py 中進行註冊 url(r'getgirlandboy',views.getgirlandboy)
在 models.py 中添加 對應的函數 getgirlandboy def getgirlandboy(request): companies = Company.objects.filter(Q(c_boy_num__gt=90) & Q(c_girl_num__gt=80)) # 男生大於 90 且 女生大於 80 的公司名稱 for company in companies: # 進行遍歷後查看公司名 print(company.c_name) return HttpResponse("獲取成功") 注: 且 : Q(條件) & Q(條件) 取反 : ~Q 表示取反 或 : Q(條件) | Q(條件)
Django學習路19_is_delete屬性,重寫類方法,顯性隱性屬性
若是在 建立數據表時,使用了 objects = models.Model() 使隱形屬性變爲了 顯性屬性 則 必需要本身定義一個 繼承了 models.Model 類的類,實現 管理功能 若是一個屬性一直都須要使用 好比 is_delete 屬性,判斷 這條數據是否刪除 is_delete 爲 True 也就是 1 時,則表示刪除了 刪除了就不該該在數據庫表中再次使用了
models.py 中新添加的數據表,及其繼承類 class AnimalManage(models.Manager): # 父類先聲明,繼承的是 models.Manager 類,須要重寫 filter 方法 '''使用繼承,重寫原來類的方法,進行改進函數時,考慮類的繼承''' def get_queryset(self): '''使 filter 自動具備保留 is_delete 爲 0 的功能,is_delete 爲 1 的自動過濾掉''' # return super(AnimalManage,self).get_queryset() # 對父類的方法進行修改,將 is_delete 爲 0 的留下 return super(AnimalManage,self).get_queryset().filter(is_delete = False) def create(self,a_name = "Pandas"): # 默認建立一個熊貓 '''改寫建立對象語句,使用子類完成操做''' animal = self.model() # 建立一個模型 animal.a_name = a_name return animal class Animal(models.Model): # 建立一個數據表爲 Animal a_name = models.CharField(max_length=16) # 動物名字 is_delete = models.BooleanField(default=False) # 設置是否刪除數據,默認不刪除,數據庫中表示爲 0 objects = AnimalManage() # 設置管理者,objects 是什麼名字 # 類名.定義的名字.all()
添加到數據庫表中的數據 其中 is_delete 爲 1 的表示已經刪除的數據 is_delete 是須要的數據
在 urls.py 中添加參數 url(r'getanimals',views.getanimals) 在 views.py 中添加 views. 後面的函數名 def getanimals(request): animals = Animal.objects.all() # 這裏使用的是子類的實例化對象 objects context = { 'animals':animals } ''' animal = Animal.objects.create('動物名稱') 使用 子類中定義的方法進行建立 ''' return render(request,'Animals.html',context=context)
在 templates 中建立 render 函數中的 'xxx.html' 文件 此處 個人是 Animals.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>動物</title> </head> <body> <h2>動物列表</h2> <ul> {% for animal in animals %} <li>{{ animal.a_name }}</li> {% endfor %} </ul> </body> </html>
is_delete 爲 1 的過濾掉了, 爲 0 的保存了下來
Django學習路20_流程複習
https://www.cnblogs.com/hany-postq473111315/p/12881490.html
Django學習路21_views函數中定義字典及html中使用類實例對象的屬性及方法
建立 app6 在項目的 settings 中進行註冊 INSTALLED_APPS 裏面添加 'app6.apps.App6Config' 在 app6 的models.py 中建立數據表 class Student(models.Model): s_name = models.CharField(max_length= 16) 進行遷移 python manage.py makemigrations python manage.py migrate 在 views 中添加函數 from django.http import HttpResponse from django.shortcuts import render # Create your views here. from app6.models import Student def hello(request): return HttpResponse("你好") def index(request): # render 實質上也是返回 HttpResponse ,render 幫助把模板和context數據渲染成字符串 ''' temp = loader.get_template('index6.html') content = temp.render() return HttpResponse(content) 二者等價 return render(request,'index6.html') ''' return render(request,'index6.html') def getstudents(request): students = Student.objects.all() stu_data = { 'students':students } return render(request,'students.html',context=stu_data) 注: 見名知意便可 在 urls.py 中添加 from django.conf.urls import url from app6 import views urlpatterns = [ url(r'hello',views.hello), url(r'index',views.index), url(r'getstudents',views.getstudents) ] 建立 templates 文件夾,添加 students.html 對數據進行遍歷 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3> {% for stu in students %} <li> {{ stu.s_name }}</li> {% endfor %} </h3> </body> </html
進階內容 使用 變量 def getstudents(request): students = Student.objects.all() stu_dict = { # 本身定義的字典 'hobby':'play', 'time':'5 years' } stu_data = { 'students':students, 'stu_dict':stu_dict # stu_dict 是本身定義的字典 } return render(request,'students.html',context=stu_data) students_list.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for stu in students %} <li> {{ stu.s_name }}</li> {% endfor %} <hr/><br/><br/> <li> {{ students.0.s_name }}</li> {# 0 輸出第一個數據 #} <hr/><br/><br/> {% for stu in students %} <li> {{ stu.get_name }}</li> {# 此處使用的是類中定義的方法#} {% endfor %} <h3>{{ stu_dict.hobby }}</h3> {#stu_dict 是本身建立的字典類型,使用的 hobby 是本身添加的鍵值#} </ul> </body> </html> 注: stu.s_name 遍歷的對象獲取名字 students.0.s_name 獲取第一條數據的名字 stu.get_name 使用類內的方法獲取姓名 def get_name(self): # 使用類內定義的函數獲取名字 return self.s_name stu_dict.hobby 使用自定義的字典元素 注: 須要寫到 context 內部的 鍵中 stu_dict = { # 本身定義的字典 'hobby':'play', 'time':'5 years' } stu_data = { 'students':students, 'stu_dict':stu_dict # stu_dict 是本身定義的字典 }
Django學習路22_empty爲空,forloop.counter 從1計數,.counter0 從0計數 .revcounter最後末尾數字是1,.revcounter0 倒序,末尾爲 0
當查找的數據不存在,返回爲 空時
在 html 中使用 {%empty%} 語句 進行顯示
def getstudents(request): students = Student.objects.all().filter(s_name = 'qwer') # 指定一個不存在的值, # students = Student.objects.all() stu_dict = { # 本身定義的字典 'hobby':'play', 'time':'5 years' } stu_data = { 'students':students, 'stu_dict':stu_dict # stu_dict 是本身定義的字典 } return render(request,'students.html',context=stu_data)
html 中語句 {% for stu in students %} <li> {{ stu.s_name }}</li> {% empty %} <h3>不存在該學生</h3> {% endfor %} <hr/><br/><br/>注: 若是爲 空,則輸出 <h3> 不存在該學生</h3> 這條語句
def getstudents(request): students = Student.objects.all() # 指定一個不存在的值, # students = Student.objects.all() stu_dict = { # 本身定義的字典 'hobby':'play', 'time':'5 years' } stu_data = { 'students':students, 'stu_dict':stu_dict # stu_dict 是本身定義的字典 } return render(request,'students.html',context=stu_data)
forloop.counter 示例 {% for stu in students %} <li> {{ forloop.counter }} : {{ stu.s_name }}</li> {% endfor %}
forloop.counter0 示例 {% for stu in students %} <li> {{ forloop.counter0 }} : {{ stu.s_name }}</li> {% endfor %}
forloop.revcounter 示例 {% for stu in students %} <li> {{ forloop.revcounter }} : {{ stu.s_name }}</li> {% endfor %}
forloop.revcounter0 示例 {% for stu in students %} <li> {{ forloop.revcounter0 }} : {{ stu.s_name }}</li> {% endfor %}
Django學習路23_if else 語句,if elif else 語句 forloop.first第一個元素 .last最後一個元素,註釋
if else 格式 {% if 條件 %} <標籤>語句</標籤> {%else%} <標籤>語句</標籤> {%endif} 標籤均可以添加樣式
{% for stu in students %} {% if forloop.first %} <li style="color: chartreuse">{{ stu.s_name }}</li> {% else %} <li>{{ stu.s_name }}</li> {% endfor %}
forloop.first 表示是不是第一個 color: chartreuse 淺綠色 for 循環和 if 判斷 最後都要加上 endfor 和 endif
if elif else 格式 {% if 條件 %} <標籤>語句</標籤> {%elif 條件 %} <標籤>語句</標籤> {%else %} <標籤>語句</標籤> {%endif}
{% for stu in students %} {% if forloop.first %} <li style="color: chartreuse">{{ stu.s_name }}</li> {% elif forloop.last %} <li style="color: blue">{{ stu.s_name }}</li> {% else %} <li>{{ stu.s_name }}</li> {% endif %} {% endfor %}
{#註釋內容: #} {%comment%} 註釋內容: {%endcomment%}
Django學習路24_乘法和除法 urls 中 url(r'getnum',views.getnum)
views.py 中添加對應的函數 def getnum(request): num = 5 context_num = { 'num':num } return render(request,'num_ys.html',context=context_num)
html 中代碼 <body> {# 乘法 #} <h2> {{num}} 當前的值</h2> <h3>進行運算後的值 : {% widthratio num 1 5 %}</h3> {# 除法 #} <h2> {{num}} 當前的值</h2> <h3>進行運算後的值 : {% widthratio num 5 1 %}</h3> </body>
{%widthratio 數 分母 分子 %}
Django學習路25_ifequal 和 ifnotequal 判斷數值是否相等及加減法 {{數值|add 數值}}
{% ifequal 數值 數值 %} <body> {# 判斷是否相等 #} num 當前的值 {{ num }}<br/> {% ifequal num 5 %} {# 判斷 num 是否等於 5#} num 的值是 5 {% endifequal %} </body>
{% ifnotequal 數值 數值 %} {% ifnotequal%} num 當前的值 {{ num }}<br/> {% ifnotequal num 6 %} {# 判斷 num 是否等於 5#} num 的值不是 6 {% endifnotequal %}
{{ 數值 | add: 數值}} {# 加法 #} num 當前的值 {{ num }}<br/> num + 5 的值是 :{{ num | add:5 }}
{{數值 | add:-數值}} {# 減法 #} num 當前的值 {{ num }}<br/> num - 2 的值是 :{{ num | add:-2 }}
Django學習路26_轉換字符串大小寫 upper,lower
在 urls 中註冊 url(r'getstr',views.getstr) 在 views.py 中添加函數 def getstr(request): string = 'abc' string_2 = 'ABC' context_str = { 'string':string, 'string_2':'ABC' } return render(request,'strs.html',context=context_str)
{{ 字符串 | upper}} <body> 當前的字符串爲 {{ string }}<br/> 字符串大寫後爲 {{ string | upper }} </body>
{{字符串|lower}} <body> 當前的字符串爲 {{ string_2 }}<br/> 字符串小寫後爲 {{ string_2 | lower }} </body>
Django學習路27_HTML轉義
謹慎使用
自動渲染語法
{{code|safe}}
urls.py 中添加對應的函數 url(r'getcode',views.getcode)
在 views.py 中添加 def getcode(request): code = "<h2> HTML 轉義示例 </h2>" context_code = { 'code':code } return render(request,'getcode.html',context=context_code)
getcode.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Getcode 示例</title> </head> <body> <p> {{ code|safe }} </p> </body> </html>
網站注入 js ,除非數據絕對安全,不然不要使用
{{code|safe}}
在 根目錄下,建立靜態文件夾, static 創建 JavaScript 文件 添加內容 alert("網站被攻陷~");
在 views.py 中添加 def getcode(request): code = """ <h2> HTML 轉義示例 </h2> <script type="text/javascript"> alert("網站被攻陷了~"); </script> """ context_code = { 'code':code } return render(request,'getcode.html',context=context_code)
在 html 數據中添加 {{code|safe}} code 爲傳遞過來的參數 裏面有外界注入的 js 代碼
進行自動渲染 autoescape off 不進行自動渲染 autoescape on <body> {% autoescape on %} {{ code }} {% endautoescape %} </body>
Django學習路28_ .html 文件繼承及<block 標籤>,include 'xxx.html'
在 templates 文件夾下建立 基類 base.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ title }}</title> </head> <body> {% block header %} {% endblock %} {% block banner %} {% endblock %} {% block content %} {% endblock %} {% block footer %} {% endblock %} </body> </html>
繼承 base.html ,子類名爲 home.html {% extends 'base.html' %} {#繼承 base.html #} {% block header %} <h2> header 模塊 第一次繼承 .html 文件</h2> {% endblock %}
此時,繼承的子類就能夠顯示 在 urls.py 中添加 url(r'temp',views.temp), 在 views.py 中添加對應的函數 def temp(request): return render(request,'home.html',context={'title':'home'})
使用子類footer 繼承 剛剛繼承的 home.html
base -> home -> footer
footer.html {% extends '名稱.html'%} {% block 名稱%} 語句 {%endblock%} {% extends 'home.html' %} {% block footer %} <h3> 繼承了 子類 home 的 類,顯示塊爲 footer </h3> {% endblock %}
在 urls.py 中進行註冊 url(r'footer',views.footer) 在 views.py 中添加 footer 函數 def footer(request): return render(request,'footer.html',context={'title':'footer'})
子類繼承時,父類中顯示的東西也會顯示出來 子類能夠繼承父類的 block 塊 使用 extends 語法:{% extends '名稱.html'%} 當繼承同一個 block 下的標籤時,可能會出現覆蓋 須要使用 {{block.super}}
footer.html 內容 {% extends 'home.html' %} {% block footer %} <h3> 繼承了 子類 home 的 類,顯示塊爲 footer </h3> {% endblock %} {% block header %} 繼承了 子類 home 的 類,顯示塊爲 header {% endblock %} 注: 在 繼承的 home.html 中也存在 block header 標籤,若是沒有使用 super 方法,會出現覆蓋,使用子類的方法
使用 super 後,顯示父類中的 block header {% extends 'home.html' %} {% block footer %} <h3> 繼承了 子類 home 的 類,顯示塊爲 footer </h3> {% endblock %} {% block header %} {{ block.super }} 繼承了 子類 home 的 類,顯示塊爲 header {% endblock %}
{% include '名稱.html'%} 速度慢. {% block footer %} {% include 'footer.html' %} {% endblock %} 注: 使用 footer.html 的內容
Django學習路29_css樣式渲染 h3 標籤
在 static 靜態文件夾下建立 css 文件夾 home.css 此時 home.css 路徑是 'static/css/home.css' 在 對應的 home.html 文件中添加 css 樣式 {% block ext_css %} {# <link rel="stylesheet" href="/static/css/home.css">#} {# 導入樣式#} <link rel="stylesheet" href="{% static 'css/home.css' %}" {# 使用相對路徑#} {% endblock %} 注: 導入方式: <link rel="stylesheet" href="/static/css/home.css"> 使用絕對路徑,若是路徑修改,則很容易出錯 <link rel="stylesheet" href="{% static 'css/home.css' %}" 使用相對路徑,在使用以前,要先在項目的 settings 中添加 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), ] 通知項目,存在該目錄
home.html 內容 {% extends 'base.html' %} {#繼承 base.html #} {% load static %} {% block header %} <h2> header 模塊 第一次繼承 .html 文件</h2> {% endblock %} {% block footer %} {% include 'footer.html' %} {% endblock %} {% block ext_css %} {# <link rel="stylesheet" href="/static/css/home.css">#} {# 導入樣式#} <link rel="stylesheet" href="{% static 'css/home.css' %}" {# 使用相對路徑#} {% endblock %}
home.css 內容
標籤名{
屬性:值;
}
h3{
color:green;
}
本次使用的是 footer.html 繼承了 home.html 的子類 footer.html 內容 {% extends 'home.html' %} {% block footer %} <h3> 繼承了 子類 home 的 類,顯示塊爲 footer </h3> {% endblock %} {% block header %} {{ block.super }} 繼承了 子類 home 的 類,顯示塊爲 header {% endblock %} {% block content %} <h3>作一件事,就把這件事作好</h3> {% endblock %}
在 urls 中註冊 url(r'footer',views.footer) 在 views 中實現 def footer(request): return render(request,'footer.html',context={'title':'footer'})
注: 在 settings 中的 DEBUG = True 當 DEBUG 爲 False 時,會發生界面找不到
核心語句寫法: 導入: <link rel = "stylesheet" href = "{%static '相對路徑'%}"> <link rel="stylesheet" href="{% static 'css/home.css' %}" 繼承: {% extends '文件名.html'%} {% extends 'base.html' %} {% extends 'home.html' %} css 樣式: 標籤名{ 屬性:值; } h3{ color:green; }
千萬要進行註冊 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), ]
Django學習路30_view中存在重複名時,取第一個知足條件的
在 settings 中添加 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app.apps.AppConfig' ]
在 urls 中添加 對應的函數 from django.conf.urls import url from app import views urlpatterns = [ url(r'getok',views.getok), url(r'getokok',views.getokok) ] 注: 使用 url 不使用 path
from django.http import HttpResponse from django.shortcuts import render # Create your views here. def getok(request): return HttpResponse("您獲得的回覆是 OK ") def getokok(request): return HttpResponse("您獲得的回覆是 OKOK ")
Django學習路31_使用 locals 簡化 context 寫法,點擊班級顯示該班學生信息
urls 中 進行註冊 url(r'grades',views.grades)
views 中編寫函數 def grades(request): grades_list = Grade.objects.all() # 使用 locals 獲取本地變量 return render(request,'grades_list.html',context = locals())
html 中編寫頁面顯示 <body> <h2>班級列表</h2> <ul> {% for grade in grades_list %} <li> {{ grade.g_name }}</li> {% endfor %} </ul> </body>
render 參數寫爲 context = locals()
點擊班級名,跳轉查看全部學生信息 在 html 循環中使用 <a href = "函數名/{{grade.g_id}}">班級名稱</a> 在 urls 中聲明 "顯示名稱/(\d+)/" (\d+) 返回到函數中一個參數,經過參數能夠獲取到學生的信息 類名.objects.filter 內參數 s_grade_id = g_id
Django學習路32_建立管理員及內容補充+前面內容複習
建立管理員
python manage.py createsuperuser
數據庫屬性命名限制 1.不能是python的保留關鍵字 2.不容許使用連續的下劃線,這是由django的查詢方式決定的 3.定義屬性時須要指定字段類型,經過字段類型的參數指定選項 語法以下: 屬性名=models.字段類型(選項)
字段類型 使用時須要引入django.db.models包,字段類型以下: AutoField:自動增加的IntegerField,一般不用指定,不指定時Django會自動建立屬性名爲id的自動增加屬性 BooleanField:布爾字段,值爲True或False NullBooleanField:支持Null、True、False三種值 CharField(max_length=字符長度):字符串 參數max_length表示最大字符個數 TextField:大文本字段,通常超過4000個字符時使用 IntegerField:整數 DecimalField(max_digits=None, decimal_places=None):十進制浮點數 參數max_digits表示總位數 參數decimal_places表示小數位數 FloatField:浮點數 DateField:[auto_now=False, auto_now_add=False]):日期 參數auto_now表示每次保存對象時,自動設置該字段爲當前時間,用於"最後一次修改"的時間戳,它老是使用當前日期,默認爲false。 參數auto_now_add表示當對象第一次被建立時自動設置當前時間,用於建立的時間戳,它老是使用當前日期,默認爲false 參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤 TimeField:時間,參數同DateField DateTimeField:日期時間,參數同DateField FileField:上傳文件字段 ImageField:繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片
選項:
null:若是爲True,表示容許爲空,默認值是False
blank:若是爲True,則該字段容許爲空白,默認值是False
對比:null是數據庫範疇的概念,blank是表單驗證證範疇的
db_column:字段的名稱,若是未指定,則使用屬性的名稱
db_index:若值爲True, 則在表中會爲此字段建立索引,默認值是False
default:默認值
primary_key:若爲True,則該字段會成爲模型的主鍵字段,默認值是False,通常做爲AutoField的選項使用
unique:若是爲True, 這個字段在表中必須有惟一值,默認值是False。
get() 獲取數據的坑
注:以前寫過
get():返回表中知足條件的一條且只能有一條數據
若是查到多條數據,則拋異常:MultipleObjectsReturned
查詢不到數據,則拋異常:DoesNotExist
判斷條件中的 屬性列__參數 的補充 1.判等 exact 例:查詢編號爲1的圖書 BookInfo.objects.get(id=1) BookInfo.objects.get(id__exact=1) 2.模糊查詢 contains 例:查詢書名包含'傳'的圖書。contains BookInfo.objects.filter(btitle__contains='傳') 例:查詢書名以'部'結尾的圖書 endswith 開頭:startswith BookInfo.objects.filter(btitle__endswith='部') 3.空查詢 isnull select * from booktest_bookinfo where title is not null; 例:查詢書名不爲空的圖書。isnull BookInfo.objects.filter(btitle__isnull=False) 4.範圍查詢 in select * from booktest_bookinfo where id in (1,3,5) 例:查詢編號爲1或3或5的圖書。 BookInfo.objects.filter(id__in = [1,3,5]) 5.比較查詢 gt 大於 lt 小於 gte 大於等於 lte 小於等於 例:查詢編號大於3的圖書。 BookInfo.objects.filter(id__gt = 3) 6.日期查詢 year 例:查詢1980年發表的圖書。 BookInfo.objects.filter(bpub_date__year=1980) 例:查詢1980年1月1往後發表的圖書。 from datetime import date BookInfo.objects.filter(bpub_date__gt = date(1980,1,1)) 7.返回不知足條件的數據 exclude 例:查詢id不爲3的圖書信息。 BookInfo.objects.exclude(id=3)
F對象 做用:用於類屬性之間的比較條件 使用以前須要先導入: from django.db.models import F 例:查詢圖書閱讀量大於評論量圖書信息。 BookInfo.objects.filter(bread__gt = F('bcomment')) 例:查詢圖書閱讀量大於2倍評論量圖書信息。 BookInfo.objects.filter(bread__gt = F('bcomment')*2) Q對象 做用:用於查詢時的邏輯條件 not and or,能夠對Q對象進行&|~操做 使用以前須要先導入: from django.db.models import Q 例:查詢id大於3且閱讀量大於30的圖書的信息。 BookInfo.objects.filter(id__gt=3, bread__gt=30) BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30)) 例:查詢id大於3或者閱讀量大於30的圖書的信息。 BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30)) 例:查詢id不等於3圖書的信息。 BookInfo.objects.filter(~Q(id=3))
order_by QuerySet對象.order_by('屬性') 做用:進行查詢結果進行排序 例:查詢全部圖書的信息,按照id從小到大進行排序 BookInfo.objects.all().order_by('id') BookInfo.objects.order_by('id') 例:查詢全部圖書的信息,按照id從大到小進行排序。 BookInfo.objects.all().order_by('-id') 例:把id大於3的圖書信息按閱讀量從大到小排序顯示; BookInfo.objects.filter(id__gt=3).order_by('-bread') 注: 屬性上寫上 - 號,表示從大到小進行排序
聚合函數 Sum Count Max Min Avg aggregate(聚合函數('屬性')) 返回一個字典對象 使用前需先導入聚合類: from django.db.models import Sum,Count,Max,Min,Avg 例:查詢全部圖書的數目 Count BookInfo.objects.aggregate(Count('id')) 返回值類型: {'id__count': 5} 例:查詢全部圖書閱讀量的總和。 BookInfo.objects.aggregate(Sum('bread')) {'bread__sum': 126} count函數 返回值是一個數字 做用:統計知足條件數據的數目 例:統計全部圖書的數目。 BookInfo.objects.count() 例:統計id大於3的全部圖書的數目 BookInfo.objects.filter(id__gt=3).count() 查詢相關函數返回值總結: get:返回一個對象 all:QuerySet 返回全部數據 filter:QuerySet 返回知足條件的數據 exclude:QuerySet 返回不滿條件的數據 order_by:QuerySet 對查詢結果進行排序 aggregate:字典 進行聚合操做 count:數字 返回查詢集中數據的數目 get,filter,exclude參數中能夠寫查詢條件。
查詢集特性: 1.惰性查詢: 只有在實際使用查詢集中的數據的時候纔會發生對數據庫的真正查詢 2.緩存: 當使用的是同一個查詢集時,第一次的時候會發生實際數據庫的查詢,而後把結果緩存起來,以後再使用這個查詢集時,使用的是緩存中的結果 限制查詢集: 能夠對一個查詢集進行取下標或者切片操做來限制查詢集的結果 b[0]就是取出查詢集的第一條數據 b[0:1].get()也可取出查詢集的第一條數據 若是b[0]不存在,會拋出IndexError異常 若是b[0:1].get()不存在,會拋出DoesNotExist異常。多條時拋MultiObjectsReturned 對一個查詢集進行切片操做會產生一個新的查詢集,下標不容許爲負數 exists:判斷一個查詢集中是否有數據 True False
模型類關係 1.一對多關係 例:圖書類-英雄類 models.ForeignKey() 定義在多的類中 2.多對多關係 例:新聞類-新聞類型類 體育新聞 國際 models.ManyToManyField() 定義在哪一個類中均可以 3.一對一關係 例:員工基本信息類-員工詳細信息類. 員工工號 models.OneToOneField定義在哪一個類中均可以 關聯查詢(一對多) 在一對多關係中,一對應的類咱們把它叫作一類,多對應的那個類咱們把它叫作多類,咱們把多類中定義的創建關聯的類屬性叫作關聯屬性 例:查詢圖書id爲1的全部英雄的信息。 book = BookInfo.objects.get(id=1) book.heroinfo_set.all() 經過模型類查詢: HeroInfo.objects.filter(hbook_id=1) 例:查詢id爲1的英雄所屬圖書信息。 hero =HeroInfo.objects.get(id=1) hero.hbook 經過模型類查詢: BookInfo.objects.filter(heroinfo__id=1)
由一類的對象查詢多類的時候: 一類的對象.多類名小寫_set.all() #查詢所用數據 由多類的對象查詢一類的時候: 多類的對象.關聯屬性 #查詢多類的對象對應的一類的對象 由多類的對象查詢一類對象的id時候: 多類的對象. 關聯屬性_id
經過模型類實現關聯查詢: 例:查詢圖書信息,要求圖書中英雄的描述包含'八' BookInfo.objects.filter(heroinfo__hcomment__contains='八') 例:查詢圖書信息,要求圖書中的英雄的id大於3 BookInfo.objects.filter(heroinfo__id__gt=3) 例:查詢書名爲「天龍八部」的全部英雄 HeroInfo.objects.filter(hbook__btitle='天龍八部') 經過多類的條件查詢一類的數據: 一類名.objects.filter(多類名小寫__多類屬性名__條件名) 經過一類的條件查詢多類的數據: 多類名.objects.filter(關聯屬性__一類屬性名__條件名)
插入、更新和刪除
調用模型類對象的save方法實現對模型類對應數據表的插入和更新
調用模型類對象的delete方法實現對模型類對應數據表數據的刪除
自關聯是一種特殊的一對多關係
管理器 objects BookInfo.objects.all() 答:objects是Django幫我自動生成的管理器對象 經過這個管理器能夠實現對數據的查詢 objects是models.Manger類的一個對象 自定義管理器後 Django再也不幫咱們生成默認的objects管理器 1.自定義一個管理器類,這個類繼承models.Manger類 2.再在具體的模型類裏定義一個自定義管理器類的對象 自定義管理器類的應用場景: 1.改變查詢的結果集 好比調用BookInfo.books.all()返回的是沒有刪除的圖書的數據 2.添加額外的方法 管理器類中定義一個方法幫咱們建立對應的模型類對象 使用self.model()就能夠建立一個跟自定義管理器對應的模型類對象
元選項
Django默認生成的表名:
應用名小寫_模型類名小寫。
元選項:
須要在模型類中定義一個元類Meta
在裏面定義一個類屬性db_table就能夠指定表名
Django學習路33_url 地址及刪除元素 delete() 和重定向 return redirect('路徑')
保存日期 def create(request): '''新增一本圖書''' # 1.建立BookInfo對象 b = BookInfo() b.btitle = '流星蝴蝶劍' b.bpub_date = date(1990,1,1) # 2.保存進數據庫 b.save() # 3.返回應答,讓瀏覽器再訪問/index,重定向 return HttpResponse('ok') # return HttpResponseRedirect('/index') # return redirect('/index')
使用 結果集對象.delete() 進行刪除 from django.shortcuts import render,redirect # 導入重定向函數 redirect('路徑') 實現重定向 def delete(request, bid): '''刪除點擊的圖書''' # 1.經過bid獲取圖書對象 book = BookInfo.objects.get(id=bid) # 2.刪除 book.delete() # 3.重定向,讓瀏覽器訪問/index # return HttpResponseRedirect('/index') return redirect('/index')
Django學習路34_models 文件建立數據表
from django.db import models # Create your models here. class BookInfoManager(models.Manager): '''圖書模型管理器類''' # 1.改變原有查詢的結果集 def all(self): # 1.調用父類的all方法,獲取全部數據 books = super().all() # QuerySet # 2.對books中的數據進行過濾 books = books.filter(isDelete=False) # 返回books return books # 2.封裝方法,操做模型類對應的數據表(增刪改查) def create_book(self, btitle, bpub_date): '''添加一本圖書''' # 1.建立一個圖書對象 # 獲取self所在的模型類 model_class = self.model book = model_class() # book = BookInfo() book.btitle = btitle book.bpub_date = bpub_date # 2.添加進數據庫 book.save() # 3.返回book return book # 一類 # booktest2_bookinfo class BookInfo(models.Model): '''圖書模型類''' # 圖書名稱 btitle = models.CharField(max_length=20, db_column='title') # 圖書名字惟一 # btitle = models.CharField(max_length=20, unique=True, db_index=True) # 價格,最大位數爲10,小數爲2 # bprice = models.DecimalField(max_digits=10, decimal_places=2) # 出版日期 bpub_date = models.DateField() # bpub_date = models.DateField(auto_now_add=True) # 建立時間 # bpub_date = models.DateField(auto_now=True) # 更新時間 # 閱讀量 bread = models.IntegerField(default=0) # 評論量 bcomment = models.IntegerField(default=0) # 刪除標記 isDelete = models.BooleanField(default=False) # book = models.Manager() # 自定一個Manager類對象,管理器對象 objects = BookInfoManager() # 自定義一個BookInfoManager類的對象 # @classmethod # def create_book(cls, btitle, bpub_date): # '''添加一本圖書''' # # 建立一個cls類的對象 # obj = cls() # obj.btitle = btitle # obj.bpub_date = bpub_date # # 添加進數據庫 # obj.save() # # 返回obj # return obj class Meta: db_table = 'bookinfo' # 指定模型類對應表名 # 多類 class HeroInfo(models.Model): '''英雄人物模型類''' # 英雄名 hname = models.CharField(max_length=20) # 性別 hgender = models.BooleanField(default=False) # 備註 hcomment = models.CharField(max_length=200, null=True, blank=False) # 關係屬性 hbook = models.ForeignKey('BookInfo',on_delete=True) # 刪除標記 isDelete = models.BooleanField(default=False) ''' # 新聞類型類 class NewsType(models.Model): # 類型名 type_name = models.CharField(max_length=20) # 關係屬性,表明類型下面的信息 type_news = models.ManyToManyField('NewsInfo') # 新聞類 class NewsInfo(models.Model): # 新聞標題 title = models.CharField(max_length=128) # 發佈時間 pub_date = models.DateTimeField(auto_now_add=True) # 信息內容 content = models.TextField() # 關係屬性, 表明信息所屬的類型 # news_type = models.ManyToManyField('NewsType') # 員工基本信息類 class EmployeeBasicInfo(models.Model): # 姓名 name = models.CharField(max_length=20) # 性別 gender = models.BooleanField(default=False) # 年齡 age = models.IntegerField() # 關係屬性,表明員工的詳細信息 employee_detail = models.OneToOneField('EmployeeDetailInfo') # 員工詳細信息類 class EmployeeDetailInfo(models.Model): # 聯繫地址 addr = models.CharField(max_length=256) # 教育經歷 # 關係屬性,表明員工基本信息 # employee_basic = models.OneToOneField('EmployeeBasicInfo') ''' class AreaInfo(models.Model): '''地區模型類''' # 地區名稱 atitle = models.CharField(max_length=20) # 關係屬性,表明當前地區的父級地區 aParent = models.ForeignKey('self', null=True, blank=True,on_delete=True) # class Meta: # db_table = 'areas'
Django學習路35_視圖使用方法(複製的代碼) + 簡單總結
from django.shortcuts import render,redirect from django.http import HttpResponse,JsonResponse from datetime import datetime,timedelta # Create your views here. # request就是HttpRequest類型的對象 # request包含瀏覽器請求的信息 def index(request): '''首頁''' # num = 'a' + 1 # print(request.path) response = render(request, 'booktest/index.html') response.write('hello') return response def show_arg(request, num): return HttpResponse(num) def login(request): '''顯示登陸頁面''' # 判斷用戶是否登陸 if request.session.has_key('islogin'): # 用戶已登陸, 跳轉到首頁 return redirect('/index') else: # 用戶未登陸 # 獲取cookie username if 'username' in request.COOKIES: # 獲取記住的用戶名 username = request.COOKIES['username'] else: username = '' return render(request, 'booktest/login.html', {'username':username}) def login_check(request): '''登陸校驗視圖''' # request.POST 保存的是post方式提交的參數 QueryDict # request.GET 保存是get方式提交的參數 print(request.method) # 1.獲取提交的用戶名和密碼 username = request.POST.get('username') password = request.POST.get('password') remember = request.POST.get('remember') # 2.進行登陸的校驗 # 實際開發:根據用戶名和密碼查找數據庫 # 模擬: smart 123 if username == 'smart' and password == '123': # 用戶名密碼正確,跳轉到首頁 response = redirect('/index') # 判斷是否須要記住用戶名 if remember == 'on': # 設置cookie username,過時時間1周 response.set_cookie('username', username, max_age=7*24*3600) # 記住用戶登陸狀態 # 只有session中有islogin,就認爲用戶已登陸 request.session['islogin'] = True # 返回應答 return response else: # 用戶名或密碼錯誤,跳轉到登陸頁面 return redirect('/login') # /test_ajax def ajax_test(request): '''顯示ajax頁面''' return render(request, 'booktest/test_ajax.html') def ajax_handle(request): '''ajax請求處理''' # 返回的json數據 {'res':1} return JsonResponse({'res':1}) # /login_ajax def login_ajax(request): '''顯示ajax登陸頁面''' return render(request, 'booktest/login_ajax.html') # /login_ajax_check def login_ajax_check(request): '''ajax登陸校驗''' # 1.獲取用戶名和密碼 username = request.POST.get('username') password = request.POST.get('password') # 2.進行校驗,返回json數據 if username == 'smart' and password == '123': # 用戶名密碼正確 return JsonResponse({'res':1}) # return redirect('/index') ajax請求在後臺,不要返回頁面或者重定向 else: # 用戶名或密碼錯誤 return JsonResponse({'res':0}) # /set_cookie def set_cookie(request): '''設置cookie信息''' response = HttpResponse('設置cookie') # 設置一個cookie信息,名字爲num, 值爲1 response.set_cookie('num', 1, max_age=14*24*3600) # response.set_cookie('num2', 2) # response.set_cookie('num', 1, expires=datetime.now()+timedelta(days=14)) # 返回response return response # /get_cookie def get_cookie(request): '''獲取cookie的信息''' # 取出cookie num的值 num = request.COOKIES['num'] return HttpResponse(num) # /set_session def set_session(request): '''設置session''' request.session['username'] = 'smart' request.session['age'] = 18 # request.session.set_expiry(5) return HttpResponse('設置session') # /get_session def get_session(request): '''獲取session''' username = request.session['username'] age = request.session['age'] return HttpResponse(username+':'+str(age)) # /clear_session def clear_session(request): '''清除session信息''' # request.session.clear() request.session.flush() return HttpResponse('清除成功')
urls.py 內容 from django.conf.urls import url from booktest import views urlpatterns = [ url(r'^index$', views.index), # 首頁 # url(r'^showarg(\d+)$', views.show_arg), # 捕獲url參數:位置參數 url(r'^showarg(?P<num>\d+)$', views.show_arg),# 捕獲url參數:關鍵字參數 url(r'^login$', views.login), # 顯示登陸頁面 url(r'^login_check$', views.login_check), # 用戶登陸校驗 url(r'^test_ajax$', views.ajax_test), # 顯示ajax頁面 url(r'^ajax_handle$', views.ajax_handle), # ajax處理 url(r'^login_ajax$', views.login_ajax), # 顯示ajax登陸頁面 url(r'^login_ajax_check$', views.login_ajax_check), # ajax登陸校驗 url(r'^set_cookie$', views.set_cookie), # 設置cookie url(r'^get_cookie$', views.get_cookie), # 獲取cookie url(r'^set_session$', views.set_session), # 設置session url(r'^get_session$', views.get_session), # 獲取session url(r'^clear_session$', views.clear_session), # 清除session ]
展現參數 def show_arg(request, num): return HttpResponse(num) 判斷用戶是否登陸 request.session.has_key('islogin') 重定向 return redirect('/index') 獲取cookie request.COOKIES 獲取用戶提交的用戶名和密碼 username = request.POST.get('username') password = request.POST.get('password') 判斷是否須要記住 remember = request.POST.get('remember') if remember == 'on': # 設置cookie username,過時時間1周 response.set_cookie('username', username, max_age=7*24*3600) 只要 session中有islogin,就認爲用戶已登陸 request.session['islogin'] = True 返回 JSON 數據 def ajax_handle(request): '''ajax請求處理''' # 返回的json數據 {'res':1} return JsonResponse({'res':1}) 判斷是否登陸 def login_ajax_check(request): '''ajax登陸校驗''' # 1.獲取用戶名和密碼 username = request.POST.get('username') password = request.POST.get('password') # 2.進行校驗,返回json數據 if username == 'smart' and password == '123': # 用戶名密碼正確 return JsonResponse({'res':1}) # return redirect('/index') ajax請求在後臺,不要返回頁面或者重定向 else: # 用戶名或密碼錯誤 return JsonResponse({'res':0}) 設置 cookie 信息 response.set_cookie('num', 1, max_age=14*24*3600) 獲取 cookie 信息 num = request.COOKIES['num'] 設置 session 信息 request.session['username'] = 'smart' def set_session(request): '''設置session''' request.session['username'] = 'smart' request.session['age'] = 18 # request.session.set_expiry(5) return HttpResponse('設置session') 獲取 session age = request.session['age'] 清除 session 信息 request.session.flush() def clear_session(request): '''清除session信息''' # request.session.clear() request.session.flush() return HttpResponse('清除成功')
Django學習路36_函數參數 反向解析 修改404 頁面
在 templates 中建立對應文件名的 html 文件 (404.html)
注:
開發者服務器發生變動是由於 python 代碼發生變化
若是 html 文件發生變化,服務器不會進行重啓
須要本身手動修改
注意就近原則,若是有重複名字,先用最近的
Django學習路37_request屬性
打印元信息,基本上都會打印出來
類字典結構的 key 鍵 容許重複
get 請求能夠傳參,可是長度有限制 最大不能超過 2K post 文件上傳使用 get 參數 默認放在網址中 post 在請求體中 post 請求能夠獲取 get 請求參數
類字典結構: <QueryDict> 鍵能夠重複 字典結構: 鍵是 哈希表,保證不重複
打印 訪問網站的用戶的 IP 地址
老男孩Django筆記(非原創)
3、WEB框架 MVC Model View Controller 數據庫 模板文件 業務處理 MTV Model Template View 數據庫 模板文件 業務處理 ############## WEB:MVC、MTV 4、Django pip3 install django C:\Python35\Scripts # 建立Django工程 django-admin startproject 【工程名稱】 mysite - mysite # 對整個程序進行配置 - init - settings # 配置文件 - url # URL對應關係 - wsgi # 遵循WSIG規範,uwsgi + nginx - manage.py # 管理Django程序: - python manage.py - python manage.py startapp xx - python manage.py makemigrations - python manage.py migrate # 運行Django功能 python manage.py runserver 127.0.0.1:8001 chouti - chouti - 配置 - 主站 app - 後臺管理 app # 建立app python manage.py startapp cmdb python manage.py startapp openstack python manage.py startapp xxoo.... app: migrations 數據修改表結構 admin Django爲咱們提供的後臺管理 apps 配置當前app models ORM,寫指定的類 經過命令能夠建立數據庫結構 tests 單元測試 views 業務代碼 1、配置模板的路徑 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] 2、配置靜態目錄 static STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) <link rel="stylesheet" href="/static/commons.css" /> 內容整理 1. 建立Django工程 django-admin startproject 工程名 2. 建立APP cd 工程名 python manage.py startapp cmdb 3、靜態文件 project.settings.py STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), ) 4、模板路徑 DIRS ==> [os.path.join(BASE_DIR,'templates'),] 5、settings中 middlerware # 註釋 csrf 6、定義路由規則 url.py "login" --> 函數名 7、定義視圖函數 app下views.py def func(request): # request.method GET / POST # http://127.0.0.1:8009/home?nid=123&name=alex # request.GET.get('',None) # 獲取請求發來的而數據 # request.POST.get('',None) # return HttpResponse("字符串") # return render(request, "HTML模板的路徑") # return redirect('/只能填URL') 8、模板渲染 特殊的模板語言 -- {{ 變量名 }} def func(request): return render(request, "index.html", {'current_user': "alex"}) index.html <html> .. <body> <div>{{current_user}}</div> </body> </html> ====> 最後生成的字符串 <html> .. <body> <div>alex</div> </body> </html> -- For循環 def func(request): return render(request, "index.html", {'current_user': "alex", 'user_list': ['alex','eric']}) index.html <html> .. <body> <div>{{current_user}}</div> <ul> {% for row in user_list %} {% if row == "alex" %} <li>{{ row }}</li> {% endif %} {% endfor %} </ul> </body> </html> #####索引################# def func(request): return render(request, "index.html", { 'current_user': "alex", 'user_list': ['alex','eric'], 'user_dict': {'k1': 'v1', 'k2': 'v2'}}) index.html <html> .. <body> <div>{{current_user}}</div> <a> {{ user_list.1 }} </a> <a> {{ user_dict.k1 }} </a> <a> {{ user_dict.k2 }} </a> </body> </html> ###### 條件 def func(request): return render(request, "index.html", { 'current_user': "alex", "age": 18, 'user_list': ['alex','eric'], 'user_dict': {'k1': 'v1', 'k2': 'v2'}}) index.html <html> .. <body> <div>{{current_user}}</div> <a> {{ user_list.1 }} </a> <a> {{ user_dict.k1 }} </a> <a> {{ user_dict.k2 }} </a> {% if age %} <a>有年齡</a> {% if age > 16 %} <a>老男人</a> {% else %} <a>小鮮肉</a> {% endif %} {% else %} <a>無年齡</a> {% endif %} </body> </html> XXOO管理: MySQL SQLAlchemy 主機管理(8列): IP 端口 業務線 ... 用戶表: 用戶名 密碼 功能: 1、 登陸 2、主機管理頁面 - 查看全部的主機信息(4列) - 增長主機信息(8列) ** 模態對話框 3、查看詳細 url: "detail" -> detail def detail(reqeust): nid = request.GET.get("nid") v = select * from tb where id = nid ... 4、刪除 del_host -> delete_host def delete_host(request): nid = request.POST.get('nid') delete from tb where id = nid return redirect('/home')
上節內容回顧: 1、Django請求生命週期 -> URL對應關係(匹配) -> 視圖函數 -> 返回用戶字符串 -> URL對應關係(匹配) -> 視圖函數 -> 打開一個HTML文件,讀取內容 2、建立django projcet django-admin startproject mysite .. mysite mysite - 配置文件 - url.py - settings.py cd mysite python manage.py startapp cmdb mysite mysite - 配置文件 - url.py - settings.py cmdb - views.py - admin.py - models.py # 建立數據庫表 3、配置 模板路徑 靜態文件路徑 # CSRF 4、編寫程序 a. url.py /index/ -> func b. views.py def func(request): # 包含全部的請求數據 ... return HttpResponse('字符串') return render(request, 'index.html', {''}) retrun redirect('URL') c. 模板語言 return render(request, 'index.html', {'li': [11,22,33]}) {% for item in li %} <h1>{{item}}</h1> {% endfor %} *********** 索引用點 ********** <h2> {{item.0 }} </h2> 1、路由系統,URL 1、url(r'^index/', views.index), url(r'^home/', views.Home.as_view()), 2、url(r'^detail-(\d+).html', views.detail), 3、url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail) PS: def detail(request, *args,**kwargs): pass 實戰: a. url(r'^detail-(\d+)-(\d+).html', views.detail), def func(request, nid, uid): pass def func(request, *args): args = (2,9) def func(request, *args, **kwargs): args = (2,9) b. url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail) def func(request, nid, uid): pass def funct(request, **kwargs): kwargs = {'nid': 1, 'uid': 3} def func(request, *args, **kwargs): args = (2,9) 4、 name 對URL路由關係進行命名, ***** 之後能夠根據此名稱生成本身想要的URL ***** url(r'^asdfasdfasdf/', views.index, name='i1'), url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'), url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'), def func(request, *args, **kwargs): from django.urls import reverse url1 = reverse('i1') # asdfasdfasdf/ url2 = reverse('i2', args=(1,2,)) # yug/1/2/ url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/ xxx.html {% url "i1" %} # asdfasdfasdf/ {% url "i2" 1 2 %} # yug/1/2/ {% url "i3" pid=1 nid=9 %} # buy/1/9/ 注: # 當前的URL request.path_info 5、多級路由 project/urls.py from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^cmdb/', include("app01.urls")), url(r'^monitor/', include("app02.urls")), ] app01/urls.py from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^login/', views.login), ] app02/urls.py from django.conf.urls import url,include from django.contrib import admin from app02 import views urlpatterns = [ url(r'^login/', views.login), ] 2、視圖 1、獲取用戶請求數據 request.GET request.POST request.FILES PS: GET:獲取數據 POST:提交數據 2、checkbox等多選的內容 request.POST.getlist() 3、上傳文件 # 上傳文件,form標籤作特殊設置 obj = request.FILES.get('fafafa') obj.name f = open(obj.name, mode='wb') for item in obj.chunks(): f.write(item) f.close() 4、FBV & CBV function base view url.py index -> 函數名 view.py def 函數(request): ... ====》 /index/ -> 函數名 /index/ -> 類 ====》 建議:二者都用 5、裝飾器 4、ORM操做 select * from tb where id > 1 # 對應關係 models.tb.objects.filter(id__gt=1) models.tb.objects.filter(id=1) models.tb.objects.filter(id__lt=1) 建立類 a. 先寫類 from django.db import models # app01_userinfo class UserInfo(models.Model): # id列,自增,主鍵 # 用戶名列,字符串類型,指定長度 username = models.CharField(max_length=32) password = models.CharField(max_length=64) b. 註冊APP INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', ] c. 執行命令 python manage.py makemigrations python manage.py migrate d. ********** 注意 *********** Django默認使用MySQLdb模塊連接MySQL 主動修改成pymysql,在project同名文件夾下的__init__文件中添加以下代碼便可: import pymysql pymysql.install_as_MySQLdb() 1. 根據類自動建立數據庫表 # app下的models.py python manage.py makemigrations python manage.py migrate 字段: 字符串類型 數字 時間 二進制 自增(primary_key=True) 字段的參數: null -> db是否能夠爲空 default -> 默認值 primary_key -> 主鍵 db_column -> 列名 db_index -> 索引 unique -> 惟一索引 unique_for_date -> unique_for_month unique_for_year auto_now -> 建立時,自動生成時間 auto_now_add -> 更新時,自動更新爲當前時間 # obj = UserGroup.objects.filter(id=1).update(caption='CEO') # obj = UserGroup.objects.filter(id=1).first() # obj.caption = "CEO" # obj.save() choices -> django admin中顯示下拉框,避免連表查詢 blank -> django admin是否能夠爲空 verbose_name -> django admin顯示字段中文 editable -> django admin是否能夠被編輯 error_messages -> 錯誤信息欠 help_text -> django admin提示 validators -> django form ,自定義錯誤信息(欠) 建立 Django 用戶:python manage.py createsuperuser 2. 根據類對數據庫表中的數據進行各類操做 一對多: a. 外檢 b. 外鍵字段_id c. models.tb.object.create(name='root', user_group_id=1) d. userlist = models.tb.object.all() for row in userlist: row.id row.user_group_id row.user_group.caption =================== 做業:用戶管理 ==================== 1、用戶組的增刪改查 2、用戶增刪該查 - 添加必須是對話框 - 刪除必須是對話框 - 修改,必須顯示默認值 3、比較好看的頁面 4、預習: http://www.cnblogs.com/wupeiqi/articles/5246483.html
1、Django請求的生命週期 路由系統 -> 試圖函數(獲取模板+數據=》渲染) -> 字符串返回給用戶 2、路由系統 /index/ -> 函數或類.as_view() /detail/(\d+) -> 函數(參數) 或 類.as_view()(參數) /detail/(?P<nid>\d+) -> 函數(參數) 或 類.as_view()(參數) /detail/ -> include("app01.urls") /detail/ name='a1' -> include("app01.urls") - 視圖中:reverse - 模板中:{% url "a1" %} 3、視圖 FBV:函數 def index(request,*args,**kwargs): .. CBV:類 class Home(views.View): def get(self,reqeust,*args,**kwargs): .. 獲取用戶請求中的數據: request.POST.get request.GET.get reqeust.FILES.get() # checkbox, ........getlist() request.path_info 文件對象 = reqeust.FILES.get() 文件對象.name 文件對象.size 文件對象.chunks() # <form 特殊的設置></form> 給用戶返回數據: render(request, "模板的文件的路徑", {'k1': [1,2,3,4],"k2": {'name': '張揚','age': 73}}) redirect("URL") HttpResponse(字符串) 4、模板語言 render(request, "模板的文件的路徑", {'obj': 1234, 'k1': [1,2,3,4],"k2": {'name': '張揚','age': 73}}) <html> <body> <h1> {{ obj }} </h1> <h1> {{ k1.3 }} </h1> <h1> {{ k2.name }} </h1> {% for i in k1 %} <p> {{ i }} </p> {% endfor %} {% for row in k2.keys %} {{ row }} {% endfor %} {% for row in k2.values %} {{ row }} {% endfor %} {% for k,v in k2.items %} {{ k }} - {{v}} {% endfor %} </body> </html> 5、ORM a. 建立類和字段 class User(models.Model): age = models.IntergerFiled() name = models.CharField(max_length=10)#字符長度 Python manage.py makemigrations python manage.py migrate # settings.py 註冊APP b. 操做 增 models.User.objects.create(name='qianxiaohu',age=18) dic = {'name': 'xx', 'age': 19} models.User.objects.create(**dic) obj = models.User(name='qianxiaohu',age=18) obj.save() 刪 models.User.objects.filter(id=1).delete() 改 models.User.objects.filter(id__gt=1).update(name='alex',age=84) dic = {'name': 'xx', 'age': 19} models.User.objects.filter(id__gt=1).update(**dic) 查 models.User.objects.filter(id=1,name='root') models.User.objects.filter(id__gt=1,name='root') models.User.objects.filter(id__lt=1) models.User.objects.filter(id__gte=1) models.User.objects.filter(id__lte=1) models.User.objects.filter(id=1,name='root') dic = {'name': 'xx', 'age__gt': 19} models.User.objects.filter(**dic) v1 = models.Business.objects.all() # QuerySet ,內部元素都是對象 # QuerySet ,內部元素都是字典 v2 = models.Business.objects.all().values('id','caption') # QuerySet ,內部元素都是元組 v3 = models.Business.objects.all().values_list('id','caption') # 獲取到的一個對象,若是不存在就報錯 models.Business.objects.get(id=1) 對象或者None = models.Business.objects.filter(id=1).first() 外鍵: v = models.Host.objects.filter(nid__gt=0) v[0].b.caption ----> 經過.進行跨表 外鍵: class UserType(models.Model): caption = models.CharField(max_length=32) id caption # 1,普通用戶 # 2,VIP用戶 # 3, 遊客 class User(models.Model): age = models.IntergerFiled() name = models.CharField(max_length=10)#字符長度 # user_type_id = models.IntergerFiled() # 約束, user_type = models.ForeignKey("UserType",to_field='id') # 約束, name age user_type_id position:fixed absolute relative Ajax $.ajax({ url: '/host', type: "POST", data: {'k1': 123,'k2': "root"}, success: function(data){ // data是服務器端返回的字符串 var obj = JSON.parse(data); } }) 建議:永遠讓服務器端返回一個字典 return HttpResponse(json.dumps(字典)) 多對多: 建立多對多: 方式一:自定義關係表 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') # 10 class Application(models.Model): name = models.CharField(max_length=32) # 2 class HostToApp(models.Model): hobj = models.ForeignKey(to='Host',to_field='nid') aobj = models.ForeignKey(to='Application',to_field='id') # HostToApp.objects.create(hobj_id=1,aobj_id=2) 方式二:自動建立關係表 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') # 10 class Application(models.Model): name = models.CharField(max_length=32) r = models.ManyToManyField("Host") 沒法直接對第三張表進行操做 obj = Application.objects.get(id=1) obj.name # 第三張表操做 obj.r.add(1) obj.r.add(2) obj.r.add(2,3,4) obj.r.add(*[1,2,3,4]) obj.r.remove(1) obj.r.remove(2,4) obj.r.remove(*[1,2,3]) obj.r.clear() obj.r.set([3,5,7]) # 全部相關的主機對象「列表」 QuerySet obj.r.all()
s14day21 上節內容回顧: 1、請求週期 url> 路由 > 函數或類 > 返回字符串或者模板語言? Form表單提交: 提交 -> url > 函數或類中的方法 - .... HttpResponse('....') render(request,'index.html') redirect('/index/') 用戶 < < 返回字符串 (當接受到redirect時)自動發起另一個請求 --> url ..... Ajax: $.ajax({ url: '/index/', data: {'k': 'v', 'list': [1,2,3,4], 'k3': JSON.stringfy({'k1': 'v'}))}, $(form對象).serilize() type: 'POST', dataType: 'JSON': traditional: true, success:function(d){ location.reload() # 刷新 location.href = "某個地址" # 跳轉 } }) 提交 -> url -> 函數或類中的方法 HttpResponse('{}') render(request, 'index.html', {'name': 'v1'}) <h1>{{ name }}</h1> --> <h1>v1</h1> XXXXXXX redirect... 用戶 <<<<< 字符串 2、路由系統URL a. /index/ -> 函數或類 b. /index/(\d+) -> 函數或類 c. /index/(?P<nid>\d+) -> 函數或類 d. /index/(?P<nid>\d+) name='root' -> 函數或類 reverse() {% url 'root' 1%} e. /crm/ include('app01.urls') -> 路由分發 f. 默認值 url(r'^index/', views.index, {'name': 'root'}), def index(request,name): print(name) return HttpResponse('OK') g. 命名空間 /admin/ include('app01.urls',namespace='m1') /crm/ include('app01.urls',namespace='m1') app01.urls /index/ name = 'n1' reverser('m1:n1') 3、 def func(request): request.POST request.GET request.FILES request.getlist request.method request.path_info return render,HttpResponse,redirect 4、 render(request, 'index.html') # for # if # 索引. keys values items all 5、 class User(models.Model): username = models.CharField(max_length=32) email = models.EmailField() 有驗證功能 Django Admin 無驗證功能: User.objects.create(username='root',email='asdfasdfasdfasdf') User.objects.filter(id=1).update(email='666') class UserType(models.Model): name = models.CharField(max_length=32) class User(models.Model): username = models.CharField(max_length=32) email = models.EmailField() user_type = models.ForeignKey("UserType") user_list = User.objects.all() for obj user_list: obj.username,obj.email,obj.user_type_id,obj.user_type.name,obj.user_type.id user = User.objects.get(id=1) user. User.objects.all().values("username","user_type__name",) class UserType(models.Model): name = models.CharField(max_length=32) class User(models.Model): username = models.CharField(max_length=32) email = models.EmailField() user_type = models.ForeignKey("UserType") m = models.ManyToMany('UserGroup') class UserGroup(models.Model): name = .... obj = User.objects.get(id=1) obj.m.add(2) obj.m.add(2,3) obj.m.add(*[1,2,3]) obj.m.remove(...) obj.m.clear() obj.m.set([1,2,3,4,5]) # 多個組,UserGroup對象 obj.m.all() obj.m.filter(name='CTO') 知識點: URL - 兩個 Views - 請求的其餘信息 from django.core.handlers.wsgi import WSGIRequest request.environ request.environ['HTTP_USER_AGENT'] - 裝飾器 FBV: def auth(func): def inner(reqeust,*args,**kwargs): v = reqeust.COOKIES.get('username111') if not v: return redirect('/login/') return func(reqeust, *args,**kwargs) return inner CBV: from django import views from django.utils.decorators import method_decorator @method_decorator(auth,name='dispatch') class Order(views.View): # @method_decorator(auth) # def dispatch(self, request, *args, **kwargs): # return super(Order,self).dispatch(request, *args, **kwargs) # @method_decorator(auth) def get(self,reqeust): v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v}) def post(self,reqeust): v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v}) Templates - 母版...html extends include - 自定義函數 simple_tag a. app下建立templatetags目錄 b. 任意xxoo.py文件 c. 建立template對象 register d. @register.simple_tag def func(a1,a2,a3....) return "asdfasd" e. settings中註冊APP f. 頂部 {% load xxoo %} g. {% 函數名 arg1 arg2 %} 缺點: 不能做爲if條件 優勢: 參數任意 filter a. app下建立templatetags目錄 b. 任意xxoo.py文件 c. 建立template對象 register d. @register.filter def func(a1,a2) return "asdfasd" e. settings中註冊APP f. 頂部 {% load xxoo %} g. {{ 參數1|函數名:"參數二,參數三" }} {{ 參數1|函數名:數字 }} 缺點: 最多兩個參數,不能加空格 優勢: 能做爲if條件 分頁(自定義的分頁) XSS: {{ page_str|safe }} mark_safe(page_str) cookie 客戶端瀏覽器上的一個文件 {"user": 'dachengzi'} session :裝飾器 Models - 一大波操做 Form驗證 - 緩存 中間件 信號 CSRF Admin/ModelForm 做業: 主機管理: 1、單表操做 2、一對多 3、多對多 要求: a. 刪除對話框 b. 修改,添加新URL c. 基於cookie進行用戶認證 d. 定製顯示個數 e. 分頁 預習: Form: http://www.cnblogs.com/wupeiqi/articles/6144178.html Model:http://www.cnblogs.com/wupeiqi/articles/6216618.html
day22 知識點概要 - Session - CSRF - Model操做 - Form驗證(ModelForm) - 中間件 - 緩存 - 信號 內容詳細: 1. Session 基於Cookie作用戶驗證時:敏感信息不適合放在cookie中 a. Session原理 Cookie是保存在用戶瀏覽器端的鍵值對 Session是保存在服務器端的鍵值對 b. Cookie和Session對比 c. Session配置(缺乏cache) d. 示例:實現兩週自動登錄 - request.session.set_expiry(60*10) - SESSION_SAVE_EVERY_REQUEST = True PS: cookie中不設置超時時間,則表示關閉瀏覽器自動清除 - session依賴於cookie - 服務器session request.session.get() request.session[x] = x request.session.clear() - 配置文件中設置默認操做(通用配置): SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過時(默認) # set_cookie('k',123) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存(默認) - 引擎的配置 2. CSRF a. CSRF原理 b. 無CSRF時存在隱患 c. Form提交(CSRF) d. Ajax提交(CSRF) CSRF請求頭 X-CSRFToken 6. 中間件 7. 緩存 5種配置 3種應用: 全局 視圖函數 模板 8. 信號 - 內置信號 - 自定義 - 定義信號 - 出發信號 - 信號中註冊函數 3. Model操做 a. 字段類型 + 參數 b. 連表字段 + 參數 c. Meta d. SQL操做: - 基本增刪改查 - 進階操做 - 正反查詢 - 其餘操做 e. 驗證(弱) 4. Form操做 完成: - 驗證用戶請求 - 生成HTML (保留上一次提交的數據) 自定義: - 類 - 字段(校驗) - 插件(生成HTML) 初始化操做: ============= 做業:xxxoo管理 ============= 用戶驗證:session 新URL:Form驗證 中間件:IP過濾 信號:記錄操做 CSRF: a. Form驗證用戶請求 b. Form生成HTML c. Form字段詳細(自定義字段,Model...) + 插件 d. 自定義驗證(鉤子以及__all__) e. 註冊示例: 用戶名、密碼、郵箱、手機號(RegexValidator或RegexField)、性別、愛好、城市 f. 初始化值 5. ModelForm a. Model+Form功能集合 b. save c. save + save_m2m
Model - 數據庫操做 - 驗證 class A(MOdel): user = email = pwd = Form - class LoginForm(Form): email = fields.EmailField() user = pwd = - is_valid -> 每個字段進行正則(字段內置正則)+clean_字段 -> clean(__all__) -> _post_clean - cleand_data - error --------> 推薦 <--------- 1、ModelForm 參考博客: http://www.cnblogs.com/wupeiqi/articles/6229414.html Model + Form => 驗證 + 數據庫操做 - class LoginModelForm(xxxxx): 利用model.A中的字段 1. 生成HTML標籤:class Meta: ... 2. mf = xxxModelForm(instance=ModelObj) 3. 額外的標籤, is_rmb = Ffields.CharField(widget=Fwidgets.CheckboxInput()) 4. 各類驗證 is_valid() -> 各類鉤子... 5. mf.save() # 或 instance = mf.save(False) instance.save() mf.save_m2m() 2、Ajax 參考博客: http://www.cnblogs.com/wupeiqi/articles/5703697.html 原生 jQuery 僞Ajax操做 時機: 若是發送的是【普通數據】 -> jQuery,XMLHttpRequest,iframe 3、文件上傳(預覽) - Form提交 - Ajax上傳文件 時機: 若是發送的是【文件】 -> iframe,jQuery(FormData),XMLHttpRequest(FormData), 4、圖片驗證碼 + Session - session - check_code.py(依賴:Pillow,字體文件) - src屬性後面加? 5、CKEditor,UEEditor,TinyEditor,KindEditor(***) 參考博客: http://www.cnblogs.com/wupeiqi/articles/6307554.html - 基本使用 - 文件上傳,多文件上傳,文件空間管理 - XSS攻擊(過濾的函數或類) 下節課說...
僅供學習使用
Django建立項目時應該要作的幾件事
安裝 django 1.11.14 pip install django==1.11.14 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 卸載 django 1.11.14 pip uninstall django==1.11.14
建立 django 項目 django-admin startproject 項目名 django-admin startproject study
建立 app,到 study 項目名稱目錄下輸入 python manage.py startapp app名稱 python manage.py startapp app01
在 C:\Users\47311\AppData\Local\Programs\Python\Python38\Lib\site-packages\django\contrib\admin 目錄下的 widgets.py 中的152行刪除 , 逗號
在 pycharm 中打開 django 項目工程
建立好的項目工程
配置建立好的 app 應用(根據建立app時的名稱進行添加到 INSTALLED_APPS 中)
新建文件夾命名爲 templates -> 建立模板
在 項目的 settings 中進行註冊 templats ,本文中的 settings 均是指 項目下的 settings
在 TEMPLATES 下的 DIRS 中 添加 os.path.join(BASE_DIR,'templates')
建立靜態文件夾 static ,步驟如上所示
在 settings 中進行註冊 ,在最後一行位置添加 STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), )
修改頁面顯示的語言爲漢語 LANGUAGE_CODE 修改成
LANGUAGE_CODE = 'zh-hans'
修改時間 TIME_ZONE 爲北京時間 TIME_ZONE = 'Asia/Shanghai'
運行 django 項目命令 ,啓動也能夠選擇右上角的三角符號 python manage.py runserver
運行成功界面,django的版本不少,若是您成功了,請繼續努力.
django 命令行命令
django-admin startproject 項目名 django-admin startproject python manage.py makemigrations python manage.py migrate python manage.py startapp app名稱 python manage.py startapp 啓動運行 django python manage.py runserver
項目下的 urls 篇 urlpatterns = [ ] 其中主要是包含有各個 app 的路由 示例: url(r'^users/', include('users.urls', namespace='users')), url(r'^admin/', admin.site.urls),
settings 中的基礎知識 INSTALLED_APPS = [ ] 存放建立好的app名稱(app註冊) INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'users', '建立好的app名稱', ]
MIDDLEWARE = [] 中間件
TEMPLATES = [ ] 模板文件 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ['templates'], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] 'DIRS'能夠修改成 'DIRS': [os.path.join(BASE_DIR, 'templates')],
DATABASES = { } 數據庫 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '數據庫', 'USER': '用戶名', 'PASSWORD': '密碼', 'CHARSET': '字符集', 'HOST': 'IP地址', 'PORT': '端口', } } DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'webshop', 'USER': 'root', 'PASSWORD': 'root', 'CHARSET': 'UTF-8', 'HOST': '127.0.0.1', 'PORT': '3306', } }
設置中文 LANGUAGE_CODE = 'zh-hans'
時間顯示爲北京時間 TIME_ZONE = 'Asia/Shanghai'
配置 static 靜態目錄 STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), )
暫時尚未接觸到的點(慎用) SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' # hash加密使用的鹽值 SALT_KEY = "Hello" LOGIN_URL = '/users/login'
項目的 __init__ 文件中添加的內容 import pymysql pymysql.install_as_MySQLdb()
app 的urls(建立的.py文件) 導入 views from . import views urlpatterns = [ url(r'^login/$', views.user_login, name='user_login'), url(r'^register/$', views.register, name='register'), ]
使用 (?P<views 中的函數參數名稱>\d+) 獲取傳遞進來的參數給 views 中函數的參數 urlpatterns = [ url(r'^(?P<s_id>\d+)/detail_store', views.detail_store, name='detail_store'), url(r'^(?P<s_id>\d+)/(?P<status>\d+)/status_store', views.status_store, name='status_store'), ]
urlpatterns = [ url(r'^(?P<number>\d+)/(?P<goods_id>\d+)/shop_into/$', views.shop_into, name='shop_into'), url(r'^list_car/$', views.list_car, name='list_car'), url(r'^(?P<shopcar_id>\d+)/del_car/$', views.del_car, name='del_car'), ]
urlpatterns = [ url(r'^order_confirm/$', views.order_confirm, name='order_confirm'), url(r'^order_pay/$', views.order_pay, name='order_pay'), url(r'^order_done/$', views.order_done, name='order_done'), url(r'^order_list/$', views.order_list, name='order_list'), url(r'^(?P<order_id>\d+)/order_desc/$', views.order_desc, name='order_desc'), ]
url(r'^路由地址/$', views.函數名, name='名稱'), url(r'^(?P<函數參數名稱>\d+)/路徑名/$', views.函數名, name='名稱'),
關於路由系統,這裏只是寫出了最簡單的寫法,此處只是根據讀程序獲取到的部分知識
app 的 models,爲 views 做基礎,views在獲取到urls中的請求後,會調用一些方法
建立主鍵 -> 1.11.14 自動建立 id 列 在外鍵關聯時,自動加上 _id 名稱 id = models.AutoField(primary_key=True)
建立字符串 name 列 ,使用 models.CharField country = models.CharField(max_length=255, default='中國',verbose_name='城市') area = models.CharField(max_length=50, verbose_name='收貨人縣/區/')
使用 bool 類型 數據字段名稱 = models.BooleanField(default=False, verbose_name='xxx') is_default = models.BooleanField(default=False, verbose_name='是不是默認地址')
int 類型 , 使用 models.IntegerField age = models.IntegerField(default='20', verbose_name='用戶年齡') status = models.IntegerField(default=0, verbose_name='店鋪狀態') goods_count = models.IntegerField(verbose_name='購買數量')
image 圖片類型 使用 models.ImageField 變量名 = models.ImageField(upload_to='圖片路徑', default='圖片名', verbose_name='名稱') 變量名 = models.ImageField(upload_to='圖片路徑') logo = models.ImageField(upload_to='static/images/logo', default='static/images/logo/goods-style1.png', verbose_name='商品類型圖標') path = models.ImageField(upload_to='static/images/goods', default='static/images/goods/default.jpg', verbose_name='商品圖片') goods_image = models.ImageField(upload_to='static/images/goods') cover = models.ImageField(upload_to='static/images/store/', default='static/images/store/default.jpg', verbose_name='店鋪封面') header = models.ImageField(upload_to='static/images/headers', default='static/images/headers/default.jpg', verbose_name='用戶頭像')
text 描述 使用 models.TextField 變量名 = models.TextField(verbose_name= '名稱') 變量名 = models.TextField(null=True, blank=True,verbose_name= '名稱') intro = models.TextField(verbose_name='商品類別描述') intro = models.TextField(null=True, blank=True, verbose_name='商品圖片描述')
float 浮點數類型,使用 models.FloatField 變量名 = models.FloatField(verbose_name='名稱') 變量名 = models.FloatField(default=0.00, verbose_name='名稱') price = models.FloatField(verbose_name='商品價格') allMoney = models.FloatField(default=0.00, verbose_name='總計')
datetime 使用 models.DateTimeField 變量名 = models.DateTimeField(auto_now_add=True, verbose_name='名稱') openTime = models.DateTimeField(auto_now_add=True, verbose_name='開店時間') 注:能夠添加 datetime.now 用來在建立時,指定當前時間
foreignkey 外鍵 , 使用 models.ForeignKey 變量名 = models.ForeignKey(類名, null=True, blank=True, on_delete=models.CASCADE, verbose_name='名稱') parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, verbose_name='父級地址')
from app名稱.models import 類名 變量名 = models.ForeignKey(類名, on_delete=models.CASCADE, verbose_name='名稱') 注:類名能夠是外部導入或本models.py中建立的類名 from users.models import User user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='地址所屬')
一個models 類能夠存在兩個外鍵 goodsStore = models.ForeignKey(類名, on_delete=models.CASCADE, verbose_name='名稱') goodsType = models.ForeignKey(類名, on_delete=models.CASCADE, verbose_name='名稱') from store.models import Store goodsStore = models.ForeignKey(Store, on_delete=models.CASCADE, verbose_name='商品所屬店鋪') goodsType = models.ForeignKey(GoodsType, on_delete=models.CASCADE, verbose_name='商品類型')
從 django.contrib.auth.models 導入 User from django.contrib.auth.models import User user = models.ForeignKey(User, on_delete=models.CASCADE)
一對一 使用 models.OneToOneField 變量名 = models.OneToOneField(User, on_delete=models.CASCADE) user = models.OneToOneField(User, on_delete=models.CASCADE)
在這裏補充一點,字段還存在一對多和多對多
app 中的 views
def 函數名(request): 代碼塊 return 語句(是否存在參數) def 函數名(request,參數(一個或多個)): 代碼塊 return 語句(是否存在參數) @裝飾器(一個或多個) def 函數名(request): 代碼塊 return 語句(是否存在參數) @裝飾器(一個或多個) def 函數名(request,參數(一個或多個)): 代碼塊 return 語句(是否存在參數)
關於def 函數定義時,request 後面的參數 在進行路由分發時,使用 url(r'^(?P<g_id>\d+)/goods_detail/$', views.goods_detail, name='goods_detail'), 進行 get 請求傳遞進來的參數會給 g_id ,所以在 goods_detail 函數中要設置一個參數名爲 g_id def goods_detail(request, g_id): 代碼
注:有多少個?P<參數名> 就設置多少個參數,用來接收
代碼塊中可使用到不少知識,此處只是該項目使用到的基礎 request.method 判斷進行的哪種請求方式,GET仍是POST if request.method == 'GET': pass elif request.method == 'POST': pass else: pass
models.類名.objects.filter(表中字段(user)=request.user) filter 主要是用來過濾,使用了filter 以後還能夠繼續使用 filter進行過濾 address_list = models.Address.objects.filter(user=request.user)
對於使用了 filter 方法 的對象,可使用 len 進行判斷,是否已經存在javascript
sto = models.Store.objects.filter(name=name)
if len(sto) == 1:
return render(request, 'store/store_add.html', {"msg": "商鋪名稱已存在,請從新輸入"})
獲取 post 方式提交的數據 request.POST['名稱'] recv_name = request.POST['recv_name'] html 中數據以下,讓name的值於名稱相對應便可 <input type="text" name="recv_name" id="recv_name" autocomplete="off">
name = request.POST['name'].strip()
在進行獲取數據時,能夠添加 strip 進行字符串操做
對於 filter 獲取到的數據能夠進行遍歷 address_list = models.Address.objects.filter(user=request.user) 而且遍歷的元素對象具備 save 方法 能夠修改字段 Address 是類名,user , is_default 是 Address 表中的字段 from . import models address_list = models.Address.objects.filter(user=request.user) for addr in address_list: addr.is_default = False addr.save()
使用 __in 時,能夠直接寫明在某一個變量中 [0,1]
stores = models.Store.objects.filter(user=request.user, status__in=[0, 1])
添加表的一行數據 括號中 = 前面的都是表中的字段,後面是對應的值 使用 save 進行保存 變量 = models.類名(字段1 = 值1, 字段2 = 值2, user=request.user) 變量 .save() address = models.Address(recv_name=recv_name, recv_tel=recv_tel, province=province, city=city, area=area, street=street, desc=desc, is_default=True, user=request.user) address.save()
goods = models.Goods(name=name, price=price, stock=stock, desc=desc, goodSize=goodSize, goodsType=goodsType,goodsStore=store ) goods.save()
id 自增列不用添加
在使用 filter 獲取數據後,使用 order_by 進行排序 from app名稱.models import 類名 變量名 = 類名.objects.filter(user=request.user).order_by('名稱') shop_cars = ShopCar.objects.filter(user=request.user).order_by('-createTime')
在 filter 中使用 = 變量名 = 類名.objects.filter(字段名=值) goods_type1 = GoodsType.objects.filter(pk=1001)
在 filter 中使用 __in 變量名 = 類名.objects.filter(字段名__in=值) 變量名 = 類名.objects.filter(字段名__in=值)[:2] goods1_list = Goods.objects.filter(goodsType__in=goods_type1_2)[:4]
在 filter 中使用 __isnull 變量名 = 類名.objects.filter(字段名__isnull=True) allGoodsType = GoodsType.objects.filter(parent__isnull=True)
文件 files , 具體請查閱更多資料 變量名 = request.FILES['名稱'] path = request.FILES['path']
cover = request.FILES['cover']
cover 爲 html 中的 name 值 <input name="cover" type="file" ... >
使用 .get 獲取數據 變量 = 類名.objects.get(字段=變量或值) store_id = request.POST['goodsStore'] store = Store.objects.get(pk=store_id)
是否帶有 models 主要看導入包的方式 from . import models type2 = request.POST['type2'] goodsType = models.GoodsType.objects.get(pk=type2)
利用獲取到的對象的字段屬性進行賦值 變量 = models.Goods.objects.get(字段名1=參數) 變量= goods.字段名2 store = models.類名.objects.get(字段名1=字段名2) goods = models.Goods.objects.get(pk=g_id) goodsStore_id = goods.goodsStore_id store = models.Store.objects.get(pk=goodsStore_id) 注: 字段名根據實際須要進行修改
獲取全部數據 使用 all 變量名 = models.類名.objects.all() all_goods = models.Goods.objects.all()
獲取 GET 參數 變量名1 = request.GET['名稱'] parent_id = request.GET['parent_id'] 進行查找數據 變量名2 = models.類名.objects.filter(字段=變量名1) type2 = models.GoodsType.objects.filter(parent=parent_id)
使用 getlist 獲取多個數據 變量 = request.POST.getlist('名稱') shopcar_id_list = request.POST.getlist('buy_goods_id') 進行查找數據 變量2 = app名.models.類名.objects.filter(字段名__in=變量)
shopcar_list = shopcar.models.ShopCar.objects.filter(pk__in=shopcar_id_list)
關於字段中 user=request.user 的理解 MyOrder 中的 user 是 User 的外鍵,因此在使用時,要注意傳遞的屬性仍是一整個對象 my_order = models.MyOrder(user=request.user, address=addr, total=total) user = models.ForeignKey(User, on_delete=models.CASCADE)
使用 字段_set 能夠獲取到外鍵的表的字段,具體詳情請查閱更多資料 此處僅給出部分示例 for sc_id in shopcar_list: shopcart = shopcar.models.ShopCar.objects.get(pk=sc_id) order_item = models.MyOrderItem(goods_image=shopcart.goods.goodsimage_set.first().path, goods_name=shopcart.goods.name, goods_price=shopcart.goods.price, goods_count=shopcart.number, goods_money=shopcart.allMoney, my_order=my_order) order_item.save() total += shopcart.allMoney my_order.total = total my_order.save()
get 獲取寫法,比以前的更深刻一些 @login_required @require_GET def shop_into(request, number, goods_id): goods = Goods.objects.get(pk=goods_id) user = request.user try: shop_car = models.ShopCar.objects.get(user=user, goods=goods) shop_car.number += int(number) shop_car.allMoney = shop_car.number*goods.price shop_car.save() except: shop_car = models.ShopCar(goods=goods, number=number, user=user) shop_car.allMoney = int(shop_car.number)*goods.price shop_car.save() return redirect(reverse('shopcar:list_car'))
在使用 get 方法時,其中的 = 左側依舊爲字段名,=右側的爲get 獲取到的對象,user 爲 request.user goods = Goods.objects.get(pk=goods_id) user = request.user shop_car = models.ShopCar.objects.get(user=user, goods=goods)
request.user 擁有 id 屬性
使用 get 能夠獲取到字段進行參與表達式運算 shop_car.allMoney = shop_car.number*goods.price
刪除數據 使用 delete()
shopcar = models.ShopCar(pk=shopcar_id, user=user)
shopcar.delete()
使用 int 進行轉換 status = models.IntegerField(default=0, verbose_name='店鋪狀態') store = models.Store.objects.get(id=s_id) store.status = int(status)
獲取 session 使用 request.session 變量名 = request.session["名稱"] 示例: if code.lower() != request.session["code"].lower(): return render(request, "users/user_login.html", {"msg": "驗證碼錯誤!!"})
使用 authenticate from django.contrib.auth import authenticate user = authenticate(username=username, password=password1) password1 = utils.encryption(password) # 密碼加密 def encryption(key): pwd = hmac.new(key.encode('utf-8'), settings.SALT_KEY.encode('utf-8'), 'MD5') return pwd.hexdigest()
此時的 user 擁有 is_active 屬性,判斷是否登陸狀態
if user is not None: if user.is_active: login(request, user) try: return redirect(next_url) except: return redirect("/") else: return render(request, "users/user_login.html", {"msg": "您的帳號已被鎖定,請聯繫管理員"}) else: return render(request, "users/user_login.html", {"msg": "用戶名或者密碼錯誤"})
導入 User from django.contrib.auth.models import User user = User.objects.create_user(username=username, password=password) user.save()
代碼塊介紹以後,進行return返回
return render(request, 'templates 下的文件夾名稱/文件名.html', {'名稱': 值}) return render(request, 'address/address_add.html', {'address_list': address_list})
能夠存在多個參數,goods 爲在app目錄下templates 中的 goods 文件夾
return render(request, 'goods/goods_show.html', {'goods': goods, 'store': store, 'nums':nums})
return redirect(reverse('名稱1:值1', kwargs={'參數名': 值})) html 中的數據 <a href="{% url '名稱1:值1' 空格 參數名 %}">內容</a> store_id = request.POST['goodsStore'] return redirect(reverse('store:detail_store', kwargs={'s_id': store_id})) 在這裏 'store:detail_store' 爲 反向解析 <a href="{% url 'store:detail_store' store.id %}">查看詳情</a>
from django.core.serializers import serialize type1 = models.GoodsType.objects.filter(parent=parent_id) return HttpResponse(serialize('json', type1)) #轉換成json類型的字符串
return redirect(reverse('shopcar:list_car')) <a href="{% url 'shopcar:list_car'%}" style="border: none;color: #00b7ee;width: 100px;height: 40px" >返回購物車</a>
from io import BytesIO def code(request): img, msg = utils.create_code() f = BytesIO() img.save(f, "PNG") # 將驗證碼的值存儲到session request.session["code"] = msg return HttpResponse(f.getvalue(), "image/png")
utils.py 文件,本身建立,若是須要能夠複製粘貼
import hmac import string import random from PIL import Image, ImageDraw, ImageFont from django.conf import settings # 密碼加密 def encryption(key): pwd = hmac.new(key.encode('utf-8'), settings.SALT_KEY.encode('utf-8'), 'MD5') return pwd.hexdigest() # 驗證碼 def getRandomChar(count=4): # 生成隨機字符串 # string模塊包含各類字符串,如下爲小寫字母加數字 ran = string.ascii_lowercase + string.ascii_uppercase + string.digits char = '' for i in range(count): char += random.choice(ran) return char # 返回一個隨機的RGB顏色 def getRandomColor(): return random.randint(50, 150), random.randint(50, 150), random.randint(50, 150) def create_code(): # 建立圖片,模式,大小,背景色 img = Image.new('RGB', (120, 30), (255, 255, 255)) # 建立畫布 draw = ImageDraw.Draw(img) # 設置字體 font = ImageFont.truetype('ARIALUNI.TTF', 25) code = getRandomChar() # 將生成的字符畫在畫布上 for t in range(4): draw.text((25*t+7, 0), code[t], getRandomColor(), font) # 生成干擾點 增長識別的難度 for _ in range(random.randint(99, 110)): # 位置,顏色 draw.point((random.randint(0, 120), random.randint(0, 30)), fill=getRandomColor()) # 生成干擾線 增長識別的難度 for _ in range(random.randint(8, 15)): begin = random.randint(0, 120), random.randint(0, 50) end = random.randint(0, 120), random.randint(0, 50) draw.line([begin, end], fill=getRandomColor()) # 使用模糊濾鏡使圖片模糊 # img = img.filter(ImageFilter.BLUR) return img, code
HTML 文件
此處只例舉一些基本語句,具體用法請查閱相關資料
{% block 名稱 %}{% endblock %}
進行繼承模板 {% extends '名稱.html' %}
{% csrf_token %} 服務器返回頁面的同時向前端返回一串隨機字符 post提交時服務器會驗證這串字符來確保用戶是在服務端返回的表單頁面中提交的數據
<tbody> {% for addr in address_list %} <tr> <td>{{addr.字段1}}</td> <td>{{addr.字段2}}</td> <td>{{addr.字段3}}</td> <td> {% if addr.is_default %} 默認地址 {% endif %} </td> </tr> {% empty %} <tr>提示信息</tr> {% endfor %} </tbody>
{% if request.user.username %} html 語句 {% else %} html 語句 {% endif %}
{{request.user.userinfo.nickname}}
<form action="{%url 'orders:order_done' %}" method="post">
<input type="hidden" name="sc" value="{{sc.id}}">
<span>{{shopcar.number}}</span>
下單時間:{{order.order_time|date:'Y-m-d G:i:s'}}<br>
{% if store.status == 0 %} <span style="font-size: 16px">店鋪狀態:正在營業</span> {% elif store.status == 1 %} <span style="font-size: 16px">店鋪休息</span> {% endif %}
{{goods.desc|truncatechars:22}} 截取前22個字符
{% for t in type1 %} <option value="{{t.id}}" >{{t.name}}</option> {% endfor %}
html 下還有不少的用法,此處僅列舉出了這些
django 項目獲取連接
連接:https://pan.baidu.com/s/1oWcHHbSR0JHmqr9qCzZGwA 提取碼:Hany