Django 模板分割及多語言支持案例【需求文檔】-->【實現方案】

Django 模板分割及多語言支持案例

這個案例旨在提供一個清晰的示范,展示如何將復雜的頁面分解為多個可復用的模板組件,使代碼更加模塊化和易于管理。希望這篇案例文章對你有所幫助。

概述
在 Django 項目開發中,使用模板分割和多語言支持能有效提升代碼的可維護性和用戶體驗。本案例通過一個簡單的博客項目,展示如何將 Django 模板拆分為多個文件,并實現多語言支持。

需求文檔

  1. 背景
    在開發Django項目時,將模板分割成多個文件并實現多語言支持是提高代碼可維護性和用戶體驗的重要方法。本項目旨在展示如何使用Django模板進行模塊化開發和多語言支持。通過一個簡單的博客項目,我們將實現頁面分割、文章列表顯示及商品信息展示,并根據語言切換進行動態更新。

  2. 功能需求
    2.1 基礎模板

功能:存儲頁面的基礎配置,提供頁面結構和通用樣式。

文件名:base.html

詳細描述:

包含HTML頭部信息。

提供通用的樣式定義。

定義內容插入塊 {% block content %},供其他頁面繼承和填充內容。

2.2 主頁模板

功能:顯示主頁內容,包含語言切換選項和文章列表。

文件名:home.html

詳細描述:

繼承自 base.html。

定義頁面標題塊 {% block title %}。

顯示當前語言。

提供語言切換下拉菜單。

插入文章列表模板 {% include “article_list.html” %}。

2.3 文章列表模板

功能:循環顯示文章列表,根據當前語言顯示相應的文章標題和概括。

文件名:article_list.html

詳細描述:

使用 {% for %} 循環顯示所有文章。

根據當前語言顯示中文或英文文章標題及概括。

插入相應語言的商品列表模板 {% include “products_list_cn.html” %} 或 {% include “products_list_en.html” %}。

2.4 中文商品列表模板

功能:顯示文章中的商品列表,最多顯示5個商品。

文件名:products_list_cn.html

詳細描述:

根據是否存在商品標題,動態插入商品部分模板 {% include “products_part_1_cn.html” %} 至 {% include “products_part_5_cn.html” %}。

2.5 商品部分模板

功能:顯示具體的商品信息。

文件名:products_part_1_cn.html 至 products_part_5_cn.html

詳細描述:

顯示商品標題、概括和圖片。

根據商品信息動態生成頁面內容。

  1. 界面展示
    3.1 主頁

當前語言:顯示當前選擇的語言。

語言切換:提供語言選擇下拉菜單,用戶可切換語言。

文章列表:根據選擇的語言顯示對應的文章標題和概括。

商品列表:根據文章顯示對應的商品列表和詳細信息。

3.2 文章與商品展示

文章標題:根據語言顯示中文或英文標題。

文章概括:顯示文章的簡短概括,并根據語言切換。

商品信息:根據語言動態顯示商品標題、概括和圖片。

  1. 業務邏輯
    4.1 模板繼承

home.html 繼承自 base.html,提供頁面的基礎結構和通用樣式。

使用 {% block title %} 和 {% block content %} 定義可插入內容。

4.2 語言切換

在 home.html 中提供語言切換下拉菜單,并通過 JavaScript 實現頁面語言切換。

根據選擇的語言參數 current_language 動態加載文章和商品內容。

4.3 文章與商品顯示

使用 {% for article in articles %} 循環遍歷所有文章。

根據 current_language 判斷顯示中文或英文的文章標題和概括。

根據文章中的商品信息,動態加載相應的商品部分模板。

  1. 總結
    通過本需求文檔,我們詳細描述了Django項目中模板分割與多語言支持的實現方法。項目包含基礎模板、主頁模板、文章列表模板和商品部分模板,并通過語言切換動態加載對應內容,提升了代碼的可維護性和用戶體驗。

具體實現

