首頁 > 上網技巧 > 電腦小技巧 > Django blog項目知識點總結

Django blog項目知識點總結

時間:2019-12-06 09:48 作者:QQ地帶 我要評論

數據庫操作部分
當我們在Django項目中的models.py下寫好創建表的代碼后。為了創建好這些數據庫表,我們再一次請出我的工程管理助手 manage.py。激活虛擬環境,切換到 manage.py 文件所在的目錄下,分別運行 python manage.py makemigrations 和 python manage.py migrate 命令:
 
復制代碼
F:\myblog>python manage.py makemigrations
Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model Category
    - Create model Post
    - Create model Tag
    - Add field tags to post
 
F:\myblog>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying blog.0001_initial... OK
  Applying sessions.0001_initial... OK
復制代碼
然后我們可以具體查看終端里Django究竟是做了什么為我們創建數據表的?實際是通過ORM將Python命令翻譯為SQL語言,操作數據庫。
 
復制代碼
F:\myblog>python manage.py sqlmigrate blog 0001
BEGIN;
--
-- Create model Category
--
CREATE TABLE `blog_category` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(100) NOT NULL);
--
-- Create model Post
--
CREATE TABLE `blog_post` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `title` varchar(70) NOT NULL, `body` longtext NOT NULL, `created_time` datetime(6) NOT NULL, `modified_time` datetime(6) NOT NULL, `
excerpt` varchar(200) NOT NULL, `author_id` integer NOT NULL, `category_id` integer NOT NULL);
--
-- Create model Tag
--
CREATE TABLE `blog_tag` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(100) NOT NULL);
--
-- Add field tags to post
--
CREATE TABLE `blog_post_tags` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `post_id` integer NOT NULL, `tag_id` integer NOT NULL);
ALTER TABLE `blog_post` ADD CONSTRAINT `blog_post_author_id_dd7a8485_fk_auth_user_id` FOREIGN KEY (`author_id`) REFERENCES `auth_user` (`id`);
ALTER TABLE `blog_post` ADD CONSTRAINT `blog_post_category_id_c326dbf8_fk_blog_category_id` FOREIGN KEY (`category_id`) REFERENCES `blog_category` (`id`);
ALTER TABLE `blog_post_tags` ADD CONSTRAINT `blog_post_tags_post_id_a1c71c8a_fk_blog_post_id` FORE
ALTER TABLE `blog_post_tags` ADD CONSTRAINT `blog_post_tags_tag_id_0875c551_fk_blog_tag_id` FOREIG
ALTER TABLE `blog_post_tags` ADD CONSTRAINT `blog_post_tags_post_id_tag_id_4925ec37_uniq` UNIQUE (
COMMIT;
復制代碼
查看這些SQL命令可以幫助我們理解Django的ORM運行機制。
 
 
 
在 manage.py 所在目錄下運行 python manage.py shell 命令:
 
(blogproject_env) C:\Users\yangxg\Workspace\blogproject>python manage.py shell
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
這就打開了交互命令行。我們可以在其中具體添加數據表的信息。
 
>>> from blog.models import Category, Tag, Post
>>> c = Category(name='category test')
>>> c.save()
>>> t = Tag(name='tag test')
>>> t.save()
比如在這里實例化了一個 Category 類和一個 Tag 類,為他們的屬性 name 賦了值。為了讓 Django 把這些數據保存進數據庫,調用實例的 save 方法即可。
 
 
 
博客首頁
Django處理HTTP請求
后臺與前端交互,請求響應流程是怎么實現的?
 
基本流程就是用戶請求,瀏覽器發送HTTP請求,服務端接收然后返回一個響應(過程包含了三次握手,四次揮手),瀏覽器讀取數據并顯示。
 
在Django中,如何處理請求的呢?內部流程實現是,首先綁定URL和views函數,其次是編寫views函數處理請求,配置項目URL映射,分配路由,最后返回數據給前端渲染模板顯示內容。在views.py文件函數中,為了顯示引用的models中的字段內容,需要調用__str__方法。
 
調用from django.utils.six import python_2_unicode_compatible,然后進行可視化處理,在自定義函數上添加裝飾器@python_2_unicode_compatible.
 
 
 
前端如何引入靜態文件配置JS樣式呢?
需在首頁index.html中正確配置路徑,引入js樣式。在html文件頂部聲明靜態文件部署:{% load staticfiles %}
 
在前端使用Django自帶的模板語言渲染數據,關鍵要區分模板變量和模板標簽兩類。模板變量語法為{{ xxx }},中間嵌套著要渲染的變量內容,可以包含變量和條件判斷語句。模板標簽語法為{% xxxss %} ,中間為需渲染的內容。
 
 
 
該博客項目直接復用了網上的一個網頁模板,關鍵運用時可以微調布局。這塊是最考驗前端功底的部分了,如何調整的樣式優美又不雜亂?如何才可顯示最少信息又不失要素。達到良好的用戶交互體驗。
 
 
 
 
 
基于類的通用視圖:ListView 和 DetailView
在web開發中,有些視圖函數雖然處理對象不同,但是基本的邏輯是一致的。比如說一個博客和一個論壇,雖然表現方式不同,但本質上首頁都是展示的一系列有序的文章/帖子列表。就首頁視圖函數來說,處理邏輯都是從數據庫中取到最近的文章列表,然后按照時間順序傳給前端,前端渲染并顯示。
 
Django中將實現這一系列邏輯的代碼提煉出來,成為一系列的通用視圖函數,即基于類的通用視圖(Class Based View)。這是有別于基于函數的通用視圖的工具箱。
 
那么如何來利用類視圖減少開發時間,提升開發效率呢?
 
這里要涉及到Django內建基類視圖API中的通用顯示視圖函數,包含兩個子函數ListView 和 DetailView。官方文檔是如此總結這兩個函數的:
 
The two following generic class-based views are designed to display data. On many projects they are typically the most commonly used views.   
    #兩個通用基類視圖函數被用來顯示數據。他們越來越廣泛的被運用在許多項目中。
 
 
ListView
比如一個博客項目中,有幾個不同的views函數都是利用的數據庫中文章列表數據,只是所選取的數據略有不同,針對這種情況,可以用ListView函數。
 
要寫一個類視圖,首先要繼承Django提供的某個類視圖,具體繼承哪個,需要看視圖功能決定。
 
比如 我們可以編寫一個IndexView類函數,它的功能是從數據庫中獲取文章(Post)列表,ListView 就是從數據庫中獲取某個模型列表數據的。
 
當然,我們實現將基于函數的views更改為類視圖,之后要將url中的路由映射也更改下,不過這里是將類視圖改為函數視圖了,是不是有點繞?
 
不過記住這個功能的實現方法就好了,直接調用Django提供的as_view()方法就可以了。
 
復制代碼
app_name = 'blog'
urlpatterns = [
    url(r'^$', views.index, name='index'),
    ...
]
 
更改為
 
app_name = 'blog'
urlpatterns =  [
    url(r'^$', views.IndexView.as_view(), name='index'),
 ... ]
復制代碼
 對于要獲文章列表中某一分類下的文章,我們需要從URL中捕獲的文章ID并從數據庫中獲取分類,然后使用filter過濾器獲取該分類下全部文章。
 
舉例來說,這種情況下代碼可以這么修改:
 
復制代碼
blog/views.py
 
class CategoryView(ListView):
    model = Post
    template_name = 'blog/index.html'
    context_object_name = 'post_list'
 
    def get_queryset(self):
        cate = get_object_or_404(Category, pk=self.kwargs.get('pk'))
        return super(CategoryView, self).get_queryset().filter(category=cate)
復制代碼
在父類中,get_queryset()方法默認取到所有的文章列表,我們只是想要分類中的一部分,所以覆寫了get_queryset()方法。
 
這里首先根據從URL中捕獲的數據獲取id來分類數據,在類視圖中,從 URL 捕獲的命名組參數值保存在實例的 kwargs 屬性(是一個字典)里,非命名組參數值保存在實例的 args 屬性(是一個列表)里。所以這里使用了 self.kwargs.get('pk') 來獲取從 URL 捕獲的分類 id 值。然后我們調用父類的 get_queryset 方法獲得全部文章列表,緊接著就對返回的結果調用了 filter 方法來篩選該分類下的全部文章并返回。
 
 
 
DetailView
我們經常會有這種需求,從數據庫中取出一條數據,比如說文章詳情,我們需要獲取到對應數據并返回前端模板渲染。對于這種需求,Django提供了DetailView類視圖函數解決。
 
該類視圖函數繼承鏈為
 
class django.views.generic.detail.DetailView
While this view is executing, self.object will contain the object that the view is operating upon.# 當該視圖執行時,self.object包含所有在視圖
上操作的對象?衫斫鉃楂@取到的對象容器
Ancestors (MRO)
該視圖函數繼承的屬性和方法來自于這些視圖函數:
 
復制代碼
This view inherits methods and attributes from the following views:
 
django.views.generic.detail.SingleObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMixin
django.views.generic.detail.BaseDetailView
django.views.generic.detail.SingleObjectMixin
django.views.generic.base.View
復制代碼
官方給出的例子中:
 
復制代碼
from django.views.generic.detail import DetailView
from django.utils import timezone
 
from articles.models import Article
 
class ArticleDetailView(DetailView):
 
    model = Article
 
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['now'] = timezone.now()
        return context
復制代碼
這里仍然與ListView一致,從 URL 捕獲的命名組參數值保存在實例的 kwargs 屬性(是一個字典)里,非命名組參數值保存在實例的 args 屬性(是一個列表)里。所以這里使用了 get_conext_data(**kwargs) 來獲取從 URL 捕獲的上下文數據。
 
 
 
分頁功能
分頁功能由 Django 內置的 Paginator 類提供。這個類位于 django/core/paginator.py,需要使用它時,只需在適當的地方導入這個類即可。
 
只需實例化一個 Paginator 對象,并在實例化時傳入一個需要分頁的列表對象,就可以得到分頁后的對象數據。注意,分頁對象是列表類型數據。
 
用paginator給文章列表分頁。
 
在基于類的視圖ListView中,分類邏輯已經含括在內了,我們只需要指定paginate_by屬性開啟分頁功能。
 
ListView類視圖中,包含了有關分頁的幾種方法,要記。
 
paginator ,即 Paginator 的實例。
page_obj ,當前請求頁面分頁對象。
is_paginated,是否已分頁。只有當分頁后頁面超過兩頁時才算已分頁。
object_list,請求頁面的對象列表,和 post_list 等價。所以在模板中循環文章列表時可以選 post_list ,也可以選 object_list。
分頁功能拓展
 想要分頁顯示這種效果
 
 
 
先來分析一下導航條的組成部分,可以看到整個分頁導航條其實可以分成 七個部分:
 
第 1 頁頁碼,這一頁需要始終顯示。
第 1 頁頁碼后面的省略號部分。但要注意如果第 1 頁的頁碼號后面緊跟著頁碼號 2,那么省略號就不應該顯示。
當前頁碼的左邊部分,比如這里的 3-6。
當前頁碼,比如這里的 7。
當前頁碼的右邊部分,比如這里的 8-11。
最后一頁頁碼前面的省略號部分。但要注意如果最后一頁的頁碼號前面跟著的頁碼號是連續的,那么省略號就不應該顯示。
最后一頁的頁碼號。
 回顧一下顯示分頁的步驟,經典的 Django 三部曲。首先是定義視圖函數,然后編寫模板文件,最后將視圖函數和 URL 模式綁定。
 
 
 
RSS訂閱實現
博客中的rss
RSS(Really Simple Syndication 簡易信息聚合)是一種描述和同步網站內容的格式,它采用 XML 作為內容傳遞的格式。簡單來說就是網站可以把內容包裝成符合 RSS 標準的 XML 格式文檔。一旦網站內容符合一個統一的規范,那么人們就可以開發一種讀取這種規范化的 XML 文檔的工具來聚合各大網站的內容。例如一個讀者可能關注了很多的博客網站,如果這些博客網站都支持 RSS 訂閱的話,他就只需要一個聚合閱讀器訂閱這些博客,就可以在聚合器工具里看到全部博客的更新內容,而不必再分別訪問各個博客去看有沒有內容更新了。
 
在django中內置了根據網站的內容生成規范化的 XML 文檔的方法,接下來我們是用這個方法來實現RSS訂閱文檔。
 
比如用如下blog項目應用目錄下建立一個create.py
 
復制代碼
blog/create.py
 
from django.contrib.syndication.views import Feed
 
from .models import Post
 
 
class AllPostsRsscreate(Feed):
    # 顯示在聚合閱讀器上的標題
    title = "Django 博客"
 
    # 通過聚合閱讀器跳轉到網站的地址
    link = "/"
 
    # 顯示在聚合閱讀器上的描述信息
    description = "Django 博客"
 
    # 需要顯示的內容條目
    def items(self):
        return Post.objects.all()
 
    # 聚合器中顯示的內容條目的標題
    def item_title(self, item):
        return '[%s] %s' % (item.category, item.title)
 
    # 聚合器中顯示的內容條目的描述
    def item_description(self, item):
        return item.body
復制代碼
 該段代碼是要指定生成XML文檔,邏輯依然是獲取對象列表,然后提取所需數據('[%s] %s' % (item.category, item.title)),接下來在模板中渲染顯示。
 
這里視圖改完了,繼續在URL和前端模板中渲染即可。
 
 
 
簡單的全文搜索
首先要提,全文搜索的對象是什么?數據庫中存儲的信息。那么數據庫信息查詢要用到的底層技術是什么?必然是算法了,數據各種索引的出現都是為了加速查詢而創建的種種算法,優化數據的存儲結構。
 
在前端表單中,我們需要用到表單的 action 屬性的值為 {% url 'blog:search' %}(雖然我們還沒有寫這個視圖函數),表明用戶提交的結果將被發送給 blog 應用下 search 視圖函數對應的 URL。

標簽: Django
頂一下
(0)
0%
踩一下
(0)
0%

Google提供的廣告

辽宁11选5任选四遗漏 辉煌棋牌捕鱼第一平台 股票上市规则 四个人打麻将输一局脱一件 熊猫棋牌特邀彩金 四肖三期 必出一期香港 网赚钱 安徽波克麻将下载安装辅助器 e球彩助手 街机电玩捕鱼破解版 微乐大庆麻将官方下载