1. 程式人生 > >Django2.0-表單(1)-Form使用

Django2.0-表單(1)-Form使用

Django中的表單

Django中的表單豐富了傳統的HTML語言中的表單。在Django中的表單,主要做以下兩件事:

  1. 渲染表單模板。(不常用,容易前後端耦合)
  2. 表單驗證資料是否合法。

Django中表單使用流程

在一個app中新建一個forms.py,定義一個表單類,繼承自django.forms.Form

Field欄位名稱在html中對應的是<input type="text" name="field_name" >中input標籤的name屬性

比如title欄位在html中就是<input type="text" name="title">

from django import
forms class FormTable(forms.Form): # label是渲染欄位的名稱(預設是變數名),error_messages的鍵值對是{"'code'對應的值": "你想要顯示的內容"} title = forms.CharField(min_length=5, max_length=100, label="標題", error_messages={"min_length": "字元至少5個,至多100個"}) content = forms.CharField(widget=forms.Textarea,
label="內容", error_messages={"required": "要有content內容"}) email = forms.EmailField(label="郵箱", error_messages={"required": "必須是郵箱格式"}) reply = forms.BooleanField(required=False, label="是否回覆")

在檢視中,根據是GET還是POST請求來做相應的操作。如果是GET請求,那麼返回一個空的表單,如果是POST請求,那麼將提交上來的資料進行校驗。

# views.py
from django.shortcuts import render,HttpResponse
from django.views.generic import View  # 載入檢視類
from .forms import FormTable  # 載入表單類
# Create your views here.

# from django.forms.utils import ErrorDict  # 這個是表單類的errors的型別


class MessageForm(View):
    def get(self, request):
        form = FormTable()
        return render(request, "index.html", context={"form": form})

    def post(self, request):
        form = FormTable(request.POST)
        if form.is_valid():  # 如果各個欄位合法
            title = form.cleaned_data.get("title")
            content = form.cleaned_data.get("content")
            email = form.cleaned_data.get("email")
            reply = form.cleaned_data.get("reply")
            print("title: {}\ncontentL {}\nemail: {}\nreply: {}\n".format(title,content,email,reply))
            return HttpResponse("success")
        else:
            print(type(form.errors))
            print(form.errors.get_json_data())
            return HttpResponse("failure")

在使用GET請求的時候,我們傳了一個form給模板,那麼以後模板就可以使用form來生成一個表單的html程式碼。在使用POST請求的時候,我們根據前端上傳上來的資料,構建一個新的表單,這個表單是用來驗證資料是否合法的,如果資料都驗證通過了,那麼我們可以通過cleaned_data來獲取相應的資料。在模板中渲染表單的HTML程式碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    <table>
        {{ form.as_table }}
        <tr>
            <td></td>
            <td><input type="submit" name="提交" ></td>
        </tr>
    </table>
</form>
</body>
</html>

我們在最外面給了一個form標籤,然後在裡面使用了table標籤來進行美化,在使用form物件渲染的時候,使用的是table的方式,當然還可以使用ul的方式(as_ul),也可以使用p標籤的方式(as_p),並且在後面我們還加上了一個提交按鈕。這樣就可以生成一個表單了

下面是表單類.errors.get_json_data()方法返回的值

{'title': [{'message': 'Ensure this value has at least 5 characters (it has 4).', 'code': 'min_length'}], 'content': [{'message': 'This field is required.', 'code': 'required'}], 'email': [{'message': 'This field is required.', 'code': 'required'}]

在表單類(這裡是FormTable)中給各個欄位新增errors_message新增鍵值對後可修改錯誤提示

{'title': [{'message': '字元至少5個,至多100個', 'code': 'min_length'}], 'content': [{'message': '要有content內容', 'code': 'required'}], 'email': [{'message': '必須是郵箱格式', 'code': 'required'}]}