記錄一次完整的基于django的實例

本實例來自慕課網(wǎng)實戰(zhàn)課程《強(qiáng)力django+殺手級xadmin 打造上線標(biāo)準(zhǔn)的在線教育平臺》,超級好的一個課程嚎朽,建議支持購買學(xué)習(xí)约谈。購買連接:<a>http://coding.imooc.com/class/78.html</a>

實例內(nèi)容:
一個簡單的將前端頁面數(shù)據(jù)提交到數(shù)據(jù)庫,從數(shù)據(jù)庫取出數(shù)據(jù)展示到前端頁面质和。

環(huán)境:
win10 + pycharm + python3.5 + django1.10

項目配置流程:
安裝pymysql→Settings配置→(databases稳摄,templates下的dirs,新建statixfiles_dirs)→migration生成數(shù)據(jù)表→編寫views.py→配置urls.py→(1.HTNL個css文件分離饲宿,2.css文件分離與地址修改)

第一步:創(chuàng)建項目djangostart

Paste_Image.png

第二步:創(chuàng)建app-> message

首先按照圖所示厦酬,調(diào)出運(yùn)行窗口

Paste_Image.png

然后在窗口中輸入:startapp message
這時會生成對應(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等文件)

Paste_Image.png

至此我們已經(jīng)創(chuàng)建好項目的基本目錄国夜。

第四步:將前端頁面配置到模板减噪,將CSS文件配置到static目錄

目錄結(jié)構(gòu)為

前端頁面代碼邏輯為;

<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)行程序不會加載出頁面,因為我們需要配置文件路徑筹裕。
對于靜態(tài)文件:

STATIC_URL = '/static/'
#僅有上面的設(shè)置醋闭,只說明了樣式放在static文件,需要指定和項目根目錄的關(guān)系

#設(shè)置靜態(tài)文件的目錄朝卒,設(shè)置為列表形式
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]

對于模板文件:

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)前目錄的絕對路徑

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
#獲取當(dāng)前目錄的絕對路徑
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

配置完這兩項证逻,我們就可以加載出頁面,否則加載不出抗斤。

第六步:配置django連接mysql數(shù)據(jù)庫

因為我們的項目是需要連接數(shù)據(jù)庫的囚企,因此我們需要配置連接數(shù)據(jù)庫。
python3連接MySQL不再使用MySQLdb瑞眼,現(xiàn)在大部分都是使用PyMySQL用于連接MySQL數(shù)據(jù)庫龙宏。
首先安裝PyMySQL用于替代MySQLdb。
然后在工程目錄的init.py中填寫下面兩句話

import pymysql
pymysql.install_as_MySQLdb()

接著配置setting文件伤疙,連接數(shù)據(jù)庫

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', #主要是這里银酗,將默認(rèn)的sqlite3改為mysql
        'NAME': "testdjango", #數(shù)據(jù)庫的名字
        'USER': "root",#數(shù)據(jù)庫用戶名
        'PASSWORD': "root",#數(shù)據(jù)庫密碼
        'HOST': "127.0.0.1",數(shù)據(jù)庫地址,默認(rèn)本機(jī)
        'PORT': "",數(shù)據(jù)庫端口掩浙,默認(rèn)3306
    }
}

配置好數(shù)據(jù)庫之后花吟,可以根據(jù)django來生成默認(rèn)的數(shù)據(jù)表。
同樣是在Tools -> Run manage.py Task 打開運(yùn)行窗口
我們運(yùn)行makemigrations(檢查要修改的數(shù)據(jù)庫字段)厨姚,migrate(生成數(shù)據(jù)表)
當(dāng)運(yùn)行完上述兩個命令之后衅澈,就會在數(shù)據(jù)庫中創(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')
]

配置好以上兩個文件谬墙,我們就可以調(diào)試程序了今布,Run -> Debug
然后在瀏覽器中輸入:<a>http://127.0.0.1:8000/form/</a>

Paste_Image.png

第八步:django model層的配置

我們使用django的ORM機(jī)制,使類和數(shù)據(jù)庫里的表相對應(yīng)拭抬。
我們在models.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ù)庫的表名
        #db_table = "user_message"
        #排序
        #ordering = "-object_id"

根據(jù)前端頁面表單的數(shù)據(jù)部默,我們創(chuàng)建了四個屬性。
里面的object_id 為主鍵造虎。
配置好之后傅蹂,我們配置生成數(shù)據(jù)表,Tools -> Run manage.py Task 打開運(yùn)行窗口:

