Django實踐(二)——使用模型類定義資料表,實現表單頁面跳轉
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章
相關文章
- PHP中實現頁面跳轉PHP
- 說說如何使用 vue-router 實現頁面跳轉Vue
- uni-APP 新增頁面實現路由跳轉APP路由
- BI中事實表和維度表的定義(轉載)
- asyUI分頁中,如何實現頁面跳轉,再返回時,...UI
- Flutter頁面跳轉到IOS原生介面 如何實現?FlutteriOS
- Redis資料結構—跳躍表 skiplist 實現原始碼分析Redis資料結構原始碼
- 普通填報表單元格實現資料二次篩選
- Django搭建個人部落格:使用Form表單類發表新文章DjangoORM
- Flutter 實現底部擴散模糊動畫(一)跳轉頁面Flutter動畫
- js實現操作成功之後自動跳轉頁面JS
- Bert文字分類實踐(一):實現一個簡單的分類模型文字分類模型
- 分享自研實現的多資料來源(支援同DB不同表、跨DB表、記憶體資料、外部系統資料等)分頁查詢工具類實現原理及使用記憶體
- Flowable 6.6.0 BPMN使用者指南 -9 表單 - 9.1 表單定義
- echarts圖表y軸資料反轉的實現Echarts
- nginx 設定 404 500 頁面跳轉到指定頁面Nginx
- django 網站實現簡單分頁Django網站
- ACCESS 在資料表中實現簡單計算
- django使用多個資料庫實現Django資料庫
- Django——表單Django
- vue路由切換滑動效果 vue頁面跳轉互動 vue實現動畫跳轉Vue路由動畫
- 實現單項鍊表
- Django基礎五之django模型層(一)單表操作Django模型
- Mybatis實現分包定義資料庫MyBatis資料庫
- DS順序表--類實現
- HTML 使用表單標籤實現註冊頁面的例項程式碼HTML
- Oracle日曆表維護實踐:建表、準備資料Oracle
- Halo 開源專案學習(二):實體類與資料表
- 直播平臺搭建,實現自定義設定登入頁面
- 潤乾報表設計器中使用 spring 框架實現自定義資料集Spring框架
- 成品直播原始碼,html頁面點選按鈕實現頁面跳轉的兩種方法原始碼HTML
- 深入 Django 模型層:資料庫設計與 ORM 實踐指南Django模型資料庫ORM
- vue頁面跳轉Vue
- Flutter頁面跳轉Flutter
- django返回頁面和json格式列表給前端AntV圖表使用。DjangoJSON前端
- 如何在 web 頁面中實現類似 excel 固定表頭 / 標題行的效果?WebExcel
- Android Jetpack - 使用 Navigation 管理頁面跳轉AndroidJetpackNavigation
- 前端頁面上實現表單提交檔案上傳功能前端