本實(shí)例來自慕課網(wǎng)實(shí)戰(zhàn)課程《強(qiáng)力django+殺手級(jí)xadmin 打造上線標(biāo)準(zhǔn)的在線教育平臺(tái)》,超級(jí)好的一個(gè)課程,建議支持購(gòu)買學(xué)習(xí)。購(gòu)買連接:<a>http://coding.imooc.com/class/78.html</a>
實(shí)例內(nèi)容:
一個(gè)簡(jiǎn)單的將前端頁(yè)面數(shù)據(jù)提交到數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)取出數(shù)據(jù)展示到前端頁(yè)面。
環(huán)境:
win10 + pycharm + python3.5 + django1.10
項(xiàng)目配置流程:
安裝pymysql→Settings配置→(databases,templates下的dirs,新建statixfiles_dirs)→migration生成數(shù)據(jù)表→編寫views.py→配置urls.py→(1.HTNL個(gè)css文件分離,2.css文件分離與地址修改)
第一步:創(chuàng)建項(xiàng)目djangostart

第二步:創(chuàng)建app-> message
首先按照?qǐng)D所示,調(diào)出運(yùn)行窗口

然后在窗口中輸入:startapp message
這時(shí)會(huì)生成對(duì)應(yīng)的app,并將app添加到setting配置文件。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'message',
]
第三步:創(chuàng)建static目錄,用于存放靜態(tài)文件(CSS,JS等文件)

至此我們已經(jīng)創(chuàng)建好項(xiàng)目的基本目錄。
第四步:將前端頁(yè)面配置到模板,將CSS文件配置到static目錄
目錄結(jié)構(gòu)為

前端頁(yè)面代碼邏輯為;
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="/static/css/style.css">
</head>
第五步:配置setting文件中的靜態(tài)文件和模板文件路徑
當(dāng)配置好第四步之后,我們?nèi)绻\(yùn)行程序不會(huì)加載出頁(yè)面,因?yàn)槲覀冃枰渲梦募窂健?br> 對(duì)于靜態(tài)文件:
STATIC_URL = '/static/'
#僅有上面的設(shè)置,只說明了樣式放在static文件,需要指定和項(xiàng)目根目錄的關(guān)系
#設(shè)置靜態(tài)文件的目錄,設(shè)置為列表形式
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
對(duì)于模板文件:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
#根據(jù)根目錄設(shè)置templates目錄
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
其中的BASE_DIR為當(dāng)前目錄的絕對(duì)路徑
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
#獲取當(dāng)前目錄的絕對(duì)路徑
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
配置完這兩項(xiàng),我們就可以加載出頁(yè)面,否則加載不出。
第六步:配置django連接mysql數(shù)據(jù)庫(kù)
因?yàn)槲覀兊捻?xiàng)目是需要連接數(shù)據(jù)庫(kù)的,因此我們需要配置連接數(shù)據(jù)庫(kù)。
python3連接MySQL不再使用MySQLdb,現(xiàn)在大部分都是使用PyMySQL用于連接MySQL數(shù)據(jù)庫(kù)。
首先安裝PyMySQL用于替代MySQLdb。
然后在工程目錄的init.py中填寫下面兩句話
import pymysql
pymysql.install_as_MySQLdb()
接著配置setting文件,連接數(shù)據(jù)庫(kù)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #主要是這里,將默認(rèn)的sqlite3改為mysql
'NAME': "testdjango", #數(shù)據(jù)庫(kù)的名字
'USER': "root",#數(shù)據(jù)庫(kù)用戶名
'PASSWORD': "root",#數(shù)據(jù)庫(kù)密碼
'HOST': "127.0.0.1",數(shù)據(jù)庫(kù)地址,默認(rèn)本機(jī)
'PORT': "",數(shù)據(jù)庫(kù)端口,默認(rèn)3306
}
}
配置好數(shù)據(jù)庫(kù)之后,可以根據(jù)django來生成默認(rèn)的數(shù)據(jù)表。
同樣是在Tools -> Run manage.py Task 打開運(yùn)行窗口
我們運(yùn)行makemigrations(檢查要修改的數(shù)據(jù)庫(kù)字段),migrate(生成數(shù)據(jù)表)
當(dāng)運(yùn)行完上述兩個(gè)命令之后,就會(huì)在數(shù)據(jù)庫(kù)中創(chuàng)建一些默認(rèn)的基本數(shù)據(jù)表。
第七步:配置urls.py和views.py
在views.py中配置函數(shù)
def getform(request):
return render(request,'message.html')
在urls.py中配置url映射
from django.conf.urls import url
from django.contrib import admin
from message.views import getform
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^form/$',getform,name='go_form')
]
配置好以上兩個(gè)文件,我們就可以調(diào)試程序了,Run -> Debug
然后在瀏覽器中輸入:<a>http://127.0.0.1:8000/form/</a>

