python初試三

chatGPT發表於2023-12-21

在之前的程式中,我們直接生成一個字串,作為http回覆,返回給客戶端。這一過程中使用了django.http.HttpResponse()。


在這樣的一種回覆生成過程中,我們實際上將資料和檢視的格式混合了到上面的字串中。看似方便,卻為我們的管理帶來困難。想像一個成熟的網站,其顯示格式會有許多重複的地方。如果可以把資料和檢視格式分離,就可以重複使用同一檢視格式了。


Django中自帶的模板系統,可以將檢視格式分離出來,作為模板使用。這樣,不但檢視可以容易修改,程式也會顯得美觀大方。


模板初體驗


我們拿一個獨立的templay.html檔案作為模板。它放在templates/west/資料夾下。檔案系統的結構現在是:


mysite/

├── mysite

├── templates

│   └── west

└── west


templay.html檔案的內容是:

<h1>{{ label }}</h1>

可以看到,這個檔案中,有一個奇怪的雙括號包起來的陌生人。這就是我們未來資料要出現的地方。而相關的格式控制,即<h1>標籤,則已經標明在該模板檔案中。


 


我們需要向Django說明模板檔案的搜尋路徑,修改mysite/settings.py,新增:

# Template dir

TEMPLATE_DIRS = (

    os.path.join(BASE_DIR, 'templates/west/'),

)

如果還有其它的路徑用於存放模板,可以增加該元組中的元素,以便Django可以找到需要的模板。


 


我們現在修改west/views.py,增加一個新的物件,用於向模板提交資料:

# -*- coding: utf-8 -*-


#from django.http import HttpResponse

from django.shortcuts import render


def templay(request):

    context          = {}

    context['label'] = 'Hello World!'

    return render(request, 'templay.html', context)


可以看到,我們這裡使用render來替代之前使用的HttpResponse。render還使用了一個詞典context作為引數。這就是我們的資料。


context中元素的鍵值為'label',正對應剛才的“陌生人”的名字。這樣,該context中的‘label’元素值,就會填上模板裡的坑,構成一個完整的http回覆。


作為上節內容的一個小練習,自行修改west/urls.py,讓的URL請求可以找到相應的view物件。


訪問,可以看到頁面:


流程


再來回顧一下整個流程。west/views.py中的templay()在返回時,將環境資料context傳遞給模板templay.html。Django根據context元素中的鍵值,將相應資料放入到模板中的對應位置,生成最終的http回覆。



這一模板系統可以與Django的其它功能相互合作。上一回,我們從資料庫中提取出了資料。如果將資料庫中的資料放入到context中,那麼就可以將資料庫中的資料傳送到模板。


修改上次的west/views.py中的staff:


def staff(request):

    staff_list  = Character.objects.all()

    staff_str  = map(str, staff_list)

    context   = {'label': ' '.join(staff_str)}

    return render(request, 'templay.html', context)


迴圈與選擇


Django實際上提供了豐富的模板語言,可以在模板內部有限度的程式設計,從而更方便的編寫檢視和傳送資料。


我們下面體驗一下最常見的迴圈與選擇。


上面的staff中的資料實際上是一個資料容器,有三個元素。剛才我們將三個元素連線成一個字串傳送。


實際上,利用模板語言,我們可以直接傳送資料容器本身,再迴圈顯示。修改staff()為:


def staff(request):

    staff_list = Character.objects.all()

    return render(request, 'templay.html', {'staffs': staff_list})


從資料庫中查詢到的三個物件都在staff_list中。我們直接將staff_list傳送給模板。


將模板templay.html修改為:


{% for item in staffs %}

<p>{{ item.id }}, {{item}}</p>

{% endfor %}


我們以類似於Python中for迴圈的方式來定義模板中的for,以顯示staffs中的每個元素。


還可以看到,物件.屬性名的引用方式可以直接用於模板中。


選擇結構也與Python類似。根據傳送來的資料是否為True,Django選擇是否顯示。使用方式如下:


{% if condition1 %}

   ... display 1

{% elif condiiton2 %}

   ... display 2

{% else %}

   ... display 3

{% endif %}


其中的elif和else和Python中一樣,是可以省略的。


模板繼承


模板可以用繼承的方式來實現複用。我們下面用templay.html來繼承base.html。這樣,我們可以使用base.html的主體,只替換掉特定的部分。


新建templates/west/base.html:


<html>

  <head>

    <title>templay</title>

  </head>


  <body>

    <h1>come from base.html</h1>

    {% block mainbody %}

       <p>original</p>

    {% endblock %}

  </body>

</html>


該頁面中,名為mainbody的block標籤是可以被繼承者們替換掉的部分。


我們在下面的templay.html中繼承base.html,並替換特定block:


{% extends "base.html" %}


{% block mainbody %}


{% for item in staffs %}

<p>{{ item.id }},{{ item.name }}</p>

{% endfor %}


{% endblock %}


第一句說明templay.html繼承自base.html。可以看到,這裡相同名字的block標籤用以替換base.html的相應block。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70026630/viewspace-3001047/,如需轉載,請註明出處,否則將追究法律責任。

相關文章