Django實踐(二)——使用模型類定義資料表,實現表單頁面跳轉

楊文欣欣發表於2020-12-12

Django實踐(二)——使用模型類定義資料表,實現表單頁面跳轉

1.設計和開發資訊釋出的資料防訪問層

配置djangosite/settings.py中的INSTALLED_APPS,新增應用app_1的Config類,告訴Django需要安裝應用app_1中的模型。

'app_1.apps.AppConfig',

(注意:不要忘記逗號!)
在這裡插入圖片描述

在app_1/models.py中,新建模型類Moment,定義資訊釋出表。
相當於在資料庫中定義資料和型別。

class Moment(models.Model):
    content = models.CharField(max_length=200)  # 儲存訊息內容
    user_name = models.CharField(max_length=20)  # 儲存釋出人的名字
    kind = models.CharField(max_length=20)  # 儲存訊息型別

在這裡插入圖片描述

生成資料移植檔案(makemigrations)
將models.py中定義的資料錶轉換成資料庫生成指令碼的過程,檢查改動是否符合資料庫的語法。
通過cmd命令列工具manage.py完成:

python manage.py makemigrations app_1

在這裡插入圖片描述

生成如下檔案,是資料庫生成的中間檔案:
在這裡插入圖片描述

如果對models.py進行修改,則需要再執行一次makemigrations,會生成新的.py中間檔案。
注意:migrations中的檔案均由manage.py生成,開發者不要手動修改。

移植到資料庫:
cmd執行

python manage.py migrate
將修改的資料同步到真實資料庫中。這個過程會檢查migrations中的所有檔案,逐步使歷次生成的移植檔案生效。

2.設計和開發資訊錄入頁面

功能:提供輸入介面,使用者輸入名字、文字訊息內容、選擇訊息型別;提交後網頁自動設定該資訊的時間並儲存到資料庫中。

(1)建立表單
新建app_1/forms.py:

from django.forms import ModelForm  # 表單類的基類
from app_1.models import Moment


# 定義表單類
class MomentForm(ModelForm):
    class Meta:
        model = Moment
        fields = '__all__'  # 匯入models.py的Moment類的所有欄位
 

在這裡插入圖片描述

tips:Pycharm匯入自定義的包
在這裡插入圖片描述

(2)修改模型類
實現功能:使得使用者能夠以單選方式設定訊息型別
修改app_1/models.py

# -*- coding: utf-8 -*-
from django.db import models
# from __future__ import unicode_literals

# 新增元組用於設定訊息型別列舉項
KIND_CHOICES = (
    ('python技術', 'python技術'),
    ('資料庫技術', '資料庫技術'),
    ('經濟學', '經濟學'),
    ('文體資訊', '文體資訊'),
    ('個人心情', '個人心情'),
    ('其他', '其他'),
)


# Create your models here.
class Moment(models.Model):
    content = models.CharField(max_length=200)  # 儲存訊息內容
    user_name = models.CharField(max_length=20, default='匿名')  # 儲存釋出人的名字
    # 修改kind定義,加入choices引數
    kind = models.CharField(max_length=20, choices=KIND_CHOICES, default=KIND_CHOICES[0])  # 儲存訊息型別

(3)開發模板檔案
用於產生HTML、XML等文字格式文件
新建目錄app_1/templates,新建檔案moments_input.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>訊息錄入介面</title>
</head>
<body>
    <form action="?" method="post">
        <fieldset>
            <legend>請輸入並提交</legend>
                {{ forms.as_p }}
                <input type="submit" value="submit" />
        </fieldset>
		{% csrf_token %}
    </form>
</body>
</html>

{{ forms.as_p }}定義表單MomentForm類的輸入欄位

這裡需要注意:要在form中新增{% csrf_token %}
否則,點選submit提交按鈕時(瀏覽器輸入網址,正常顯示moments_input頁面),會出現報錯:CSRF verification failed. Request aborted.
原因:Django針對CSRF(Cross-Stie Request Forgery,跨站請求偽造漏洞)的保護措施,需要在生成的每個表單中放置一個自動生成的令牌,通過這個令牌判斷POST請求是否來自同一個網站。
解決:
在這裡插入圖片描述

或者:
直接註釋settings.py中MIDDLEWARE數值的'django.middleware.csrf.CsrfViewMiddleware'

(4)開發檢視
將表單類和頁面模板連線
開啟app_1/views.py,新增moments_input函式

from django.http import HttpResponse
from app_1.forms import MomentForm
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render
import os


# Create your views here.
def welcome(request):
    return HttpResponse("<h1>Welcome to my tiny twitter!</h1>")


# 新增
def moments_input(request):
    if request.method == 'POST':  # 使用者提交表單
        form = MomentForm(request.POST)
        if form.is_valid():
            moment = form.save()
            moment.save()
            return HttpResponseRedirect(reverse("app_1.views.welcome"))
    else:  # 普通的訪問
        form = MomentForm()
    PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    return render(request, os.path.join(PROJECT_ROOT, 'app_1/templates', 'moments_input.html'), {'form': form})

修改views.py檢視檔案之後,要在urls.py中新增檢視的路由對映,呼叫moments_input
在app_1/urls.py中新增:

url(r'moments_input', view=views.moments_input),

在這裡插入圖片描述

瀏覽器輸入網址,正常顯示moments_input頁面,但是點選submit按鈕提交報錯:NoReverseMatch at /app_1/moments_input. Reverse for ‘app_1.views.welcome’ not found. ‘app_1.views.welcome’ is not a valid view function or pattern name.(沒有正確返回welcome頁面)
原因:沒法路由對映到welcome表單
解決:django 2.x.x以後需要在app_1/urls.py中的url需要定義name

name='app_1.views.moments_input'
name='app_1.views.welcome'

(如果只是為了返回welcome頁面,moments_inpu的name可以暫時先不新增,為了後續的擴充性,建議一併新增)

在這裡插入圖片描述

3.顯示頁面

(1)在pycharm的terminal中,進入djangosite,啟動web伺服器:

python manage.py runserver 0.0.0.0:8001

在這裡插入圖片描述

(2)瀏覽器輸入:
http://localhost:8001/app_1/moments_input
在這裡插入圖片描述

輸入content,點選submit,顯示:
在這裡插入圖片描述

參考資料

《Python高效開發實戰》劉長龍,第6章

相關文章