亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Django Model View Template 之間的簡(jiǎn)單交互 (二)

Coding01 / 1117人閱讀

摘要:當(dāng)然還有其他高級(jí)的使用,日后再說完整的用戶名郵箱聯(lián)系地址留言信息用戶留言信息使用之前已經(jīng)定義好了數(shù)據(jù)模型的字段元數(shù)據(jù)方法等。

前言

接續(xù)前文,上一篇文章主要涉及了 Django 項(xiàng)目的基礎(chǔ)配置等,這篇主要涉及數(shù)據(jù)庫(kù)相關(guān)的 ORM ,也就是 Django 中的 Model 的使用,MVT 三層之間的交互

教程基本都是東拼西湊的,防止有些東西表述不準(zhǔn)確,因?yàn)槲抑皩?JavaScript 比較多。但是里邊注入了自己的理解,盡量講清楚。

基礎(chǔ)環(huán)境

Pycharm 2018

Django 2.0.3

Python 3.6.4

mxonline start 分支

Django Model 配置

代替使用原生的 SQL 語(yǔ)句操作數(shù)據(jù)庫(kù)。

原生 SQL 語(yǔ)句操作數(shù)據(jù)庫(kù)
# {BASE_DIR}/apps/message/models.py
import MySQLdb
def book_list(request):
    db = MySQLdb.connect(user="me", db="mydb", password="secret", host="localhost")
    cursor = db.cursor()
    cursor.execute("SELECT name FORM books ORDER BY name")
    names = [row[0] for row in cursor.fetchall()]
    db.close()
配置 Django Model

具體的一些細(xì)節(jié)知識(shí)下面會(huì)進(jìn)行敘述。這里只是展示一下如何配置。

# {BASE_DIR}/apps/message/models.py

# 從 Django 中引入 models
from django.db import models


# Create your models here.
class UserMessage(models.Model):
    name = models.CharField(max_length=20, 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

model 創(chuàng)建完成,接下來是生成數(shù)據(jù)表。

生成數(shù)據(jù)表
$ python manage.py makemigrations message
$ python manage.py migrate message

然后查看數(shù)據(jù)庫(kù)是不是生成了表。

之前有十個(gè)表,分別是:

+----------------------------+
| Tables_in_test_django      |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
10 rows in set (0.00 sec)

現(xiàn)在:

+----------------------------+
| Tables_in_test_django      |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| message_usermessage        |
+----------------------------+
11 rows in set (0.00 sec)
mysql> desc message_usermessage;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| name    | varchar(20)  | NO   |     | NULL    |                |
| email   | varchar(254) | NO   |     | NULL    |                |
| address | varchar(100) | NO   |     | NULL    |                |
| message | varchar(500) | NO   |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.04 sec)

對(duì)應(yīng)上面 Model 中的字段,完美~

注意事項(xiàng)

ChartField 必須指定 max_length。

ORM 功能介紹

稍候會(huì)有完整的 Model 例子。

字段 Field

每一個(gè)模型都可以包含有任意數(shù)量的字段,每個(gè)字段都會(huì)對(duì)應(yīng)數(shù)據(jù)表中的一個(gè)字段,我們需要指定字段的屬性。

name = models.CharField(max_length=20, verbose_name=u"用戶名")

上述字段的名稱是 name,類型是 models.CharField。對(duì)應(yīng)到 MySQL 數(shù)據(jù)中是 varchar 類型。varchar 類型的字段都是需要去指定一個(gè)長(zhǎng)度值,對(duì)應(yīng)到 Django 的 ORM 模型上就是 max_length 屬性。

字段參數(shù)

下面列舉一下目前筆者在開發(fā)中用到的一些字段:

max_length:指定字段的長(zhǎng)度值,接受一個(gè)數(shù)字,CharField 必須指定最大長(zhǎng)度, TextField 不需要。

verbose_name:字段標(biāo)簽的可讀名稱,接受一個(gè)字符串。如果不指定,Django 會(huì)從字段名稱去推斷默認(rèn)的詳細(xì)名稱,建議每一個(gè)字段都進(jìn)行指定。

default:字段默認(rèn)值。

null:是否可以為 null,接受 True 或者 False

blank: 是否可以為空,同樣接受 True 或者 False

primary_key:如果設(shè)置為 Ture,則該字段置為模型主鍵,如果模型中沒有指定主鍵,則 Django 會(huì)自動(dòng)為模型添加一個(gè)主鍵,默認(rèn)為 id。

help_text:為 HTML 表單文本提供單文本標(biāo)簽。

