成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Django 學(xué)習(xí)小組:博客開發(fā)實戰(zhàn)第一周教程 —— 編寫博客的 Model 與主頁面

陳江龍 / 2288人閱讀

摘要:學(xué)習(xí)小組是由我發(fā)起的一個促進(jìn)新手互相學(xué)習(xí)互相幫助的組織。當(dāng)然如果你不喜歡英文,可以看我們的中文翻譯版本入門教程中文翻譯版。如果模板文件中有如下代碼那么渲染時就會循環(huán)渲染篇文章,并且也會被存儲在數(shù)據(jù)庫中文章的標(biāo)題取代。

本教程內(nèi)容已過時,更新版教程請訪問: django 博客開發(fā)入門教程。

本節(jié)是 Django Blog 項目的開篇,是?Django 學(xué)習(xí)小組的集體學(xué)習(xí)成果。Django 學(xué)習(xí)小組是由我發(fā)起的一個促進(jìn) Django 新手互相學(xué)習(xí)、互相幫助的組織。小組在一邊學(xué)習(xí) Django 的同時將一起完成三個項目:

一個簡單 Django Blog,用于發(fā)布小組每周的學(xué)習(xí)和開發(fā)文檔

Django 中國社區(qū),為國內(nèi)的 Django 開發(fā)者們提供一個長期維護(hù)的 Django 社區(qū),聚集全國的 Django 開發(fā)者到這個社區(qū)上來

Django 問答社區(qū), 類似于 segmentfault 和 stackoverflow 但更加專注(只專注于 Django 開發(fā)的問題)的問答社區(qū)

目前小組正在完成第一個項目,本文即是該項目第一周的相關(guān)文檔。

更多的信息請關(guān)注我們的?github 組織首頁,本教程項目的相關(guān)源代碼也已上傳到 github 上。
同時,你也可以加入我們的郵件列表[email protected]?,隨時關(guān)注我們的動態(tài),我們會將每周的詳細(xì)開發(fā)文檔和代碼通過郵件列表發(fā)出。
如有任何建議,歡迎提 Issue,歡迎fork,pull requests,當(dāng)然也別忘了 Star 哦!
每周更新,敬請關(guān)注

Django 開發(fā)環(huán)境的搭建和創(chuàng)建 Blog 工程

django 的開發(fā)環(huán)境搭建以及如何創(chuàng)建工程在網(wǎng)上有大量的博客和教程介紹,在此不再重復(fù)說明。但我建議最好的參考資料還是Django官方的入門 Tutorials ,即官方文檔的 First steps 部分的六個 Parts。當(dāng)然如果你不喜歡英文,可以看我們的中文翻譯版本:Django 入門教程中文翻譯版。

要開始 Django 開發(fā),你需要從中掌握以下知識:

如何創(chuàng)建 Django 工程,并了解 Django 默認(rèn)的工程目錄結(jié)構(gòu)

如何創(chuàng)建 Django APP

理解 Django 的MTV 模式,學(xué)會編寫 Model、View、Template

Django 如何處理靜態(tài)文件,即各種 CSS,JS,以及圖片文件等

我們強(qiáng)烈建議你在閱讀完上面的教程以掌握 Django 開發(fā)所需的最基本概念后開始本項目的學(xué)習(xí)

Django應(yīng)用是如何工作的?

先看一張流程圖,再來逐步講解其過程:

1:用戶通過瀏覽器輸入相應(yīng)的 URL 發(fā)起 HTTP 請求(一般是 GET/POST)

2:Django 接受到請求,檢測 urls.py 文件,找到和用戶輸入的 URL 相匹配的項,并調(diào)用該 URL 對應(yīng)的視圖函數(shù)(view),例如,通常來說 urls.py 文件里的代碼是這樣的:

url(r"^homepage/$", views.home_page)

則當(dāng)用戶輸入的 URL 為 www.某個網(wǎng)址.com/homepage 時,django 檢測到該 URL 與上面的代碼 匹配,于是調(diào)用后面的 views.home_page 視圖函數(shù),把相應(yīng)的請求交給該視圖函數(shù)處理。

3:視圖函數(shù)被調(diào)用后,可能會訪問數(shù)據(jù)庫(Model)去查詢用戶想要請求的數(shù)據(jù),并加載模板文件(Template),渲染完數(shù)據(jù)后打包成 HttpResponse 返回給瀏覽器(Http協(xié)議)

