1. 程式人生 > >web後端-Django學習筆記02

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
​
​