基礎模板:base.html
基礎模板 base.html 用于存儲頁面的基礎配置,并可被其他頁面繼承和調用。它包含了 HTML 頭部信息和頁面主體結構:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>{% block title %}主頁{% endblock %}</title><!-- Google Fonts --><link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap" rel="stylesheet" /><!-- Tailwind CSS CDN --><script src="https://cdn.tailwindcss.com"></script><style>body {font-family: 'Roboto', sans-serif;}.hover-arrow::after {content: '>';color: #a0aec0;right: 0px;position: absolute;font-weight: bold;font-size: 24px;width: 25px;height: 36px;top: 25px;}</style>
</head>
<body class="bg-gray-900 text-white"><div class="max-w-3xl mx-auto py-8 px-4">{% block content %}{% endblock %}</div>
</body>
</html>

主頁模板:home.html
主頁模板 home.html 繼承自 base.html,并包含頁面標題、語言切換選項和文章列表:

{% extends "base.html" %}{% block title %}主頁{% endblock %}{% block content %}<div class="mb-4"><span class="text-white text-xl font-bold">當前語言: {{ current_language }}</span></div><div class="mb-4"><label for="language-select" class="text-white text-xl">選擇語言: </label><select id="language-select" onchange="changeLanguage(this)"><option value="cn" {% if current_language == 'cn' %}selected{% endif %}>簡體中文</option><option value="en" {% if current_language == 'en' %}selected{% endif %}>English</option></select></div>{% include "article_list.html" %}<script>function changeLanguage(select) {const lang = select.value;const url = new URL(window.location.href);url.searchParams.set('lang', lang);window.location.href = url.toString();}</script>
{% endblock %}

文章列表模板:article_list.html
article_list.html 用于循環顯示文章列表,根據當前語言顯示相應的標題和文章概括,并插入商品列表模板:

{% for article in articles %}
<br>{% if article.title_en and current_language == 'en' %} <div class="flex items-center mb-6"><div class="w-8 h-8 bg-orange-500 rounded-full flex items-center justify-center"><span class="text-white text-xl font-bold">Hot</span></div><div class="ml-3"><h1 class="text-lg font-bold"><a href="/article/{{ article.id }}/?lang={{ current_language }}" class="text-blue-400 hover:underline">{{ article.title_en }}</a></h1></div>
</div>
<p class="text-gray-400 mb-6 leading-relaxed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{% with summary=article.summary_en|default_if_none:""|slice:":80" %}{{ summary|ljust:80 }}{% endwith %}
</p>
{% include "products_list_en.html" %}
{% endif %}{% if article.title_cn and current_language == 'cn' %} <div class="flex items-center mb-6"><div class="w-8 h-8 bg-orange-500 rounded-full flex items-center justify-center"><span class="text-white text-xl font-bold"></span></div><div class="ml-3"><h1 class="text-lg font-bold"><a href="/article/{{ article.id }}/?lang={{ current_language }}" class="text-blue-400 hover:underline">{{ article.title_cn }}</a></h1></div>
</div>
<p class="text-gray-400 mb-6 leading-relaxed">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{% with summary=article.summary_cn|default_if_none:""|slice:":80" %}{{ summary|ljust:80 }}{% endwith %}
</p>
{% include "products_list_cn.html" %}
{% endif %}{% endfor %}

商品列表模板:products_list_cn.html
products_list_cn.html 用于顯示中文商品列表。根據該篇文章是否插入商品,最多5個,最少0個 來進行顯示:

<div class="space-y-4">{% if article.product_1_title_cn %}{% include "products_part_1_cn.html" %}{% endif %}{% if article.product_2_title_cn %}{% include "products_part_2_cn.html" %}{% endif %}{% if article.product_3_title_cn %}{% include "products_part_3_cn.html" %}{% endif %}{% if article.product_4_title_cn %}{% include "products_part_4_cn.html" %}{% endif %}{% if article.product_5_title_cn %}{% include "products_part_5_cn.html" %}{% endif %}
</div>