大致工作流程就是這樣,從流程可以看出,我們需要做的就是:

編寫相應(yīng)的 url

編寫數(shù)據(jù)庫(Model)

編寫處理 Http 請求的視圖函數(shù)(View)

編寫需要渲染的模板(Template)

這就是 Django 開發(fā)的最主要工作,下面遵循這樣的開發(fā)流程開始編寫我們的 Blog程序吧。

編寫 Model

Model 對應(yīng)數(shù)據(jù)庫,我們編寫的是一個 Blog 應(yīng)用,因此數(shù)據(jù)庫中應(yīng)該存放 Blog 下的文章(Aticle),文章由標(biāo)題(title)、正文(body)、發(fā)布時間(publised_time)等組成。先看 django 是如何定義數(shù)據(jù)庫的,之后再逐行解釋代碼(假設(shè)你已經(jīng)對 django 的工程目錄結(jié)構(gòu)了解了,我們一般把 Model 定義在 models.py 文件中):

models.py

from django.db import models

class Article(models.Model):
    STATUS_CHOICES = (
        ("d", "Draft"),
        ("p", "Published"),
    )

    title = models.CharField("標(biāo)題", max_length=70)
    body = models.TextField("正文")
    created_time = models.DateTimeField("創(chuàng)建時間", auto_now_add=True)
    last_modified_time = models.DateTimeField("修改時間", auto_now=True)
    status = models.CharField("文章狀態(tài)", max_length=1, choices=STATUS_CHOICES)
    abstract = models.CharField("摘要", max_length=54, blank=True, null=True, 
                                help_text="可選,如若為空將摘取正文的前54個字符")
    views = models.PositiveIntegerField("瀏覽量", default=0)
    likes = models.PositiveIntegerField("點贊數(shù)", default=0)
    topped = models.BooleanField("置頂", default=False)

    category = models.ForeignKey("Category", verbose_name="分類", 
                                 null=True, 
                                 on_delete=models.SET_NULL)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ["-last_modified_time"]


class Category(models.Model):
    name = models.CharField("類名", max_length=20)
    created_time = models.DateTimeField("創(chuàng)建時間", auto_now_add=True)
    last_modified_time = models.DateTimeField("修改時間", auto_now=True)

    def __str__(self):
        return self.name

逐行解釋:

from django.db import models
# 和 model 相關(guān)的一些API定義在 django.db.models 模塊中

class Article(models.Model):
    """
    所有的 model 必須繼承自django.db.models
    類 Aticle 即表示 Blog 的文章,一個類被 diango 映射成數(shù)據(jù)庫中對應(yīng)的一個表,表名即類名
    類的屬性(field),比如下面的 title、body 等對應(yīng)著數(shù)據(jù)庫表的屬性列
    """
    STATUS_CHOICES = (
        ("d", "Draft"),
        ("p", "Published"),
    )
    # 在 status 時說明

    title = models.CharField("標(biāo)題", max_length=70)
    # 文章標(biāo)題,CharField 表示對應(yīng)數(shù)據(jù)庫中表的列是用來存字符串的,"標(biāo)題"是一個位置參數(shù)     
    #(verbose_name),主要用于 django 的后臺系統(tǒng),不多做介紹。max_length 表示能存儲的字符串    
    # 的最大長度
    
    body = models.TextField("正文")
    # 文章正文,TextField 用來存儲大文本字符
    
    created_time = models.DateTimeField("創(chuàng)建時間", auto_now_add=True)
    # 文章創(chuàng)建時間,DateTimeField用于存儲時間,設(shè)定auto_now_add參數(shù)為真,則在文章被創(chuàng)建時會自動添加創(chuàng)建時間
    
    last_modified_time = models.DateTimeField("修改時間", auto_now=True)
    # 文章最后一次編輯時間,auto_now=True表示每次修改文章時自動添加修改的時間
    
    status = models.CharField("文章狀態(tài)", max_length=1, choices=STATUS_CHOICES)
    # STATUS_CHOICES,field 的 choices 參數(shù)需要的值,choices選項會使該field在被渲染成form時被渲染為一個select組件,這里我定義了兩個狀態(tài),一個是Draft(草稿),一個是Published(已發(fā)布),select組件會有兩個選項:Draft 和 Published。但是存儲在數(shù)據(jù)庫中的值分別是"d"和"p",這就是 choices的作用。
    
    abstract = models.CharField("摘要", max_length=54, blank=True, null=True, 
                                help_text="可選,如若為空將摘取正文的前54個字符")
    # 文章摘要,help_text 在該 field 被渲染成 form 是顯示幫助信息
    
    views = models.PositiveIntegerField("瀏覽量", default=0)
    # 閱覽量,PositiveIntegerField存儲非負(fù)整數(shù)
    
    likes = models.PositiveIntegerField("點贊數(shù)", default=0)
    # 點贊數(shù)
    
    topped = models.BooleanField("置頂", default=False)
    # 是否置頂,BooleanField 存儲布爾值(True或者False),默認(rèn)(default)為False

    category = models.ForeignKey("Category", verbose_name="分類", 
                                 null=True, 
                                 on_delete=models.SET_NULL)
    # 文章的分類,F(xiàn)oreignKey即數(shù)據(jù)庫中的外鍵。外鍵的定義是:如果數(shù)據(jù)庫中某個表的列的值是另外一個表的主鍵。外鍵定義了一個一對多的關(guān)系,這里即一篇文章對應(yīng)一個分類,而一個分類下可能有多篇    文章。詳情參考django官方文檔關(guān)于ForeinKey的說明,on_delete=models.SET_NULL表示刪除某個分類(category)后該分類下所有的Article的外鍵設(shè)為null(空)
    
    def __str__(self):
        # 主要用于交互解釋器顯示表示該類的字符串
        return self.title

    class Meta:
        # Meta 包含一系列選項,這里的 ordering 表示排序,- 號表示逆序。即當(dāng)從數(shù)據(jù)庫中取出文章時,其是按文章最后一次修改時間逆序排列的。
        ordering = ["-last_modified_time"]


