1. 程式人生 > >記錄一次完整的基於django的例項

記錄一次完整的基於django的例項

例項內容:
一個簡單的將前端頁面資料提交到資料庫,從資料庫取出資料展示到前端頁面。

環境:
win10 + pycharm + python3.5 + django1.10

專案配置流程:
安裝pymysql→Settings配置→(databases,templates下的dirs,新建statixfiles_dirs)→migration生成資料表→編寫views.py→配置urls.py→(1.HTNL個css檔案分離,2.css檔案分離與地址修改)

第一步:建立專案djangostart

Paste_Image.png

第二步:建立app-> message

首先按照圖所示,調出執行視窗

Paste_Image.png

然後在視窗中輸入:startapp message
這時會生成對應的app,並將app新增到setting配置檔案。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'message',
]

第三步:建立static目錄,用於存放靜態檔案(CSS,JS等檔案)

Paste_Image.png

至此我們已經建立好專案的基本目錄。

第四步:將前端頁面配置到模板,將CSS檔案配置到static目錄

目錄結構為

前端頁面程式碼邏輯為;

<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="/static/css/style.css">
</head>

第五步:配置setting檔案中的靜態檔案和模板檔案路徑

當配置好第四步之後,我們如果執行程式不會加載出頁面,因為我們需要配置檔案路徑。
對於靜態檔案:

STATIC_URL = '/static/'
#僅有上面的設定,只說明瞭樣式放在static檔案,需要指定和專案根目錄的關係

#設定靜態檔案的目錄,設定為列表形式
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]

對於模板檔案:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        #根據根目錄設定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為當前目錄的絕對路徑

import os

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

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

第六步:配置django連線mysql資料庫

因為我們的專案是需要連線資料庫的,因此我們需要配置連線資料庫。
python3連線MySQL不再使用MySQLdb,現在大部分都是使用PyMySQL用於連線MySQL資料庫。
首先安裝PyMySQL用於替代MySQLdb。
然後在工程目錄的init.py中填寫下面兩句話

import pymysql
pymysql.install_as_MySQLdb()

接著配置setting檔案,連線資料庫

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', #主要是這裡,將預設的sqlite3改為mysql
        'NAME': "testdjango", #資料庫的名字
        'USER': "root",#資料庫使用者名稱
        'PASSWORD': "root",#資料庫密碼
        'HOST': "127.0.0.1",資料庫地址,預設本機
        'PORT': "",資料庫埠,預設3306
    }
}

配置好資料庫之後,可以根據django來生成預設的資料表。
同樣是在Tools -> Run manage.py Task 開啟執行視窗
我們執行makemigrations(檢查要修改的資料庫欄位),migrate(生成資料表)
當執行完上述兩個命令之後,就會在資料庫中建立一些預設的基本資料表。

第七步:配置urls.py和views.py

在views.py中配置函式

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')
]

配置好以上兩個檔案,我們就可以除錯程式了,Run -> Debug
然後在瀏覽器中輸入:<a>http://127.0.0.1:8000/form/</a>

Paste_Image.png

第八步:django model層的配置

我們使用django的ORM機制,使類和資料庫裡的表相對應。
我們在models.py中進行以下配置:

# 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"聯絡地址")
    message = models.CharField(max_length=500,verbose_name=u"留言資訊")

    class Meta:
        verbose_name = u"使用者留言資訊"
        verbose_name_plural = verbose_name
        #指定資料庫的表名
        #db_table = "user_message"
        #排序
        #ordering = "-object_id"

根據前端頁面表單的資料,我們建立了四個屬性。
裡面的object_id 為主鍵。
配置好之後,我們配置生成資料表,Tools -> Run manage.py Task 開啟執行視窗:

makemigrations  message
之後執行
migrate message

我們可以通過navicat檢視生成的資料表:

Paste_Image.png

第九步:通過ORM對資料庫進行增刪改查

首先我們在views.py中引用我們剛才建立的類

from .models import UserMessage

如何獲取資料庫中的資料:
我們通過類UserMessage的資料表管理器objects獲取資料。

獲取資料庫的所有資料,返回的是可以進行迴圈的QuerySet型別    資料表管理器objects
all_message = UserMessage.objects.all()
for message in all_message:
    print(message.name)
這裡的message其實就是UserMessage的例項
我們還可以根據條件取出資料
all_message = UserMessage.objects.filter(name=u"王二小",address=u"杭州")

如何刪除資料:
我們可以使用delete()函式刪除所取的值

all_message = UserMessage.objects.all()
#刪除所有
#all_message.delete()
for message in all_message:
    #刪除單一值
    #message.delete()

如何往資料庫裡面新增資料:
我們通過例項化UserMessage物件,通過屬性賦值,通過save()方法往資料庫裡賦值。

user_message = UserMessage()
user_message.name = u"王小二"
user_message.message = u"放羊娃"
user_message.address = u"杭州"
user_message.object_id = "2"
user_message.email = "[email protected]"
user_message.save()

完成上面的程式碼之後,我們執行專案,然後重新整理頁面,這時資料將會儲存進資料庫。

如何提取前端頁面表單中的資料儲存到資料庫中:
我們使用POST將表單資料提交。

#首先判斷request的方式
if request.method == "POST":
    #通過request的get()函式,獲得提交的值
    name = request.POST.get('name','')#當屬性值不存在,則賦空值
    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" #這裡的主鍵我們隨便設定
    user_message.email = email

    #將值儲存到資料庫
    user_message.save()

我們提交的資料都儲存在POST中,通過get方法獲得。
程式碼中get('name','')這裡的name是前端頁面表單裡面name="name"的name。

想要完成資料的提交在前端頁面要有下面兩項配置:

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

以及表單的提交允許

    #加了csrf_token之後才能夠往後臺提交資料
    {% csrf_token %}

完成上面的程式碼配置之後,執行除錯,然後在表單中輸入資料然後提交,資料被儲存到資料庫中。

如何將資料庫中的資料顯式到前端頁面中:
通過render()方法,新增字典形式的引數。

    #將後臺資料庫裡的資料提取到前端頁面
    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})

在前端頁面中,我們使用的是字典的鍵。
在前端頁面的呼叫:

value="{{ my_message.name }}"

好了,至此為止,我們基本完成了一個簡單的表單提交(裡面有很多坑)。還有url的命名等其它知識



作者:海賊之路飛
連結:https://www.jianshu.com/p/335121af76d3
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。