商品部分模板:products_part_1_cn.html
products_part_1_cn.html 用于顯示文章中的第一個商品:

<a href="{{ article.product_1_link_cn }}" class="block"><div class="relative bg-gray-800 p-4 rounded-lg hover:bg-gray-700 cursor-pointer hover-arrow transition-all"><h2 class="text-lg font-bold mb-1">{{ article.product_1_title_cn }}</h2><p class="text-gray-400 text-sm" style="padding-right: 120px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{% with summary=article.product_1_summary_cn|default_if_none:""|slice:":80" %}{{ summary|ljust:80 }}{% endwith %}</p>{% if article.image_1 %}<div class="absolute top-2 right-12 w-16 h-16" {% if article.tag_choice_1 == 'circle_image' %} style="border-radius: 50%; overflow: hidden;" {% elif article.tag_choice_1 == 'square_image' %} style="border-radius: 0;" {% elif article.tag_choice_1 == 'triangle_image' %} style="clip-path: polygon(50% 0%, 0% 100%, 100% 100%);" {% elif article.tag_choice_1 == 'pentagon_image' %} style="clip-path: polygon(50% 0%, 100% 38%, 82% 100%, 18% 100%, 0% 38%);" {% elif article.tag_choice_1 == 'hexagon_image' %} style="clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);" {% else %} style="display: none;" {% endif %}><img src="{{ article.image_1 }}" alt="Article Image" class="w-full h-full object-cover"></div>{% endif %}</div>
</a>

商品部分模板:products_part_2_cn.html - products_part_5_cn.html
商品部分模板的配置方式類似于 products_part_1_cn.html。對于每個商品部分,都需要創建相應的模板文件 products_part_2_cn.html 到 products_part_5_cn.html,并按照上述方式進行配置。

這樣一來,通過基礎模板、主頁模板、文章列表模板和商品部分模板的組合,可以實現頁面的模塊化開發和多語言支持,提高代碼的可維護性和用戶體驗。

英文商品列表模板:products_list_en.html
products_list_en.html 用于顯示英文商品列表。根據該篇文章是否插入商品,最多5個,最少0個來進行顯示:

<div class="space-y-4">{% if article.product_1_title_en %}{% include "products_part_1_en.html" %}{% endif %}{% if article.product_2_title_en %}{% include "products_part_2_en.html" %}{% endif %}{% if article.product_3_title_en %}{% include "products_part_3_en.html" %}{% endif %}{% if article.product_4_title_en %}{% include "products_part_4_en.html" %}{% endif %}{% if article.product_5_title_en %}{% include "products_part_5_en.html" %}{% endif %}
</div>

英文商品部分模板:products_part_1_en.html
products_part_1_en.html 用于顯示文章中的第一個英文商品:

<a href="{{ article.product_1_link_en }}" class="block"><div class="relative bg-gray-800 p-4 rounded-lg hover:bg-gray-700 cursor-pointer hover-arrow transition-all"><h2 class="text-lg font-bold mb-1">{{ article.product_1_title_en }}</h2><p class="text-gray-400 text-sm" style="padding-right: 120px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{% with summary=article.product_1_summary_en|default_if_none:""|slice:":80" %}{{ summary|ljust:80 }}{% endwith %}</p>{% if article.image_1 %}<div class="absolute top-2 right-12 w-16 h-16" {% if article.tag_choice_1 == 'circle_image' %} style="border-radius: 50%; overflow: hidden;" {% elif article.tag_choice_1 == 'square_image' %} style="border-radius: 0;" {% elif article.tag_choice_1 == 'triangle_image' %} style="clip-path: polygon(50% 0%, 0% 100%, 100% 100%);" {% elif article.tag_choice_1 == 'pentagon_image' %} style="clip-path: polygon(50% 0%, 100% 38%, 82% 100%, 18% 100%, 0% 38%);" {% elif article.tag_choice_1 == 'hexagon_image' %} style="clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);" {% else %} style="display: none;" {% endif %}><img src="{{ article.image_1 }}" alt="Article Image" class="w-full h-full object-cover"></div>{% endif %}</div>
</a>