class Category(models.Model):
    """
    另外一個表,存儲文章的分類信息
    """
    name = models.CharField("類名", max_length=20)
    created_time = models.DateTimeField("創(chuàng)建時間", auto_now_add=True)
    last_modified_time = models.DateTimeField("修改時間", auto_now=True)

    def __str__(self):
        return self.name

由上可見,設(shè)計數(shù)據(jù)庫結(jié)構(gòu)就是編寫 models,數(shù)據(jù)庫中每一個實體對應(yīng)的表在 django 中對用著 models.py 中的一個類,類的屬性對應(yīng)著數(shù)據(jù)庫表的屬性列。

model 定義完畢后,運行以下命令即可生成相應(yīng)的數(shù)據(jù)庫:

python manage.py makemigrations

python manage.py migrate

你可以打開相應(yīng)的數(shù)據(jù)庫文件看看里面生成的表結(jié)構(gòu),加深理解。

其中以上的代碼中涉及到一些 django 相關(guān)的概念,分別給出以下參考資料供學(xué)習(xí):

Django 模型層(model)的概論:官方文檔、中文翻譯文檔

類中各屬性(field):官方文檔對 django 提供的各 field 的介紹、相應(yīng)的中文文檔

ForeinKey(一對多),還有 ManyToMany(多對多)、OneToOne(一對一)的介紹:官方文檔對外關(guān)系的介紹

編寫 View

上面已經(jīng)介紹了 django 應(yīng)用的工作流程,數(shù)據(jù)庫建立完畢后需要編寫視圖函數(shù)(view)來處理 Http 請求。同樣先來看 django 的 view 代碼是如何寫的,然后我們再逐行解釋。

我們現(xiàn)在要設(shè)計的是一個首頁的視圖函數(shù),即用戶進(jìn)入我們的 Blog 首頁后,我們需要把數(shù)據(jù)庫中存儲的文章的相關(guān)信息取出來展示給用戶看:

views.py

from django.views.generic.list import ListView
from blog.models import Article, Category
import markdown2

class IndexView(ListView):
    template_name = "blog/index.html"
    context_object_name = "article_list"

    def get_queryset(self):
        article_list = Article.objects.filter(status="p")
        for article in article_list:
            article.body = markdown2.markdown(article.body, )
        return article_list

    def get_context_data(self, **kwargs):
        kwargs["category_list"] = Category.objects.all().order_by("name")
        return super(IndexView, self).get_context_data(**kwargs)

逐行解釋:

from blog.models import Article
from blog.models import Category
from django.views.generic import ListView
import markdown2

