整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          小白必看!Django 模板語言基礎來啦

          者 | 單雨

          責編 | 胡巍巍

          出品 | CSDN(ID:CSDNnews)

          前言

          為了實現模板封裝和復用,提高HTML界面調試便捷性以及前后端解耦等目標,Django定義了自己的網絡模板語言。

          當前介紹模板語言的官方文檔已經非常完備,幾乎涵蓋了開發中需要用到的知識點和需要注意的問題,但同時官方文檔也存在一些問題:

          • 翻譯不夠完善,帶來閱讀的困難;

          • 一些知識點的介紹過于簡短,存在大量的頁內鏈接,閱讀時需要跳轉到不同的頁面,閱讀不連貫。

          本文基于官方文檔系統介紹了Django模板語言的基礎知識點,方便快速了解Django模板語言。

          模板系統設計哲學

          Django的模板系統不是簡單的把Python嵌入到HTML中。

          它的設計宗旨是:模板系統旨在展示內容, 而不是程序邏輯,因此不在HTML頁面中嵌入Python。

          簡單的說,模板只負責渲染數據,大多數邏輯應該交給視圖(view)進行處理。

          模板簡介

          模板是一個簡單的文本文件。它可以生成任何基于文本的格式(如 HTML,XML,CSV等)。除了基本的HTML標簽外,模板還包含兩種額外的元素——變量和標簽。

          模板中包含的變量可以被替換為變量的值,標簽則被替換為相應的模板控制邏輯。示例:

          django

          {% extends "base_generic.html" %}

          {% block title %}{{ section.title }}{% endblock %}

          {% block content %}

          <h1>{{ section.title }}</h1>

          {% for story in story_list %}

          <h2>

          <a href="{{ story.get_absolute_url }}">

          {{ story.headline|upper }}

          </a>

          </h2>

          <p>{{ story.tease|truncatewords:"100" }}</p>

          {% endfor %}

          {% endblock %}

          `{{ section.title }}`在模板渲染時將會被變量的值替換,for標簽可以實現模板的循環渲染。

          基礎語法

          變量

          變量實現從模板上下文字典(返回HTTP響應時傳遞過來的字典)中輸出一個值,這是一個類似于dict的對象,包含鍵值對。當模板引擎遇到一個變量時,它會計算該變量,并用結果替換它。

          變量名由字母、數字字符和下劃線("_")組成,但不能以下劃線開頭。點(".")也出現在變量中,代表屬性調用,變量名中不能有空格或標點符號。

          示例:

          django

          My first name is {{ first_name }}. My last name is {{ last_name }}.

          當傳入一個上下文字典`{'first_name': 'John', 'last_name': 'Doe'}`時,將會渲染得到:

          django

          My first name is John. My last name is Doe.

          模板中的變量被字典中的值替換了。

          變量還可以使用點表示法實現字典查找、屬性查找和列表索引查找等操作:

          django

          {{ my_dict.key }}

          {{ my_object.attribute }}

          {{ my_list.0 }}

          點表示法底層原理

          當模板系統遇到一個點,它會按順序嘗試下面的動作:

          1. 字典查詢

          2. 屬性或方法查找

          3. 數字索引查詢

          如果結果值是可調用的,則調用該值時將不帶參數,調用的結果成為新的模板值。

          當進行能覆蓋字典查找的操作時,這種查找順序可能會造成一些意想不到的行為。例如:如果試圖循環一個collection .defaultdict字典對象:

          django

          {% for k, v in defaultdict.items %}

          {其他操作}

          {% endfor %}

          因為字典查找是首先發生的,所以這個行為會先提供一個默認值,而不是使用預期的.items方法。在這種情況下,應該首先考慮使用字典查找,而不是使用字典的屬性調用。

          注意

          屬性通常被解釋為一個文本字符串,防止和同名的變量沖突。例如{{foo.bar}}中的屬性“bar”將被解釋為一個文本字符串,如果模板上下文中存在變量“bar”,則不會使用該變量的值。

          以下劃線開頭的變量屬性可能不能訪問,因為它們通常被認為是私有的。

          如果引用不存在的變量,模板系統將插入string_if_invalid選項的值,該選項默認設置為“”(空字符串)。

          標簽

          標簽在模板渲染過程中提供任意邏輯。標簽可以輸出內容,作為控制結構,例如“if”語句或“for”循環,從數據庫獲取內容,甚至允許訪問其他模板標簽。

          (1)標簽聲明

          標簽的一般形式為:

          django

          {% tag %}

          示例:

          django

          {% csrf_token %}

          (2)傳入參數

          django

          {% cycle 'odd' 'even' %}

          (3)成對使用的標簽

          有些標簽需要開始和結束標簽:

          django

          {% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}

          (4)常用標簽

          for:循環數組中的每個元素. 比如, 顯示列表 `athlete_list` 中每個元素的 `name` 屬性。

          django

          <ul>

          {% for athlete in athlete_list %}

          <li>{{ athlete.name }}</li>

          {% endfor %}

          </ul>

          if 、elif和else:在上面,如果athlete_list不為空,則{{athlete_list|length}}變量將顯示運動員的數量。

          否則,如果athlete_in_locker_room_list不為空,則會顯示“Athletes should be out…”消息。如果兩個列表都為空,則顯示“No athletes”。

          也可以在if標簽里使用過濾器和各種操作符:

          django

          {% if athlete_list|length > 1 %}

          Team: {% for athlete in athlete_list %} ... {% endfor %}

          {% else %}

          Athlete: {{ athlete_list.0.name }}

          {% endif %}

          注意

          雖然上面的示例可以工作,但是要注意,大多數模板過濾器都返回字符串,因此使用過濾器進行數學比較通常不會正常工作,而長度是個例外。

          (5)更多

          Django有很多內置標簽,更多關于內置標簽的信息請參考官方文檔:

          https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-tags

          如果需要編寫自定義標簽,請參考官方文檔

          https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/howto-writing-custom-template-tags

          如果需要對使用的標簽和自定義的標簽做一份說明文檔,可以使用Django提供的文檔工具,詳情請參考:

          https://docs.djangoproject.com/zh-hans/2.2/ref/contrib/admin/admindocs/

          過濾器

          簡介

          過濾器可以對變量做一些操作,例如給變量賦值,改變變量的值等。

          修改變量顯示

          過濾器可以修改變量的顯示。例如:

          django

          {{ name|lower }}

          通過過濾器lower變量{{ name }}變為了小寫字符,通過管道符(|)間隔變量和過濾器來使用過濾器。

          鏈式調用過濾器

          一個過濾器的輸出可以作為下一個過濾器的輸入。

          {{ text|escape|linebreaks }}是一種常用的轉換方式, 在這之后換行符被替換為了 <p> 標簽。

          轉換變量和標簽參數

          過濾器轉換變量和標簽參數的值。示例:

          django

          {{ django|title }}

          傳入`{'django': 'the web framework for perfecalist With deadline '}`上下文字典時,該模板呈現為:

          django

          The Web Framework For Perfectionists With Deadlines

          傳入參數給過濾器

          示例1:

          django

          {{ my_date|date:"Y-m-d" }}

          my_date將會被替換為當前日期。

          示例2:

          django

          {{ bio|truncatewords:30 }}

          將會會顯示 `bio` 變量的前30個字符

          注意

          過濾器參數中如果包含空格和標點符號,必須使用引號“”括起來,例如,要用逗號和空格連接列表,可以使用{{list|join:", "}}。

          Django提供了大約60個內置模板過濾器,請參考官方文檔:

          https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-filters,

          下面列舉一些常用的過濾器:

          default

          如果變量為false或空,則使用給定的默認值。否則,使用變量的值。例如:

          django

          {{ value|default:"nothing" }}

          如果 `value` 沒有提供或者為空,那么將它顯示為 "`nothing`" 。

          length

          返回值的長度。這對字符串和列表都適用。例如:

          django

          {{ value|length }}

          如果 `value` 為 `['a', 'b', 'c', 'd']`, 那么他將被顯示為 `4`。

          filesizeformat

          將值格式化為“人類可讀的”文件大小(即“13kb”、“4.1 MB”、“102字節”等)。例如:

          django

          {{ value|filesizeformat }}

          如果值為123456789,則輸出為117.7 MB。

          如果需要自定義過濾器,請參考請官方文檔:

          https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/

          注釋

          示例:

          單行注釋

          django

          { this won't be rendered }

          多行注釋:{% comment %} 和{% endcomment %}

          django

          <p>Rendered text with {{ pub_date|date:"c" }}</p>

          {% comment "Optional note" %}

          <p>Commented out text with {{ create_date|date:"c" }}</p>

          {% endcomment %}

          注意:Comment標簽不能嵌套使用。

          作者簡介:單雨,90后工科男,偽文藝青年。目前就讀于北京理工大學宇航系,喜歡研究AI,網絡爬蟲,微信小程序以及機器人,癡迷于Coding,睡前必擼碼。

          【END】

          家好,我是皮皮。

          一、前言

          還是昨天的那個網絡爬蟲問題,大佬們,幫忙看看這個網絡爬蟲代碼怎么修改?那個粉絲說自己不熟悉pandas,用pandas做的爬蟲,雖然簡潔,但是自己不習慣,想要在他自己的代碼基礎上進行修改,獲取數據的代碼已經寫好了,就差存儲到csv中去了。

          他的原始代碼如下:

          import requests
          from lxml import etree
          import csv
          import time
          import pandas as pd 
          
          
          def gdpData(page):
              url = f'https://www.hongheiku.com/category/gdjsgdp/page/{page}'
              headers ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}
              resp = requests.get(url,headers = headers)
          # print(resp.text)
              data(resp.text)
          file = open('data.csv',mode='a',encoding='utf-8',newline='')
          csv_write=csv.DictWriter(file,fieldnames=['排名','地區','GDP','年份'])
          csv_write.writeheader()
          def data(text):
              e = etree.HTML(text)
              lst = e.xpath('//*[@id="tablepress-48"]/tbody/tr[@class="even"]')
              for l in lst:
                  no = l.xpath('./td[1]/center/span/text()')
                  name = l.xpath('./td[2]/a/center/text()')
                  team = l.xpath('./td[3]/center/text()')  
                  year = l.xpath('./td[4]/center/text()')
                  data_dict = {
                      '排名':no,
                      '地區':name,
                      'GDP':team,
                      '年份':year
                  }
                  print(f'排名:{no} 地區:{name} GDP:{team} 年份:{year} ')
                  csv_write.writerow(data_dict)
          file.close()
          url = 'https://www.hongheiku.com/category/gdjsgdp'
          headers ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}
          resp = requests.get(url,headers = headers)
          # print(resp.text)
          data(resp.text)
          e = etree.HTML(resp.text)
          #//*[@id="tablepress-48"]/tbody/tr[192]/td[3]/center
          count = e.xpath('//div[@class="pagination pagination-multi"][last()]/ul/li[last()]/span/text()')[0].split(' ')[1]
          for index in range(int(count) - 1):
              gdpData(index + 2)
          

          二、實現過程

          這里粉絲給了一瓶冰紅茶的費用,一個熱心市民給了一份代碼,在他的代碼基礎上進行修改的,代碼如下:

          import requests
          from lxml import etree
          import csv
          import time
          import pandas as pd
          
          
          def gdpData(page):
              url = f'https://www.hongheiku.com/category/gdjsgdp/page/{page}'
              headers ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}
              resp = requests.get(url,headers = headers)
          # print(resp.text)
              data(resp.text)
          
          def data(text):
              file = open('data.csv', mode='a', encoding='utf-8', newline='')
              csv_write = csv.DictWriter(file, fieldnames=['排名', '地區', 'GDP', '年份'])
              csv_write.writeheader()
              e = etree.HTML(text)
              lst = e.xpath('//*[@id="tablepress-48"]/tbody/tr[@class="even"]')
              for l in lst:
                  no = ''.join(l.xpath('./td[1]/center/span/text()'))
                  name = ''.join(l.xpath('./td[2]/a/center/text()')[0])
                  team = ''.join(l.xpath('./td[3]/center/text()'))
                  year = ''.join(l.xpath('./td[4]/center/text()'))
                  data_dict = {
                      '排名':no,
                      '地區':name,
                      'GDP':team,
                      '年份':year
                  }
                  print(f'排名:{no} 地區:{name} GDP:{team} 年份:{year} ')
                  csv_write.writerow(data_dict)
              file.close()
          
          url = 'https://www.hongheiku.com/category/gdjsgdp'
          headers ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'}
          resp = requests.get(url,headers = headers)
          # print(resp.text)
          data(resp.text)
          
          e = etree.HTML(resp.text)
          #//*[@id="tablepress-48"]/tbody/tr[192]/td[3]/center
          count = e.xpath('//div[@class="pagination pagination-multi"][last()]/ul/li[last()]/span/text()')[0].split(' ')[1]
          for index in range(int(count) - 1):
              gdpData(index + 2)
          

          代碼運行之后,數據就存儲到csv中去了。

          順利地解決了粉絲的問題!

          三、總結

          大家好,我是皮皮。這篇文章主要盤點了一個Python網絡爬蟲后數據存儲的問題,文中針對該問題,給出了具體的解析和代碼實現,幫助粉絲順利解決了問題。

          最后感謝粉絲【藍桉】提問,感謝【熱心市民】給出的思路和代碼解析,感謝【eric】等人參與學習交流。

          人可能會與您分享需要的PDF 文檔。要向文檔添加更多內容,您可能會發現需要向其中添加頁面。但即使只是編輯 PDF 文檔上的現有內容也可能非常困難。如何向 PDF 添加頁面?

          通過您選擇使用的 PDF 頁面編輯器,可以更輕松地向 PDF 文檔添加頁面。在本文中,我們將介紹一些可以給PDF添加頁面的編輯器,并向您展示如何使用它們。

          為什么您可能需要將頁面插入 PDF

          您想要向現有 PDF 文檔添加頁面的原因有很多,其中包括:

          • 給PDF 文檔添加頁面的最常見原因是您可以向文檔添加更多內容。
          • 在 PDF 中插入頁面也是將新內容從其他來源導入到現有 PDF 的好方法。例如從另一個 PDF 添加頁面。

          以下解決方案將幫助您在需要時給PDF 文檔添加頁面。

          將頁面添加到 PDF 的最佳工具

          如果您正在尋找一種可以輕松向 PDF 文檔添加頁面的解決方案,那么UPDF - PDF 編輯器是您的最佳選擇。此PDF 編輯器是編輯 PDF 文檔的最佳方法之一,它最擅長的是允許您管理 PDF 上的頁面。這意味著您可以將頁面添加到文檔的幾乎任何部分。

          我們將在本文的下一部分中了解此過程的工作原理。但在此之前,讓我們先看看 UPDF 的其他功能。

          • UPDF 是管理現有 PDF 文檔頁面的最佳方法之一。您可以使用它來提取PDF頁面、添加新頁面、旋轉頁面,甚至提取特定頁面。
          • 這也是編輯 PDF 中圖像的最佳方法之一。您可以選擇圖像、調整圖像大小、復制、刪除圖像,甚至將新圖像添加到文檔中。
          • 同樣,您可以輕松地將新文本內容添加到文檔中,并通過更改字體樣式、顏色和大小來編輯現有內容。
          • 您可以向 PDF 文檔添加突出顯示、便簽、文本框和其他注釋。
          • 它提供了幾種閱讀PDF文檔的好模式,您也可以向PDF添加書簽。
          • 您可以將 PDF 轉換為 MS Office 格式、圖像、CSV、RTF、文本、XML、HTML、PDF/A 等。

          方法1:如何在 PDF 中添加空白頁?

          如果您使用 UPDF 打印 PDF 文檔,您可以通過以下方式旋轉 PDF 頁面:

          第1步:打開 PDF。

          在主界面中,單擊“打開文件”按鈕,然后瀏覽要編輯的PDF文檔。

          第2步:將空白頁插入 PDF。

          在 UPDF 中打開文檔后,單擊左側的“組織頁面”選項卡。這將打開頁面管理界面。

          方法2:如何從另一個文件將頁面插入 PDF?

          有時您想將兩個PDF文件合并在一起,但又希望將第二個PDF文件放置在某個位置,那么您可以使用UPDF的插入選項來幫助您。您可以直接將另一個 PDF 文件插入到當前 PDF 文件中。

          第1步:選擇“來自文件”選項

          如果您想從另一個 PDF 文檔添加頁面,您應該單擊頁面來選擇要插入的位置?,F在單擊“插入”選項并選擇“來自文件”。

          第 2步:插入另一個 PDF 文檔中的頁面。

          然后,您可以瀏覽計算機查找要添加到當前文檔的 PDF。然后單擊“打開”按鈕。

          PDF 文件將被插入到您選擇的位置。您可以重新排序、編輯、注釋或轉換 PDF 文件。

          方法3:如何通過組合將頁面添加到PDF

          UPDF 提供了另一種方法來幫助您將整個 PDF 插入到另一個 PDF 文件中。如果您想將兩個或多個 PDF 文件的所有頁面插入在一起,可以按照以下步驟操作:

          步驟1:在UPDF的歡迎頁面上,您將看到有一個“批量”選項,點擊它。

          步驟 2:該工具提供了許多批處理選項。根據需要選擇“組合”選項。

          步驟 3:在新窗口中,您可以添加要插入的PDF文件并將它們組合在一起。單擊“應用”開始該過程。完成此過程后,您可以輕松地重新排列 PDF 文件中的頁面。

          方法4:如何一次將頁面插入多個 PDF 文件?

          如果想將一個 PDF 一次性插入到其他多個 PDF 文件中。UPDF 也可以幫助您。請按照以下說明操作:

          步驟1:與方法3相同,請點擊“批量”>“插入”選項。

          步驟2:在右側區域,您需要選擇要插入到多個PDF文件中的單個文件。您可以設置該文件的位置:在前面、在末尾或在哪一頁之后。

          步驟 3:在左側區域,您需要添加多個PDF文件。

          步驟4:點擊“應用”。

          方法5:如何在Adob?e Reader中將頁面添加到PDF?

          首先,您無法使用Adobe Reader向PDF添加頁面,因為Reader DC是免費版本,只能用于閱讀和注釋PDF文檔。

          如果您想向 PDF 添加頁面,則必須升級到 Adob??e Acrobat Standard DC 或 Pro DC,這非常昂貴(每年 239.88 美元)。

          升級到 Adob??e Acrobat Pro 后,您可以按照以下步驟操作:

          步驟1:單擊“工具”選項并選擇“組織頁面”工具。

          步驟2:打開您的 PDF 文檔。

          步驟3:單擊“插入”選項,您可以開始使用 Adob??e Acrobat Pro DC 將頁面插入 PDF。

          既然Acrobat太貴了,而且使用起來有點復雜,為什么不改用UPDF呢?一款更具成本效益的PDF編輯器,它具有向PDF添加頁面、編輯PDF文本和圖像、將PDF文檔轉換為其他格式、OCR以及許多其他功能等功能。

          方法6.如何在線將頁面插入PDF

          有一些網絡工具可用于在線將頁面添加到 PDF。例如iLovePDF、SmallPDF、Sejda等。使用在線工具的步驟類似,您可以按照以下步驟操作:

          步驟1:轉到任何支持組織頁面功能的在線工具。您可以使用關鍵字“在線將頁面插入 PDF”在 Google 上搜索。谷歌會展示很多解決方案。

          步驟2:將您的 PDF 文件上傳到在線網站。所有在線工具都要求您上傳 PDF 文件,并且大多數工具都對文件大小或頁碼有限制。如果您想免費使用它,則必須滿足其限制要求。

          步驟3:成功上傳后,您現在可以找到將頁面插入 PDF 的工具。大多數在線工具只允許您插入空白頁面,但不允許插入其他 PDF 文件。

          步驟4:修改后下載文件。

          但是,使用在線工具將頁面添加到 PDF 并不穩定,因為您必須連接到互聯網。如果網絡不好,會影響結果,甚至損壞你的PDF文檔。

          在線解決方案的另一個問題是您必須擔心文檔的安全性。為什么不使用 UPDF 來代替呢?它是桌面版本,非常穩定且使用速度快。您的所有文檔都將保存到本地存儲,您可以使用 UPDF 輕松編輯、轉換、保護和組織它們。

          有關向 PDF 添加頁面的常見問題解答

          1. 如何向現有PDF添加空白頁?

          您可以使用 UPDF 等 PDF 頁面編輯器向現有 PDF 添加空白頁面。為此,您可以將 PDF 上傳到 UPDF,然后單擊“組織頁面”圖標。接下來,您可以點擊頂部的“插入”選項,然后選擇“空白頁”選項。這樣就完成了!

          2. 如何在 PDF 中添加和替換頁面?

          使用 UPDF,您可以快速添加和替換頁面。為此,您可以進入“組織頁面”模式并選擇要替換的頁面。然后您只需單擊頂部的“替換”圖標并選擇一個文件來替換頁面即可。

          3. 我可以更改 PDF 頁面嗎?

          是的,當然可以。使用UPDF,您可以輕松更改PDF中的頁面,例如替換、添加、刪除、旋轉、提取、分割和裁剪PDF中的頁面。

          結論

          當您忘記在 PDF 中添加頁面時,您不必從頭開始文檔創建過程,而是可以使用 UPDF 在文檔的任何部分添加頁面。能夠做到這一點并讓事情變得簡單明了的最佳解決方案是 UPDF。無需了解任何內容,只需幾個簡單的步驟即可將頁面添加到文檔的任何部分。


          主站蜘蛛池模板: 日韩一区二区三区四区不卡| 国产吧一区在线视频| 久久婷婷色一区二区三区| 精品亚洲综合在线第一区| 国产精品视频一区二区三区不卡| 伊人色综合一区二区三区| 激情久久av一区av二区av三区| 免费人人潮人人爽一区二区 | 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲一区精品伊人久久伊人| 无码精品尤物一区二区三区| 无码一区二区三区AV免费| 精品人妻无码一区二区色欲产成人 | 亚洲一区二区三区精品视频| 波多野结衣一区在线| 亚洲AV永久无码精品一区二区国产 | 国产福利一区视频| 日韩AV无码久久一区二区| 激情亚洲一区国产精品| 在线免费视频一区| 精品少妇一区二区三区在线| 成人精品一区二区三区中文字幕| 国产成人精品视频一区二区不卡| 日本高清一区二区三区| 一区二区三区在线播放视频| 亚洲日本乱码一区二区在线二产线| 日韩伦理一区二区| 国产一区二区三区小说| 乱码精品一区二区三区| 午夜一区二区在线观看| 一区二区三区视频网站| 秋霞电影网一区二区三区| 97精品一区二区视频在线观看| 日本一区二区三区精品视频| 亚洲一区二区中文| 狠狠色婷婷久久一区二区三区| 精品乱人伦一区二区| 国产在线精品一区在线观看| 丰满爆乳无码一区二区三区| 国产精品揄拍一区二区| 无码av免费一区二区三区试看|