官术网_书友最值得收藏!

3.11 使用模板系統

前面的detail.html模板過于簡單,現實中Django的模板系統非常強大,可以制作豐富多彩的網頁效果。將以下代碼復制到模板文件detail.html中:

上面代碼中的雙大括號形式({{ }})是Django模板語言中的屬性訪問語法,采用英文句點的方式訪問變量的屬性,如示例中的代碼{{ question.question_text }},其中question是視圖通過字典形式傳遞給模板的變量,通過“.”訪問question的屬性。

模板中{% %}形式的代碼是Django模板語言的函數語法,上例中{% for choice in question.choice_set.all %}是一個for循環,循環對象是question.choice_set.all,該對象等價于Python語法中的question.choice_set.all(),返回一個可迭代的數組。Django模板函數需要有結束標記,本例中{% for %}循環的結束標記是{% endfor %}。

3.11.1 模板中的超鏈接

在前面polls/index.html模板中,使用硬編碼的形式編寫HTML超鏈接:

    <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>

當項目中存在很多模板并且多個模板都使用同一個URL的時候,如果需要修改URL,那么這種書寫方式會給開發人員帶來很大的工作量。此時可以通過對URL命名的方式解決這類問題,之前介紹URL時講到了URL的命名,本例中的URL如下:

    path('<int:question_id>/', views.detail, name='detail'),

使用URL重新修改模板如下:

    <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

其中,{% url %}是Django的模板標簽,用于定義URL。該標簽將會在polls/urls模塊中查找名為“detail”的URL,question.id作為參數傳遞給URL,如果需要傳遞多個參數時,只要在question.id后面緊跟一個空格然后繼續添加參數即可。

通過{% url %}模板標簽可以快速修改模板中的URL,極大地提高工作效率,以保證代碼安全。例如在這個URL中增加一個節點,如改成polls/specifics/12/,此時只要修改urls.py中的定義即可:

    path('specifics/<int:question_id>/', views.detail, name='detail'),

3.11.2 為超鏈接添加命名空間

命名空間可以有效地隔離變量,防止出現名稱相同的變量之間調用混亂的問題。Django中可以為URL定義命名空間。試想一下,在真實項目中往往會存在很多應用程序,而不同應用程序之間可能存在同名的視圖,如多個應用程序中都存在detail視圖,那么在{% url %}標簽中如何確定調用哪一個應用程序中的URL呢?此時可以通過為URL添加命名空間的方式解決以上問題。

打開polls/urls.py文件,在其中添加app_name變量來設置URLconf的命名空間,修改后的代碼如下:

接下來修改polls/index.html模板中的URL,為detail視圖添加命名空間:

此時單擊index頁面中的超鏈接仍能正常顯示。

主站蜘蛛池模板: 新源县| 同仁县| 大冶市| 青岛市| 东兰县| 漳浦县| 高碑店市| 盈江县| 万山特区| 阆中市| 获嘉县| 河源市| 扶余县| 高平市| 蒙自县| 霍邱县| 南郑县| 通州市| 莫力| 青神县| 华阴市| 南城县| 永寿县| 明水县| 榆社县| 建宁县| 西安市| 建平县| 全椒县| 乐山市| 松桃| 洪江市| 墨竹工卡县| 蓝田县| 长白| 满城县| 鹤峰县| 青川县| 临湘市| 拉孜县| 长汀县|