choices:一組字段選項(xiàng),提供這一項(xiàng)的時(shí)候,默認(rèn)對(duì)應(yīng)的表單不見是選擇字段的盒子,而不是標(biāo)準(zhǔn)文本字段。

字段類型

CharField:用來定義短到中等長(zhǎng)度的字段字符串,必須指定 max_length 屬性。

TextField:用于大型的任意長(zhǎng)度字符串,不強(qiáng)制要求指定 max_length 屬性,指定的 max_length 僅僅當(dāng)該字段以表單顯示才會(huì)使用,不會(huì)再數(shù)據(jù)庫(kù)級(jí)別進(jìn)行強(qiáng)制執(zhí)行。

IntegerField:用于存儲(chǔ)整形數(shù)據(jù),在用于表單中驗(yàn)證輸入的值需要時(shí)整數(shù)。

FloatField:用于存儲(chǔ)浮點(diǎn)型數(shù)據(jù)

DateField 和 DateTimeField:用于存儲(chǔ)/表示日期和日期/時(shí)間信息(分別是Python.datetime.date和datetime.datetime對(duì)象。這些字段可以另外表明(互斥)參數(shù)auto_now=Ture (在每次保存模型時(shí)將該字段設(shè)置為當(dāng)前日期),auto_now_add(僅設(shè)置模型首次創(chuàng)建時(shí)的日期)和default(設(shè)置默認(rèn)日期,可以被用戶覆蓋)。一般筆者選擇的默認(rèn)日期是 datetime.now。

EmailField:用來存儲(chǔ)和驗(yàn)證電子郵件地址。

FileField:用于上傳文件,需要提供 upload_to 指定上傳到的地方。

ImageField:和上傳文件表現(xiàn)基本相似,會(huì)額外進(jìn)行是否為圖像的驗(yàn)證。

AutoField:是一種 IntegerField 自增的特殊類型,如果模型沒有指定主鍵的話,此類型的主鍵將自動(dòng)添加到模型中。

ForeignKey:外鍵,用于指定與另一個(gè)數(shù)據(jù)庫(kù)模型的一對(duì)多關(guān)系。關(guān)系 “一” 側(cè)是包含密鑰的模型。和 flask 指定外鍵的方式不同。

ManyToManyField:用于指定多對(duì)多關(guān)系,例如,一本書可以有幾種類型,每種類型可以包含幾本書)。在我們的圖書館應(yīng)用程序中,我們將非常類似地使用它們ForeignKeys,但是可以用更復(fù)雜的方式來描述組之間的關(guān)系。這些具有參數(shù)on_delete來定義關(guān)聯(lián)記錄被刪除時(shí)會(huì)發(fā)生什么(例如,值models.SET_NULL將簡(jiǎn)單地設(shè)置為值NULL)。筆者用的不是很多。

元數(shù)據(jù)

通過聲明 class Meta 來聲明模型級(jí)別的元數(shù)據(jù)

class UserMessage(models.Model):
    # Config Field
        
    class Meta:
        ordering = ["id"]
       verbose_name = u"用戶留言信息"
       verbose_name_plural = verbose_name

這里最有用的功能是可以指定模型返回?cái)?shù)據(jù)時(shí)候的默認(rèn)的順序,更多的文檔可以查看這里

方法

一個(gè)模型也可以有方法,最基本的使用就是定義一個(gè)標(biāo)準(zhǔn)的 Python 類方法: __str__

class UserMessage(models.Model):
    # Config Field
    
    # Config Meta
    
    def __str__(self):
       return self.message    

這樣為每個(gè)對(duì)象返回一個(gè)人類可讀的字符串。當(dāng)然還有其他高級(jí)的使用,日后再說

完整的 model
# {BASE_DIR/apps/message/models.py}

from django.db import models