class IndexView(ListView): 
    """
    首頁視圖,繼承自ListVIew,用于展示從數(shù)據(jù)庫中獲取的文章列表
    """
    
    template_name = "blog/index.html"
    # template_name屬性用于指定使用哪個模板進(jìn)行渲染
    
    context_object_name = "article_list"
    # context_object_name屬性用于給上下文變量取名(在模板中使用該名字)
    
    def get_queryset(self):
        """
        過濾數(shù)據(jù),獲取所有已發(fā)布文章,并且將內(nèi)容轉(zhuǎn)成markdown形式
        """
        article_list = Article.objects.filter(status="p")
        # 獲取數(shù)據(jù)庫中的所有已發(fā)布的文章,即filter(過濾)狀態(tài)為"p"(已發(fā)布)的文章。
        for article in article_list:
            article.body = markdown2.markdown(article.body, )
            # 將markdown標(biāo)記的文本轉(zhuǎn)為html文本
        return article_list

    def get_context_data(self, **kwargs):
            # 增加額外的數(shù)據(jù),這里返回一個文章分類,以字典的形式
        kwargs["category_list"] = Category.objects.all().order_by("name")
        return super(IndexView, self).get_context_data(**kwargs)

可能覺得奇怪的是既然是視圖函數(shù)為什么不是用 def 來定義,而是寫成一個類?這里涉及到 django 的關(guān)于類的通用視圖的概念:參考類的通用視圖。我們通過調(diào)用 as_view 方法會將該類視圖轉(zhuǎn)為一般的視圖,這在 url 部分會介紹。

這樣,這個視圖的工作流程就是首先接受來自用戶的 Http 請求,然后從數(shù)據(jù)庫中獲取到已經(jīng)發(fā)布的文章列表:article_list = Article.objects.filter(status="p"),并轉(zhuǎn)換 markdown 語法標(biāo)記,再加載模板文件:template_name = "blog/index.html",將模板中的變量用相應(yīng)的數(shù)據(jù)庫中的數(shù)據(jù)庫替換后返回給瀏覽器,這樣,用戶就看到了從數(shù)據(jù)庫中被取出然后被渲染后的文章列表了。

編寫 Template

template 稍微麻煩一點,因為涉及到 html 的相關(guān)知識,如果你沒有學(xué)過 html ,可能會有些看不懂,因此推薦學(xué)習(xí)一下,這里有很棒的教程:w3school 的 html 教程供學(xué)習(xí)使用。這里只介紹一點點本項目涉及的模板相關(guān)知識,其實 django 文檔的入門教程的六個 parts 中涵蓋的點已經(jīng)足以對付此簡單的 Blog 項目了。

模板標(biāo)簽,用{% %} 表示,一些常用的有{% for %}循環(huán)標(biāo)簽,{% if %}判斷標(biāo)簽等。

模板變量,用{{ variable }}表示,模板渲染是這些變量會被數(shù)據(jù)庫中相應(yīng)的值代替,例如article_list = Article.objects.filter(status="p"),從數(shù)據(jù)庫中取出了已發(fā)布的文章列表,賦給了 article_list 變量。如果模板文件中有如下代碼:

{% for article in article_list %}
    {{article.title}}

那么渲染時就會循環(huán)渲染 n 篇文章,并且 {{article.title}} 也會被存儲在數(shù)據(jù)庫中文章的標(biāo)題取代。

更多詳細(xì)的資料,請參考官方文檔關(guān)于 template 的介紹,或者中文文檔

編寫 URL

寫好了數(shù)據(jù)庫、視圖和模板,現(xiàn)在就是當(dāng)用戶在瀏覽器輸入 url 訪問我們的 Blog 時要告訴 django 哪個 url 的請求對應(yīng)哪個視圖函數(shù)來處理,通過 urls.py 來指定:

urls.py

urlpatterns = [

    ...
    url(r"^blog/", views.IndexView.as_view()),
    # 首頁調(diào)用IndexView
    ...

]

至此,Blog 應(yīng)用的首頁算是完成了,當(dāng)用戶訪問我們的主頁就可以看到文章列表了:

接下來做什么?

至此,我們完成了博客的首頁以展示文章列表的功能,接下來我們會為我們的 Blog 添加詳情頁面和分類頁面功能,即用戶點擊文章標(biāo)題或者閱讀原文后進(jìn)入文章的詳細(xì)頁面,點擊分類則展示該分類下的全部文章列表。敬請期待我們下一周的教程。如果你希望為你的 Blog 添加其他更加獨特的功能,也請隨時告訴我們。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37949.html

