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

資訊專欄INFORMATION COLUMN

Django搭建個人博客:使用Form表單類發(fā)表新文章

Java3y / 1644人閱讀

摘要:一些表單界面元素文本框或復(fù)選框非常簡單并內(nèi)置在中,而其他會復(fù)雜些像彈出日期選擇等操作控件。和標(biāo)簽中的屬性指定了當(dāng)前文本框提交的數(shù)據(jù)的名稱,它必須與表單類中的字段名稱對應(yīng),否則服務(wù)器無法將字段和數(shù)據(jù)正確的對應(yīng)起來。

前面我們已經(jīng)學(xué)會如何用Markdown語法書寫文章了。

但是還有問題呀。之前寫文章都是在后臺中進行的,萬一有別的普通用戶也要發(fā)表文章怎么辦?萬一我想拓展些后臺中沒有的提交驗證功能又怎么辦?

本章即講述如何在前臺中提交新的文章,以便滿足開發(fā)者各種各樣的特殊需求。

Forms表單類

在HTML中,表單是在

... 中的一些元素
,它允許訪客做類似輸入文本、選擇選項、操作對象或空間等動作,然后發(fā)送這些信息到服務(wù)端。一些表單界面元素(文本框或復(fù)選框)非常簡單并內(nèi)置在HTML中,而其他會復(fù)雜些:像彈出日期選擇等操作控件。

處理表單是一件挺復(fù)雜的事情。想想看Django的admin,許多不同類型的數(shù)據(jù)可能需要在一張表單中準(zhǔn)備顯示,渲染成HTML,使用方便的界面進行編輯,傳到服務(wù)器,驗證和清理數(shù)據(jù),然后保存或跳過進行下一步處理。

Django的表單功能可以簡化上述工作的大部分內(nèi)容,并且也能比大多數(shù)程序員自己編寫代碼去實現(xiàn)來的更安全。

Django表單系統(tǒng)的核心組件是 Form,它能夠描述一張表單并決定它如何工作及呈現(xiàn)。

要使用Form類也很簡單,需要在article/中創(chuàng)建forms.py文件,并寫入如下代碼:

article/forms.py

# 引入表單類
from django import forms
# 引入文章模型
from .models import ArticlePost

# 寫文章的表單類
class ArticlePostForm(forms.ModelForm):
    class Meta:
        # 指明數(shù)據(jù)模型來源
        model = ArticlePost
        # 定義表單包含的字段
        fields = ("title", "body")

代碼中ArticlePostForm類繼承了Django的表單類forms.ModelForm,并在類中定義了內(nèi)部類class Meta(之前提到過,還記得嗎),指明了數(shù)據(jù)模型的來源,以及表單中應(yīng)該包含數(shù)據(jù)模型的哪些字段。

ArticlePost模型中,createdupdated字段為自動生成,不需要填入;author字段暫時固定為id=1的管理員用戶,也不用填入;剩下的titlebody就是表單需要填入的內(nèi)容了。

接下來,改寫article/views.py,添加一個視圖函數(shù)以處理寫文章的請求:

article/views.py

...

# 引入redirect重定向模塊
from django.shortcuts import render, redirect
# 引入HttpResponse
from django.http import HttpResponse
# 引入剛才定義的ArticlePostForm表單類
from .forms import ArticlePostForm
# 引入User模型
from django.contrib.auth.models import User

...

# 寫文章的視圖
def article_create(request):
    # 判斷用戶是否提交數(shù)據(jù)
    if request.method == "POST":
        # 將提交的數(shù)據(jù)賦值到表單實例中
        article_post_form = ArticlePostForm(data=request.POST)
        # 判斷提交的數(shù)據(jù)是否滿足模型的要求
        if article_post_form.is_valid():
            # 保存數(shù)據(jù),但暫時不提交到數(shù)據(jù)庫中
            new_article = article_post_form.save(commit=False)
            # 指定數(shù)據(jù)庫中 id=1 的用戶為作者
            new_article.author = User.objects.get(id=1)
            # 將新文章保存到數(shù)據(jù)庫中
            new_article.save()
            # 完成后返回到文章列表
            return redirect("article:article_list")
        # 如果數(shù)據(jù)不合法,返回錯誤信息
        else:
            return HttpResponse("表單內(nèi)容有誤,請重新填寫。")
    # 如果用戶請求獲取數(shù)據(jù)
    else:
        # 創(chuàng)建表單類實例
        article_post_form = ArticlePostForm()
        # 賦值上下文
        context = { "article_post_form": article_post_form }
        # 返回模板
        return render(request, "article/create.html", context)

分析一下上面的代碼。當(dāng)視圖函數(shù)接收到一個客戶端的request請求時,首先根據(jù)request.method判斷用戶是要提交數(shù)據(jù)(POST)、還是要獲取數(shù)據(jù)(GET)

如果用戶是提交數(shù)據(jù),將POST給服務(wù)器的表單數(shù)據(jù)賦于article_post_form實例。

然后使用Django內(nèi)置的方法.is_valid()判斷提交的數(shù)據(jù)是否滿足模型的要求。

如果滿足要求,保存表單中的數(shù)據(jù)(但是commit=False暫時不提交到數(shù)據(jù)庫,因為author還未指定),并指定author為id=1的管理員用戶。然后提交到數(shù)據(jù)庫,并通過redirect返回文章列表。redirect可通過url地址的名字,反向解析到對應(yīng)的url。

如果不滿足要求,則返回一個字符串"表單內(nèi)容有誤,請重新填寫。",告訴用戶出現(xiàn)了什么問題。

如果用戶是獲取數(shù)據(jù),則返回一個空的表單類對象,提供給用戶填寫。

其實邏輯并不復(fù)雜,不明白的讀者請逐句理解。

這里特別提醒Django中的縮進不能夠空格和tab鍵混用,否則會報錯。由于不同的編輯器對tab的顯示不盡相同,因此你應(yīng)該堅持使用空格鍵縮進。

寫好視圖之后,就需要寫模板文件了。在templates/article/中創(chuàng)建create.html

templates/article/create.html


{% extends "base.html" %} {% load staticfiles %}

{% block title %} 寫文章 {% endblock title %}

{% block content %}


{% csrf_token %}
{% endblock content %}

html文件還是一如既往的長。再重復(fù)一次,看不懂html文件語法也沒有關(guān)系,先照著抄一遍,以后再慢慢理解,不影響目前Django的學(xué)習(xí)。

對其中的新內(nèi)容進行審視:

..
標(biāo)簽中的內(nèi)容就是需要提交的表單。method="post"指定了表單提交的方式為POST(與視圖函數(shù)中的request.method相聯(lián)系);action="."指定了表單提交的地址為默認(rèn)的當(dāng)前url。

關(guān)于{% csrf_token %},它是Django中一個與網(wǎng)絡(luò)安全相關(guān)的中間件驗證。目前我們暫時不去深究它的實現(xiàn),只需要知道表單中必須包含它就可以了,否則將會得到一個403錯誤。