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
- PHP頁面跳轉如何實現延時跳轉PHP
- PHP頁面跳轉幾種實現方法PHP
- 說說如何使用 vue-router 實現頁面跳轉Vue
- iOS專案開發實戰——使用程式碼實現頁面跳轉iOS
- 【轉】跳躍表-原理及Java實現Java
- uni-APP 新增頁面實現路由跳轉APP路由
- Ruby Ruport實踐—報表引數實現(二)
- Flutter頁面跳轉到IOS原生介面 如何實現?FlutteriOS
- asyUI分頁中,如何實現頁面跳轉,再返回時,...UI
- iOS專案開發實戰——使用三種方式實現頁面跳轉與引數傳遞(二)iOS
- Flutter 實現底部擴散模糊動畫(一)跳轉頁面Flutter動畫
- Android 頁面跳轉動畫的兩種實現方式Android動畫
- struts2實現登入後跳轉回本頁面
- APP直接跳轉設定頁面APP
- Redis資料結構—跳躍表 skiplist 實現原始碼分析Redis資料結構原始碼
- 原生js實現獲取form表單資料JSORM
- js實現操作成功之後自動跳轉頁面JS
- nginx 設定 404 500 頁面跳轉到指定頁面Nginx
- 使用GoldenGate 實現Oracle for Oracle 單向資料同步(實現表的DML操作同步)GoOracle
- Bert文字分類實踐(一):實現一個簡單的分類模型文字分類模型
- 普通填報表單元格實現資料二次篩選
- 【Android】2:控制元件使用及頁面跳轉實戰Android控制元件
- Django搭建個人部落格:使用Form表單類發表新文章DjangoORM
- [轉]spring mvc註解方式實現嚮導式跳轉頁面SpringMVC
- 使用線上重定義方法改造普通表為分割槽表實戰
- 在MVC中實現 網頁錯誤跳轉到500統一頁面MVC網頁
- vue路由切換滑動效果 vue頁面跳轉互動 vue實現動畫跳轉Vue路由動畫
- 使用meta實現網頁跳轉程式碼例項網頁
- Swift-從View跳轉頁面+實用技巧SwiftView
- 分享自研實現的多資料來源(支援同DB不同表、跨DB表、記憶體資料、外部系統資料等)分頁查詢工具類實現原理及使用記憶體
- django 網站實現簡單分頁Django網站
- Flowable 6.6.0 BPMN使用者指南 -9 表單 - 9.1 表單定義
- 重寫ajax實現session超時跳轉到登陸頁面Session
- React實現表單資料的新增與刪除React
- ACCESS 在資料表中實現簡單計算
- PHPAjax實現頁面無重新整理發表評論PHP
- 直播平臺搭建,實現自定義設定登入頁面