相關(guān)文章

  • Django 學(xué)習(xí)小組博客開發(fā)實戰(zhàn)第二周教程 —— 實現(xiàn)博客詳情頁和分類頁

    摘要:本節(jié)接上周的文檔學(xué)習(xí)小組博客開發(fā)實戰(zhàn)第一周教程編寫博客的首頁面,我們繼續(xù)給博客添加功能,以及改善前面不合理的部分。返回該視圖要顯示的對象。目前小組正在完成第一個項目,本文即是該項目第二周的相關(guān)文檔。 本教程內(nèi)容已過時,更新版教程請訪問: django 博客開發(fā)入門教程。 上周我們完成了博客的 Model 部分,以及 Blog 的首頁視圖 IndexView。 本節(jié)接上周的文檔 Djan...

    ingood 評論0 收藏0
  • Django 學(xué)習(xí)小組博客開發(fā)實戰(zhàn)第五周教程 —— 實現(xiàn)評論功能

    摘要:本教程內(nèi)容已過時,更新版教程請訪問博客開發(fā)入門教程。我們的評論表單放在中,評論成功后返回到原始提交頁面。學(xué)習(xí)小組簡介學(xué)習(xí)小組是一個促進(jìn)新手互相學(xué)習(xí)互相幫助的組織。 本教程內(nèi)容已過時,更新版教程請訪問: django 博客開發(fā)入門教程。 通過前四周的時間我們開發(fā)了一個簡單的個人 Blog,前幾期教程地址: 第一周:Django 學(xué)習(xí)小組:博客開發(fā)實戰(zhàn)第一周教程 —— 編寫博客的 Mode...

    CoderStudy 評論0 收藏0
  • Django 學(xué)習(xí)小組博客開發(fā)實戰(zhàn)第五周教程 —— 實現(xiàn)評論功能

    摘要:本教程內(nèi)容已過時,更新版教程請訪問博客開發(fā)入門教程。我們的評論表單放在中,評論成功后返回到原始提交頁面。學(xué)習(xí)小組簡介學(xué)習(xí)小組是一個促進(jìn)新手互相學(xué)習(xí)互相幫助的組織。 本教程內(nèi)容已過時,更新版教程請訪問: django 博客開發(fā)入門教程。 通過前四周的時間我們開發(fā)了一個簡單的個人 Blog,前幾期教程地址: 第一周:Django 學(xué)習(xí)小組:博客開發(fā)實戰(zhàn)第一周教程 —— 編寫博客的 Mode...

    kumfo 評論0 收藏0
  • Django 學(xué)習(xí)小組博客開發(fā)實戰(zhàn)第四周——標(biāo)簽云文章歸檔

    摘要:本教程內(nèi)容已過時,更新版教程請訪問博客開發(fā)入門教程。表示降序排列,默認(rèn)是升序排列。學(xué)習(xí)小組簡介學(xué)習(xí)小組是一個促進(jìn)新手互相學(xué)習(xí)互相幫助的組織。我們會將每周的詳細(xì)開發(fā)文檔和代碼通過郵件列表發(fā)出。 本教程內(nèi)容已過時,更新版教程請訪問: django 博客開發(fā)入門教程。 通過前四周的時間我們開發(fā)了一個簡單的個人 Blog,教程地址: 第一周:Django 學(xué)習(xí)小組:博客開發(fā)實戰(zhàn)第一周教程 ——...

    RichardXG 評論0 收藏0
  • Django 學(xué)習(xí)小組:基于類通用視圖詳解(一)

    摘要:本教程首先介紹兩個項目中遇到的通用視圖和。語句的作用是添加了到上下文中,還要把默認(rèn)的一些上下文變量也返回給視圖函數(shù),以便其后續(xù)處理。 通過三周的時間我們開發(fā)了一個簡單的個人 Blog,教程地址: 第一周:Django 學(xué)習(xí)小組:博客開發(fā)實戰(zhàn)第一周教程 —— 編寫博客的 Model 和首頁面 第二周:Django 學(xué)習(xí)小組:博客開發(fā)實戰(zhàn)第二周教程 —— 博客詳情頁面和分類頁面 第三周:D...

    atinosun 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<