英文商品部分模板:products_part_2_en.html - products_part_5_en.html
英文商品部分模板的配置方式與 products_part_1_en.html 類似。對于每個商品部分,都需要創建相應的模板文件 products_part_2_en.html 到 products_part_5_en.html,并按照上述方式進行配置。

通過這些模板的組合和使用,可以學習如何在 Django 項目中使用模板繼承與分割,以及如何實現多語言支持,從而提升項目的可維護性和用戶體驗。

為什么會使用這種自定義的方式?

雖然Django自帶的翻譯機制(i18n)是一個非常強大的工具,適用于大多數情況下的多語言支持,但在特定的需求和場景下,本文所采用的方法卻有其不可替代的優勢。以下是這些特定場景和需求的詳細分析:

  1. 即時數據展示和內容管理
    優點:
    直接展示數據庫內容:通過條件判斷直接展示數據庫中的多語言內容,無需在翻譯文件之間進行中轉,這可以確保數據的實時性和一致性。

便于內容管理:在一些需要頻繁更新的項目中,如新聞網站或電子商務平臺,內容管理人員可以直接在數據庫中更新不同語言的內容,無需等待翻譯文件的生成和編譯。

  1. 靈活的模板定制
    優點:
    模板自定義:本文方法允許對不同語言的模板進行高度定制,例如,中文和英文模板可以有完全不同的布局和樣式。這在一些文化差異較大的項目中尤為重要。

高度靈活:開發者可以針對不同語言版本進行不同的樣式和內容調整,而不必受限于統一的翻譯文件結構。這種靈活性在需要針對不同市場進行本地化優化時非常有用。

  1. 快速開發和原型設計
    優點:
    快速實現:不需要配置和管理翻譯文件,開發者可以快速實現多語言支持,適用于項目初期的快速原型設計和驗證。

低學習曲線:對于剛接觸Django的開發者來說,不需要額外學習i18n的相關知識即可實現多語言支持,降低了開發難度和時間成本。

  1. 特定業務邏輯需求
    優點:
    復雜業務邏輯處理:在某些特定的業務需求下,需要在展示內容時進行復雜的邏輯判斷和處理。例如,不同語言版本可能需要展示不同的廣告或促銷信息,這種情況下,通過模板條件判斷可以更靈活地實現業務需求。

可擴展性:本文方法可以針對特定業務需求進行擴展,如在不同語言版本中顯示不同的商品列表和內容,滿足更加個性化的需求。

  1. 無需額外配置和依賴
    優點:
    簡化配置:不需要依賴Django的中間件和配置,減少了系統依賴和配置復雜度,適用于一些簡單的項目和開發環境。

減少出錯可能:由于無需生成和編譯翻譯文件,減少了在這一步驟中可能出現的錯誤和不一致問題。

總結
雖然Django自帶的翻譯機制是處理多語言支持的最佳實踐,但在特定需求和場景下,本文的方法提供了無法替代的靈活性和便捷性。這種方法在處理實時數據、定制化模板、快速開發和特定業務需求上具有明顯優勢,適用于一些需要快速實現、頻繁更新和高度定制的項目。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63684.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

wxWidgets使用wxStyledTextCtrl(Scintilla編輯器)的正確姿勢

開發CuteMySQL/CuteSqlite開源客戶端的時候&#xff0c;需要使用Scintilla編輯器&#xff0c;來高亮顯示SQL語句&#xff0c;作為C/C領域最成熟穩定又小巧的開源編輯器&#xff0c;Scintilla提供了強大的功能&#xff0c;wxWidgets對Scintilla進行包裝后的是控件類&#xff1a;…

構建高性能異步任務引擎:FastAPI + Celery + Redis

