web後端-Django學習筆記02
一:模板變數
通過檢視函式中向模板可以傳遞資料,傳遞到模板中的資料可以通過 模板變數的方式顯示出來,通過模板語法{{ 模板變數名 }}。 傳遞給模板的資料,包括字串、數字等簡單資料型別,還可以包括 字典、物件、列表。
可以通過模板中的“點語法”獲取複雜物件的相關值。例如:字典中的某個key對應的值,物件的屬性、物件的方法(除了self外,無參),列表的某一項(不能訪問負數索引)。
二:模板標籤——控制標籤
1. if標籤
{% if 布林值 %} 布林值為True時,顯示的內容 {% else %} 布林值為False時,顯示的內容 {% endif %} 注意:可以在if後新增and、or、not,邏輯判斷符號。 判斷是否相等,使用"=="符號。
補充:可以有多分支判斷: {% if score >= 90 %} 優秀 {% elif score >= 80 %} 良好 {% elif score >= 60 %} 一般 {% else %} 不及格 {% endif %}
2. for標籤
{% for 迴圈變數 in 迴圈序列 %} {{ 迴圈變數 }} {% empty %} 如果迴圈序列為空,執行此處{% endfor %}
注意:使用for標籤迴圈時,有一個forloop模板變數,用來記錄當前迴圈進度的。 forloop的常用屬性:counter、first、last。 如果要進行反向迴圈,則在for標籤的迴圈序列後加上reversed。
三:模板包含與繼承
1. 模板包含
{% include '包含的模板地址' %}
2. 模板繼承
父模板(基模板)提前定義若干個block塊標籤,子模板可以繼承、重寫、新增父模板block塊中的內容。子模板通過{% extends '父模板位置' %}繼承父模板。父模板使用{% block 塊名稱 %} {% endblock %}進行“挖坑”,子模板“填坑”。子模板如果想要在父模板的某個塊中新增內容,則先要使用{{ block.super }}獲取父模板中該塊的內容。
四:模板過濾器
模板過濾器的作用是將要輸出的變數進行過濾後顯示,變數後面新增管道符,管道 符後是過濾器名稱,有的過濾器需要傳遞引數。 常用過濾器: length 獲取模板變數對應值的長度 first 獲取第一個元素 upper 變為大寫 lower 變為小寫 truncatewords 擷取指定數量的字元,該過濾器需要引數 date 顯示日期,該過濾器需要引數,eg: date:"Y-m-d H:i:s" addslashes 在單引號、雙引號、反斜線前新增斜線 add 在模板變數上新增指定的資料
五、附錄
1、Django專案原始碼
#主路由 (Djangoday2/urls.py) from django.contrib import admin from django.urls import path,include urlpatterns = { path('admin/', admin.site.urls), path('myapp/', include('myapp.urls')), path('stuapp/',include('studentapp.urls')),
1.1 myapp
#子路由配置 (Djangoday2/myapp/urls.py) from django.urls import path,include from myapp.views import * urlpatterns = [ path('dict/',pass_dict), path('student/',pass_student), path('fruits/',pass_list), path('ifdemo/',athletes_coaches), path('fordemo/',show_books), path('gomain/',go_main), path('gochild/',go_child), path('filter/',filter_demo) ]
#檢視函式(Djangoday2/myapp/view.py) from django.shortcuts import render from myapp.student import Student from datetime import datetime # Create your views here. def pass_dict(request): product = {'name':'洗衣機','price':12.5,'brand':'中國洗衣機'} return render(request,'mytemplates/product.html',{'product':product}) def pass_student(request): stu = Student("東方不敗",25,'女',99.5) return render(request,'mytemplates/student.html',{'student':stu}) def pass_list(request): fruits = ["蘋果","香蕉","j橘子"] return render(request,'mytemplates/fruits.html',{'fruits':fruits}) def athletes_coaches(request): athletes = ["劉翔","喬丹"] # coaches = ["張三","李四"] coaches =[] chearleaders = ["小紅","小麗"] a,b = 100,50 return render(request,'templatetags/ifdemo.html',locals()) def show_books(request): books = ["三國演義","西遊記","水滸傳","紅樓夢"] games = [] return render(request,'templatetags/fordemo.html',locals()) def go_main(request): return render(request,'templateinclude/main.html') def go_child(request): return render(request,'extends/child.html') def filter_demo(request): sports = ["basktball","pingpang","football"] sentenes = "you are a fulish man and you have to improve yourself..." t = datetime.now() say = "he said:'you epress you as fluently as you can'" name = 100 return render(request,'filter/filterdemo.html', locals())
2、顯示模板
<! product.html 字典傳遞訪問 Djangoday2/myapp/mytemplates/product.html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模板接受字典</title> </head> <body> <h3>產品名稱:{{product.name }}</h3> <h3>產品價格:{{product.price}}</h3> <h3>產品品牌:{{product.brand }}</h3> </body> </html>
<!學生類傳遞訪問模板 Djangoday2/myapp/mytemplates/student.html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模板接收物件</title> </head> <body> <h3>學生姓名:{{ student.name }}</h3> <h3>學生性別:{{ student.sex }}</h3> <h3>學生年齡:{{ student.age }}</h3> <h3>學生成績:{{ student.score }}</h3> <h3>呼叫方法:{{ student.learn }}</h3> </body> </html>
#student類定義 class Student: def __init__(self,name,age,sex,score): self.name = name self.age = age self.sex = sex self.score = score def learn(self): return "我叫"+self.name+"正在學習..."
<!列表傳遞訪問模板 Djangoday2/myapp/mytemplates/fruits.html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模板接受列表</title> </head> <body> <h3>列表中的第一項:{{ fruits.0 }}</h3> <h3>列表中的第二項:{{ fruits.1 }}</h3> <h3>列表中的第三項:{{ fruits.2 }}</h3> </body> </html>
if標籤 myapp/templates/templatetags/ifdemo,html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>條件判斷</title> </head> <body> {% if athletes and coaches %} <h3>ther are some athletes and coaches</h3> {% else %} <h3>沒有運動員和教練</h3> {% endif %} {% if not coaches %} <h3>沒有教練</h3> {% endif %} {% if athletes or coaches %} <h3>有運動員或者教練</h3> {% endif %} {% if athletes and coaches or chearleaders %} <h3>there are athletes and coaches or chearleaders</h3> {% endif %} {% if a == b %} <h3>a與b相等</h3> {% else %} <h3>a與b不相等</h3> {% endif %} </body> </html>
for 標籤 myapp/templates/templatetags/ifdemo,html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>書籍資訊</title> <style> .first{ color: red; } </style> </head> <body> <ul> {% for book in books %} {# books後+reversed倒序#} {% if forloop.first%}<li class="first">{% else %}<li>{% endif %} {{ book }} </li> {% endfor %} </ul> {% for book in books %} {{ book }} {% if not forloop.last %}|{% endif %} {% endfor %} <br/> {% for game in gemes %} {{ game }} {% empty %} 怎麼沒有遊戲 {% endfor %} </body> </html>
包含標籤 myapp/templates/templateinclude/nav.html 首頁 娛樂 電影 新聞 其他 包含標籤 myapp/templates/templateinclude/footer.html 聯絡電話:158xxxxx 友情連結:百度 搜狐 騰訊 包含標籤 myapp/templates/templateinclude/main.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>主頁面</title> </head> <body> {% include 'templateinclude/nav.html' %} <h3>welcome to our web site...</h3> {% include 'templateinclude/footer.html' %} </body> </html>
繼承標籤. 父模板myapp/templates/extend/base.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}{% endblock %}</title> </head> <body> <h3>歡迎光臨</h3> <br/> {% block content %} 中一些書。。。<br/> 開公司。。。。<br/> {% endblock %} <br/> {% block footer %} <div> 聯絡地址:西安市 <br/> 聯絡電話:15824525<br/> 聯絡單位:市委辦公室<br/> </div> {% endblock %} </body> </html> 子模版 myapp/templates/extend/base.html {% extends 'extends/base.html' %} {% block title %} 新任書記{% endblock %} {% block content %} {{ block.super }} #繼承 反腐敗。。。。<br/> {% endblock %}
模板過濾器 myapp/templates/filter/filter.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>演示過濾器</title> </head> <body> <h3>列表長度;{{ sports|length }}</h3> <h3>第一個大寫:{{ sports|first|upper }}</h3> <h3>獲取5個單詞:{{ sentenes|truncatewords:"5" }}</h3> <h3>現在時間:(無過濾器){{ t }}</h3> <h3>現在時間(有date過濾器){{ t|date:"Y-m-d H:i:s" }}</h3> <h3>addslashes過濾器:{{ say| addslashes }}</h3> <h3>add過濾器:{{ name|add:"5" }}</h3> </body> </html>
1.2studentapp
#子路由配置 from django.urls import path from studentapp.views import * urlpatterns = [ path('students/',show_student), path('student/<int:stuid>/',select_student), ]
#檢視函式 from django.shortcuts import render from studentapp.student import Student students =[] def show_student(requert): stu1 =Student(1,"風清揚",25,69.5) stu2 = Student(2, "張三", 15, 90) stu3 = Student(3, "令狐沖", 35, 84) stu4 = Student(4, "小麗", 29, 89.5) stu5 = Student(5, "東方不敗", 23, 58.5) # students = [] students.append(stu1) students.append(stu2) students.append(stu3) students.append(stu4) students.append(stu5) return render(requert,'students.html',{"students":students}) def select_student(request,stuid): for student in students: if student.stuid == stuid: return render(request,'student_detail.html',{"student":student})
#student類定義 class Student: def __init__(self,stuid, name,age, score): self.stuid = stuid self.name = name self.age = age self.score = score
<!顯示模板> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>學生資訊</title> </head> <body> <table border="1" align="center"> <thead> <tr> <th>學號</th> <th>姓名</th> <th>年齡</th> </tr> </thead> <tbody> {% for student in students %} <tr> <td>{{ student.stuid }}</td> <td><a href="/stuapp/student/{{ student.stuid }}"> {{ student.name }}</a></td> <td>{{ student.age }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
<!顯示詳細資訊,超連結後模板> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ student.name }}</title> </head> <body> <h3>學號:{{ student.stuid }}</h3> <h3>姓名:{{ student.name }}</h3> <h3>年齡:{{ student.age }}</h3> <h3>成績:{{ student.score }}</h3> </body> </html>
2、瀏覽器訪問結果
2.1 myapp
http://localhost:8000/myapp/fordemo/ #for標籤結果 訪問
- 三國演義
- 西遊記
- 水滸傳
- 紅樓夢
三國演義 | 西遊記 | 水滸傳 | 紅樓夢
怎麼沒有遊戲
http://localhost:8000/myapp/ifdemo/ #if標籤結果訪問
沒有運動員和教練
沒有教練
有運動員或者教練
there are athletes and coaches or chearleaders
a與b不相等
http://localhost:8000/myapp/gomain/ #包含標籤訪問
首頁 娛樂 電影 新聞 其他
welcome to our web site...
聯絡電話:158xxxxx 友情連結:百度 搜狐 騰訊
http://localhost:8000/myapp/gochild/ #繼承模板訪問
歡迎光臨
中一些書。。。
開公司。。。。
反腐敗。。。。
聯絡地址:西安市
聯絡電話:15824525
聯絡單位:市委辦公室
http://localhost:8000/myapp/filter/ #模板過濾器
列表長度;3
第一個大寫:BASKTBALL
獲取5個單詞:you are a fulish man ...
現在時間:(無過濾器)Oct. 5, 2018, 4:12 p.m.
現在時間:(有date過濾器)2018-10-05 16:12:32
slashes過濾器:he said:\'you epress you as fluently as you can\'
addslashes過濾器:105
2.2 studentapp
http://localhost:8000/stuapp/students/ #學生資訊查詢
學號 姓名 年齡
1 風清揚 25
2 張三 15
3 令狐沖 35
4 小麗 29
5 東方不敗 23
# 姓名超連結:
http://localhost:8000/stuapp/student/1/ #自動生成
學號:1
姓名:風清揚
年齡:25
成績:69.5