第八步:django model層的配置
我們使用django的ORM機(jī)制,使類和數(shù)據(jù)庫(kù)里的表相對(duì)應(yīng)。
我們?cè)趍odels.py中進(jìn)行以下配置:
# Create your models here.
class UserMessage(models.Model):
object_id = models.CharField(primary_key=True,verbose_name=u"主鍵",max_length=20,default="")
name = models.CharField(max_length=20,null=True,blank=True,default="",verbose_name=u"用戶名")
email = models.EmailField(verbose_name=u"郵箱")
address = models.CharField(max_length=100,verbose_name=u"聯(lián)系地址")
message = models.CharField(max_length=500,verbose_name=u"留言信息")
class Meta:
verbose_name = u"用戶留言信息"
verbose_name_plural = verbose_name
#指定數(shù)據(jù)庫(kù)的表名
#db_table = "user_message"
#排序
#ordering = "-object_id"
根據(jù)前端頁(yè)面表單的數(shù)據(jù),我們創(chuàng)建了四個(gè)屬性。
里面的object_id 為主鍵。
配置好之后,我們配置生成數(shù)據(jù)表,Tools -> Run manage.py Task 打開運(yùn)行窗口:
makemigrations message
之后運(yùn)行
migrate message
我們可以通過navicat查看生成的數(shù)據(jù)表:

第九步:通過ORM對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查
首先我們?cè)趘iews.py中引用我們剛才創(chuàng)建的類
from .models import UserMessage
如何獲取數(shù)據(jù)庫(kù)中的數(shù)據(jù):
我們通過類UserMessage的數(shù)據(jù)表管理器objects獲取數(shù)據(jù)。
獲取數(shù)據(jù)庫(kù)的所有數(shù)據(jù),返回的是可以進(jìn)行循環(huán)的QuerySet類型 數(shù)據(jù)表管理器objects
all_message = UserMessage.objects.all()
for message in all_message:
print(message.name)
這里的message其實(shí)就是UserMessage的實(shí)例
我們還可以根據(jù)條件取出數(shù)據(jù)
all_message = UserMessage.objects.filter(name=u"王二小",address=u"杭州")
如何刪除數(shù)據(jù):
我們可以使用delete()函數(shù)刪除所取的值
all_message = UserMessage.objects.all()
#刪除所有
#all_message.delete()
for message in all_message:
#刪除單一值
#message.delete()
如何往數(shù)據(jù)庫(kù)里面添加數(shù)據(jù):
我們通過實(shí)例化UserMessage對(duì)象,通過屬性賦值,通過save()方法往數(shù)據(jù)庫(kù)里賦值。
user_message = UserMessage()
user_message.name = u"王小二"
user_message.message = u"放羊娃"
user_message.address = u"杭州"
user_message.object_id = "2"
user_message.email = "2@2.com"
user_message.save()
完成上面的代碼之后,我們運(yùn)行項(xiàng)目,然后刷新頁(yè)面,這時(shí)數(shù)據(jù)將會(huì)保存進(jìn)數(shù)據(jù)庫(kù)。
如何提取前端頁(yè)面表單中的數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中:
我們使用POST將表單數(shù)據(jù)提交。
#首先判斷request的方式
if request.method == "POST":
#通過request的get()函數(shù),獲得提交的值
name = request.POST.get('name','')#當(dāng)屬性值不存在,則賦空值
message = request.POST.get('message','')
email = request.POST.get('email','')
address = request.POST.get('address','')
user_message = UserMessage()
user_message.name = name
user_message.message = message
user_message.address = address
user_message.object_id = "3" #這里的主鍵我們隨便設(shè)置
user_message.email = email
#將值保存到數(shù)據(jù)庫(kù)
user_message.save()
我們提交的數(shù)據(jù)都保存在POST中,通過get方法獲得。
代碼中g(shù)et('name','')這里的name是前端頁(yè)面表單里面name="name"的name。
想要完成數(shù)據(jù)的提交在前端頁(yè)面要有下面兩項(xiàng)配置:
<form action="/form/}" method="post" class="smart-green">
以及表單的提交允許
#加了csrf_token之后才能夠往后臺(tái)提交數(shù)據(jù)
{% csrf_token %}
完成上面的代碼配置之后,運(yùn)行調(diào)試,然后在表單中輸入數(shù)據(jù)然后提交,數(shù)據(jù)被保存到數(shù)據(jù)庫(kù)中。
如何將數(shù)據(jù)庫(kù)中的數(shù)據(jù)顯式到前端頁(yè)面中:
通過render()方法,添加字典形式的參數(shù)。
#將后臺(tái)數(shù)據(jù)庫(kù)里的數(shù)據(jù)提取到前端頁(yè)面
message = None
all_message = UserMessage.objects.filter(name=u"王二小")
返回的Queryset可以做切片操作
if all_message:
message = all_message[0]
return render(request,'message.html',{"my_message":message})
在前端頁(yè)面中,我們使用的是字典的鍵。
在前端頁(yè)面的調(diào)用:
value="{{ my_message.name }}"
好了,至此為止,我們基本完成了一個(gè)簡(jiǎn)單的表單提交(里面有很多坑)。還有url的命名等其它知識(shí),歡迎包名學(xué)習(xí)《強(qiáng)力django+殺手級(jí)xadmin 打造上線標(biāo)準(zhǔn)的在線教育平臺(tái)》,超級(jí)好的一個(gè)課程,建議支持購(gòu)買學(xué)習(xí)。購(gòu)買連接:<a>http://coding.imooc.com/class/78.html</a>