在現代應用開發中&#xff0c;異步任務處理是一個常見的需求。無論是數據處理、圖像生成&#xff0c;還是復雜的計算任務&#xff0c;異步執行都能顯著提升系統的響應速度和吞吐量。今天&#xff0c;我們將通過一個實際項目&#xff0c;探索如何使用 FastAPI、Celery 和 Redis …

介紹 Html 和 Html 5 的關系與區別

HTML&#xff08;HyperText Markup Language&#xff09;是構建網頁的標準標記語言&#xff0c;而 HTML5 是 HTML 的最新版本&#xff0c;包含了一些新的功能、元素、API 和屬性。HTML5 相對于早期版本的 HTML&#xff08;比如 HTML4&#xff09;有許多重要的改進和變化。以下是…

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源碼)

一、RAGFlow簡介 RAGFlow是一個基于對文檔深入理解的開源RAG&#xff08;Retrieval-augmented Generation&#xff0c;檢索增強生成&#xff09;引擎。 主要作用&#xff1a; 讓用戶創建自有知識庫&#xff0c;根據設定的參數對知識庫中的文件進行切塊處理&#xff0c;用戶向大…

qwt 之 QwtPlotPicker

QwtPlotMarker 和 QwtPlotPicker 是 Qwt 庫中用于增強 QwtPlot 功能的兩個重要類。它們分別用于在圖中添加標記和實現交互式的選擇或拖動功能。 QwtPlotPicker 提供了交互式的選擇工具&#xff0c;它允許用戶通過鼠標點擊或拖動來選擇圖表中的數據點或區域。這對于實現縮放、平…

C/C++圣誕樹

系列文章 序號直達鏈接1C/C愛心代碼2C/C跳動的愛心3C/C李峋同款跳動的愛心代碼4C/C滿屏飄字表白代碼5C/C大雪紛飛代碼6C/C煙花代碼7C/C黑客帝國同款字母雨8C/C櫻花樹代碼9C/C奧特曼代碼10C/C精美圣誕樹11C/C俄羅斯方塊12C/C貪吃蛇13C/C孤單又燦爛的神-鬼怪14C/C閃爍的愛心15C…

lua dofile 傳參數

cat 1.lua arg[1] 111 arg[2] 222 dofile(./2.lua) cat 2.lua print("First argument is: " .. arg[1]) print("Second argument is: " .. arg[2]) 執行 lua 1.lua&#xff0c;結果為&#xff1a; First argument is: 111 Second argument is: 222 l…

電商數據流通的未來:API接口的智能化與自動化趨勢

在數字化時代&#xff0c;電子商務行業正在以前所未有的速度發展&#xff0c;而API&#xff08;應用程序編程接口&#xff09;接口作為電商領域的重要組成部分&#xff0c;其應用和發展趨勢也日益受到關注。API接口作為電商系統與外部服務或平臺交互的橋梁&#xff0c;對電商數…

投標心態:如何在“標海戰術”中保持清醒的頭腦?

在競爭激烈的市場環境下&#xff0c;“標海戰術”——即大規模參與投標——已經成為許多企業爭取市場份額的重要策略。然而&#xff0c;盲目追求投標數量可能導致資源浪費、團隊疲勞以及戰略目標的模糊化。在這種高強度的競爭模式中&#xff0c;如何保持清醒的頭腦&#xff0c;…

【蒼穹外賣】學習心得體會-隨筆

前言 寫了很久&#xff0c;終于可以完整運行項目了&#xff0c;記錄下這幾天的心得體會回顧一下知識點 第一天、Git 分布式版本控制工具 一、Git概述 定義&#xff1a;是分布式版本控制工具&#xff0c;用于管理軟件開發中的源代碼文件&#xff0c;像Java類、xml文件、html…

windows C#-使用構造函數