makemigrations  message
之后運(yùn)行
migrate message

我們可以通過navicat查看生成的數(shù)據(jù)表:

Paste_Image.png

第九步:通過ORM對數(shù)據(jù)庫進(jìn)行增刪改查

首先我們在views.py中引用我們剛才創(chuàng)建的類

from .models import UserMessage

如何獲取數(shù)據(jù)庫中的數(shù)據(jù):
我們通過類UserMessage的數(shù)據(jù)表管理器objects獲取數(shù)據(jù)算凿。

獲取數(shù)據(jù)庫的所有數(shù)據(jù)份蝴,返回的是可以進(jìn)行循環(huán)的QuerySet類型    數(shù)據(jù)表管理器objects
all_message = UserMessage.objects.all()
for message in all_message:
    print(message.name)
這里的message其實就是UserMessage的實例
我們還可以根據(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ù)庫里面添加數(shù)據(jù):
我們通過實例化UserMessage對象,通過屬性賦值氓轰,通過save()方法往數(shù)據(jù)庫里賦值婚夫。

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)行項目署鸡,然后刷新頁面案糙,這時數(shù)據(jù)將會保存進(jìn)數(shù)據(jù)庫限嫌。

如何提取前端頁面表單中的數(shù)據(jù)保存到數(shù)據(jù)庫中:
我們使用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ù)庫
    user_message.save()

我們提交的數(shù)據(jù)都保存在POST中,通過get方法獲得匣椰。
代碼中g(shù)et('name','')這里的name是前端頁面表單里面name="name"的name裆熙。

想要完成數(shù)據(jù)的提交在前端頁面要有下面兩項配置:

<form action="/form/}" method="post" class="smart-green">

以及表單的提交允許

    #加了csrf_token之后才能夠往后臺提交數(shù)據(jù)
    {% csrf_token %}

完成上面的代碼配置之后,運(yùn)行調(diào)試禽笑,然后在表單中輸入數(shù)據(jù)然后提交,數(shù)據(jù)被保存到數(shù)據(jù)庫中蛤奥。

如何將數(shù)據(jù)庫中的數(shù)據(jù)顯式到前端頁面中:
通過render()方法佳镜,添加字典形式的參數(shù)。

    #將后臺數(shù)據(jù)庫里的數(shù)據(jù)提取到前端頁面
    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})

在前端頁面中凡桥,我們使用的是字典的鍵蟀伸。
在前端頁面的調(diào)用:

value="{{ my_message.name }}"

好了,至此為止缅刽,我們基本完成了一個簡單的表單提交(里面有很多坑)啊掏。還有url的命名等其它知識,歡迎包名學(xué)習(xí)《強(qiáng)力django+殺手級xadmin 打造上線標(biāo)準(zhǔn)的在線教育平臺》衰猛,超級好的一個課程迟蜜,建議支持購買學(xué)習(xí)。購買連接:<a>http://coding.imooc.com/class/78.html</a>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啡省,一起剝皮案震驚了整個濱河市娜睛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卦睹,老刑警劉巖畦戒,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異结序,居然都是意外死亡障斋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門徐鹤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垃环,“玉大人,你說我怎么就攤上這事凳干∏绻” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵救赐,是天一觀的道長涧团。 經(jīng)常有香客問我只磷,道長,這世上最難降的妖魔是什么泌绣? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任钮追,我火速辦了婚禮,結(jié)果婚禮上阿迈,老公的妹妹穿的比我還像新娘元媚。我一直安慰自己,他們只是感情好苗沧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布刊棕。 她就那樣靜靜地躺著,像睡著了一般待逞。 火紅的嫁衣襯著肌膚如雪甥角。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天识樱,我揣著相機(jī)與錄音嗤无,去河邊找鬼。 笑死怜庸,一個胖子當(dāng)著我的面吹牛当犯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播割疾,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼嚎卫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杈曲?” 一聲冷哼從身側(cè)響起驰凛,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎担扑,沒想到半個月后恰响,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涌献,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年胚宦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燕垃。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡枢劝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卜壕,到底是詐尸還是另有隱情您旁,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布轴捎,位于F島的核電站鹤盒,受9級特大地震影響蚕脏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侦锯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一驼鞭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尺碰,春花似錦挣棕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至两曼,卻和暖如春皂甘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悼凑。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留璧瞬,地道東北人户辫。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像嗤锉,于是被迫代替她去往敵國和親渔欢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容