# Create your models here.
class UserMessage(models.Model):
    name = models.CharField(max_length=20, 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:
        ordering = ["id"]
        verbose_name = u"用戶留言信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.message
使用 Django ORM

之前已經(jīng)定義好了數(shù)據(jù)模型的字段(Field)、元數(shù)據(jù)(Meta)、方法(Method)等。現(xiàn)在要做的是把頁(yè)面上提交過來的數(shù)據(jù)通過 ORM 來存放到數(shù)據(jù)庫(kù)中,通過 ORM 來進(jìn)行數(shù)據(jù)的 CURD 操作。

創(chuàng)建數(shù)據(jù)

templates 中已經(jīng)創(chuàng)建了 message_form.html 模板文件,現(xiàn)在進(jìn)行修改,修改 formaction 目標(biāo)地址:

這里根據(jù)自己配置的 Url 來自行決定,由于筆者配置的是 /,所以這里就配置成這個(gè)樣子。

這里指定的是使用 form 的原生事件 post 事件進(jìn)行提交,但是在實(shí)際的開發(fā)中,為了實(shí)現(xiàn)更精確的控制,我們常常不會(huì)使用原生事件,而更傾向于使用 ajax 進(jìn)行提交,當(dāng)然這里的重點(diǎn)不是前端的邏輯,重點(diǎn)在于 Django 后端邏輯的處理,顧不贅述。

接下來的任務(wù)就是:拿到 POST 發(fā)來的數(shù)據(jù),然后存入數(shù)據(jù)庫(kù)中。

存儲(chǔ)數(shù)據(jù)

之前使用 Django 的 ORM 進(jìn)行了數(shù)據(jù)庫(kù)中數(shù)據(jù)表的配置,現(xiàn)在使用 Django 的 ORM 將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中。

在 Django 中,我們使用不是傳統(tǒng)的 MVC 架構(gòu),我們使用的是一種叫 MVT 的方式。不同的 Template(模板) 呈現(xiàn)不同的 View。我們將在 View(請(qǐng)求視層)中獲取用戶提交的數(shù)據(jù),以及將從 Model(數(shù)據(jù)層) 中獲得的數(shù)據(jù)傳遞給 Template(模板層)。

MVT 的概念本身就來自于 Django 框架,下面進(jìn)行代碼的展示:

# {BASE_DIR/apps/message/views.py}
from django.shortcuts import render  # 引入 render 方法
from .models import UserMessage      # 引入之前配置好的 Model


# Create your views here.

def get_form(request):
    if request.method == "POST":
        name = request.POST.get("name", "")
        message = request.POST.get("name", "")
        address = request.POST.get("address", "")
        email = request.POST.get("email", "")
        user_message = UserMessage()
        user_message.name = name
        user_message.message = message
        user_message.address = address
        user_message.email = email
        user_message.save()
    return render(request, "message_form.html")

通過 POST 方法提交的數(shù)據(jù)會(huì)存儲(chǔ)到 request 對(duì)象的 POST 屬性下邊,通過 Django 提供的 get 方法就可以取到對(duì)應(yīng)的字段。其中 get 接收兩個(gè)參數(shù),分別是字段的名稱默認(rèn)值。

在取到 Template 提交過來的每一個(gè)字段之后,就可以使用 ORM 提供的方法將其存入數(shù)據(jù)庫(kù)中。

實(shí)例化引入的 Model,然后將之前定義的字段進(jìn)行賦值,然后就可以調(diào)用實(shí)例的 save() 方法將數(shù)據(jù)存入數(shù)據(jù)庫(kù)。

然后就可以通過 Navicat 或者終端等方式查看數(shù)據(jù)是否保存到了數(shù)據(jù)庫(kù)中。

讀取數(shù)據(jù)

之前已經(jīng)實(shí)現(xiàn)了數(shù)據(jù)的存儲(chǔ),這部分將實(shí)現(xiàn)數(shù)據(jù)的讀取功能。

# {BASE_DIR/apps/message/views.py}
from django.shortcuts import render
from .models import UserMessage


# Create your views here.

def get_form(request):
    message = None
    all_message = UserMessage.objects.filter(name="test")
    if all_message:
        message = all_message[0]
    return render(request, "message_form.html", {"my_message": message})

這里會(huì)涉及到 Django 的 QuerySets(查詢集)相關(guān)知識(shí),這里撿著用的著的部分看一下。

首先先聲明 message,值為 None,用于存儲(chǔ)取到的數(shù)據(jù)。

從本質(zhì)上講,QuerySets 是給定對(duì)象模型(這里是 UserModel)的對(duì)象列表(list),允許我們從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),選擇以及排序。通過這種方式操作的話,就可以避免直接操作數(shù)據(jù)庫(kù)。從而抹平不同數(shù)據(jù)庫(kù)操作的差異,這部分由 Django 幫我們來完成。

上面的代碼中有這樣的一句:

UserMessage.objects.filter(name="test")