實例化類或結構時&#xff0c;將會調用其構造函數。 構造函數與該類或結構具有相同名稱&#xff0c;并且通常初始化新對象的數據成員。 在下面的示例中&#xff0c;通過使用簡單構造函數定義了一個名為 Taxi 的類。 然后使用 new 運算符對該類進行實例化。 在為新對象分配內存…

研發效能DevOps: Vite 使用 Element Plus

目錄 一、實驗 1.環境 2.初始化前端項目 3.安裝 vue-route 4.安裝 pinia 5.安裝 axios 6.安裝 Element Plus 7.gitee創建工程 8. 配置路由映射 9.Vite 使用 Element Plus 二、問題 1.README.md 文檔推送到gitee未自動換行 2.訪問login頁面顯示空白 3.表單輸入賬戶…

5G 模組 RG500Q常用AT命令

5G 模組 RG500Q常用AT命令 5G 模組 RG500Q常用AT命令 at ATQNWPREFCFG\"mode_pref\",nr5g && sleep 1 at ATQNWPREFCFG\"nr5g_band\",79 && sleep 1 at atqnwlock\"commo…

NVIDIA DeepStream插件之Gst-nvtracker

NVIDIA DeepStream插件之Gst-nvtracker 1. 源由2. 基礎知識3. Gst-nvtracker插件3.1 插件參數3.2 插件API接口 4. 分析問題5. 總結6. 參考資料 1. 源由 這篇的主要目的是稍微吐槽下NVIDIA的設計&#xff0c;當然其實他們做的還是不錯的&#xff08;從系統架構設計角度看&#…

進程內存轉儲工具|內存鏡像提取-取證工具

1.內存轉儲&#xff0c;內存轉儲&#xff08;Memory Dump&#xff09;是將計算機的物理內存&#xff08;RAM&#xff09;內容復制到一個文件中的過程&#xff0c;這個文件通常被稱為“內存轉儲文件”或“核心轉儲文件”&#xff08;Core Dump&#xff09;,內存轉儲的主要目的是…

Lua語言入門 - Lua 面向對象

Lua 面向對象 面向對象編程&#xff08;Object Oriented Programming&#xff0c;OOP&#xff09;是一種非常流行的計算機編程架構&#xff0c;通過創建和操作對象來設計應用程序。 以下幾種編程語言都支持面向對象編程&#xff1a; CJavaObjective-CSmalltalkC#Ruby Lua 是…

Pyqt6在lineEdit中輸入文件名稱并創建或刪除JSON文件

1、創建JSON文件 代碼 import osdef addModulekeyWordFile(self):if "" ! self.lineEdit_module.text():moduleFile self.lineEdit_module.text() .jsonelse:self.toolLogPrinting(請輸入模塊名稱)returnfilePath modulekeyWordFileDir moduleFileif os.path.e…

【Leetcode 熱題 100】236. 二叉樹的最近公共祖先

問題背景 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 最近公共祖先的定義為&#xff1a;對于有根樹 T T T 的兩個節點 p p p、 q q q&#xff0c;最近公共祖先表示為一個節點 x x x&#xff0c;滿足 x x x 是 p p p、 q q q 的祖先且 x x x 的深度盡可能大…

數據結構--堆的向上調整和向下調整

文章目錄 1.完全二叉樹2.堆向上調整3.堆向下調整4.測試代碼 1.完全二叉樹 下面的這個就是對于我們的完全二叉樹的這個邏輯結構和物理結構的說明&#xff1a; 邏輯結構就是我們自己認為的進行購想出來的&#xff1b; 但是這個物理結構卻是我們的這個數據結構在內存里面的真是…

智能掛號系統設計典范:SSM 結合 Vue 在醫院的應用實現

摘要 隨著信息技術在管理上越來越深入而廣泛的應用&#xff0c;管理信息系統的實施在技術上已逐步成熟。本文介紹了醫院預約掛號系統的開發全過程。通過分析醫院預約掛號系統管理的不足&#xff0c;創建了一個計算機管理醫院預約掛號系統的方案。文章介紹了醫院預約掛號系統的系…