五. Django的forms與ModelForm

在前一小節中,我們主要通過頁面來顯示了信息列表,那麼如何在頁面中進行增刪改查的工作呢?在這一小節中,我們將通過頁面來對現有數據進行增刪改的操作。

 

1.      Forms的介紹:

我們知道通過頁面向數據庫中插入新的數據,一般會通過表單,而Django提供了非常完善的表單系統。

以下是Django官網對於form的介紹:

Django’s form functionality can simplify and automate vast portions of this work, and can also do it more securely than most programmers would be able to do in code they wrote themselves.

Django handles three distinct parts of the work involved in forms:

  • preparing and restructuring data to make it ready for rendering
  • creating HTML forms for the data
  • receiving and processing submitted forms and data from the client

簡言之,Django會將表單的提交變得更加簡單和安全,包括重構數據後在頁面間傳遞,創建前端的HTML頁面以及接收和處理客戶端傳來的數據。實施上,你只需要事先定義好form表單的各種屬性,在前端頁面簡單調用即可。當然,DjangoForm提供了許多屬性,方便自定義,甚至你可以重寫其中的一些方法。

 

2.      ModelForm的介紹:

Form的基礎上,Django還提供了一種ModelForm。如果你的FORM表單十分貼近數據Model,那麼可以用ModelForm來節省大量代碼。例如,如果數據模型中需要有3個字段,而且3個字段恰好都需要通過form來提交,那麼使用ModelForm省時省力。同時,ModelForm也支持用戶的自定義。接下來,我們就通過ModelForm來做演示。

 

3.      通過ModelForm完成三張表格的數據新增:

1)  echo目錄下建立forms.py文件,今後將所有的form都寫在這個文件中,這個文件需要在views.py中導入,方便導入相應的FORM

 

2)  創建ModelForm:

forms.py:

 

# -*- coding: UTF-8 -*-
from django.forms import ModelForm
from .models import Node,Line,Device

#定義Node的Form,Form名字爲 模式名+Form
class NodeForm(ModelForm):
    #自定義ModelForm的內容
    class Meta:
        #該ModelForm參照Model: Node
        model = Node
        #在Form中不顯示node_signer這個字段
        exclude = ['node_signer']

class LineForm(ModelForm):
    class Meta:
        model = Line
        exclude = ['line_signer']

class DeviceForm(ModelForm):
    class Meta:
        model = Device
        exclude = ['device_signer']


1)  建立urlview的關聯關係:

urls.py:

url(r'^add/', echo.views.add),


4) views.py中建立相應的函數:

views.py:

# -*- coding: UTF-8 -*-
from .models import Node,Line,Device
from forms import NodeForm,LineForm,DeviceForm
from django.shortcuts import render, redirect
def add(request):
    #獲取來自NodeForm的表單數據
    form = NodeForm(request.POST or None)
    #判斷form是否有效
    if form.is_valid():
        #創建實例,需要做些數據處理,暫不做保存
        instance = form.save(commit=False)
        #將登錄用戶作爲登記人
        instance.node_signer = request.user
        #保存該實例
        instance.save()
        #跳轉至列表頁面
        return redirect('/lists/')

    #創建context來集中處理需要傳遞到頁面的數據
    context = {
        'form': form,
    }
    #如果沒有有效提交,則仍留在原來頁面
    return render(request, 'add.html',  context)


5) templates文件夾下建立HTML文件,add.html

add.html:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
 <form method='POST' action=''>{% csrf_token %}
        {{ form }}
        <input type='submit' value='提交' />
 </form>

</body>
</html>


add.html頁面中,表單必須有{% csrf_token %}這個標籤,否則頁面無法正常提交。這是Django特意用來增加安全性,防治CSRF攻擊的手段。

CSRF攻擊通過在授權用戶訪問的頁面中包含鏈接或者腳本的方式工作。例如:一個網站用戶Bob可能正在瀏覽聊天論壇,而同時另一個用戶Alice也在此論壇中,並且後者剛剛發佈了一個具有Bob銀行鏈接的圖片消息。設想一下,Alice編寫了一個在Bob的銀行站點上進行取款的form提交的鏈接,並將此鏈接作爲圖片src。如果Bob的銀行在cookie中保存他的授權信息,並且此cookie沒有過期,那麼當Bob的瀏覽器嘗試裝載圖片時將提交這個取款form和他的cookie,這樣在沒經Bob同意的情況下便授權了這次事務。

 

6)啓動服務,訪問http://127.0.0.1:8000/add,發現能夠通過這個頁面正常插入數據

提交後,將自動跳轉至列表頁面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章