作用是從數(shù)據(jù)庫(kù)中查找 name 值為 test 的所有條目,返回的是一個(gè) 列表,并賦值給 all_message。同時(shí)我們也可以發(fā)現(xiàn),QuerySet 可以鏈?zhǔn)秸{(diào)用。類似于 JavaScript 中的 Promise。

然后如果 all_message 不為空的話,取出列表第一項(xiàng),然后傳遞給 my_message 模板。

關(guān)于 QuerySet 的詳細(xì)知識(shí),可以查看 Django 的官方文檔的這一部分

渲染到模板

在上面步驟中,我們將符合預(yù)設(shè)條件的數(shù)據(jù)從數(shù)據(jù)庫(kù)中取出來,傳遞到模板中,這里的目標(biāo)是將數(shù)據(jù)正確的顯示與渲染。部分語(yǔ)法類似于 ejs 模板的語(yǔ)法,但同時(shí) Django 又在模板中內(nèi)置了很多常用的函數(shù)。但是 Django 不像 Java 那樣,允許在模板中寫一些 Java 代碼,Django 的 Template 中不允許將 Python 代碼混進(jìn)來。

由于模板代碼過長(zhǎng),這里只放一些關(guān)鍵部分的代碼,完整的代碼可以查看文章對(duì)應(yīng)的代碼倉(cāng)庫(kù)。


    
    
    {% csrf_token %}

在上一篇文章中,提到過,path 接收 name 參數(shù)。在 template 中可以通過 name 來取到對(duì)應(yīng)的 url,方法如下:

action="{% url "go_form" %}"

這樣做提供了另一種獲取 url 的方式,當(dāng)我們因?yàn)槟撤N原因去修改了 url 地址之后,通過 name 還能找到它。

textarea 中,有這樣一段代碼:

{{ my_message.message }}

作用是取到傳入的 my_message 對(duì)象的 message 屬性取出來并顯示,由于 html 基本屬于前端部分了,所以用前端的方式進(jìn)行描述。

雙花括號(hào)(八字胡)語(yǔ)法: {{...}} 在任何模板語(yǔ)言中都很常見,作用是將數(shù)據(jù)渲染到雙括號(hào)內(nèi)部。

上面還有一部分代碼是這樣子的:

{% if my_message.name == "test" %}test{% endif %}"

意思很好懂的,是吧。

具體的 Django 中模板的語(yǔ)法可以查看官方文檔。

后記

這里只是簡(jiǎn)單的介紹了一下 Django 中 Model 層、View 層、以及 Template 層之間交互的部分知識(shí),很簡(jiǎn)略,不詳細(xì)。在每部分的后邊都附加了詳細(xì)的官方文檔地址。如果以后有時(shí)間了可以對(duì)每部分進(jìn)行詳細(xì)的闡述。

參考資料

Python升級(jí)3.6 強(qiáng)力Django+殺手級(jí)Xadmin打造在線教育平臺(tái)

MDN 的 Django教程 ———— 設(shè)計(jì)LocalLibrary模型

Django 官方文檔 Model 部分

Django Girls 教程

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41442.html

相關(guān)文章

  • Django學(xué)習(xí)——Django基礎(chǔ)1

    摘要:將業(yè)務(wù)邏輯,數(shù)據(jù)和界面顯示分開,功能劃分清晰,有利于降低軟件的耦合度和團(tuán)隊(duì)開發(fā)。主要的作用就是將一個(gè)請(qǐng)求分發(fā)到不同的處理,再調(diào)用相應(yīng)的和關(guān)于的安裝及使用將在下一章共同學(xué)習(xí)。 Django 簡(jiǎn)單介紹django和mvc,mvt設(shè)計(jì)模式,如果已知悉可以直接跳過。 什么是Django 是由python寫的一個(gè)開源的web應(yīng)用程序框架,于2005年7月初次發(fā)布,并在2008年9月發(fā)布了第一個(gè)正...

    trilever 評(píng)論0 收藏0
  • 個(gè)人博客三|首頁(yè)后臺(tái)開發(fā)

    摘要:聲明本渣渣部分代碼參考自其實(shí)有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都有一個(gè)開源的精神,碼出來的代碼本身是希望更多的人用到,應(yīng)用到生產(chǎn)中。 聲明:本渣渣部分代碼參考自TendCode其實(shí)有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都...

    zorpan 評(píng)論0 收藏0
  • 個(gè)人博客三|首頁(yè)后臺(tái)開發(fā)

    摘要:聲明本渣渣部分代碼參考自其實(shí)有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都有一個(gè)開源的精神,碼出來的代碼本身是希望更多的人用到,應(yīng)用到生產(chǎn)中。 聲明:本渣渣部分代碼參考自TendCode其實(shí)有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都...

    姘擱『 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<