Django實戰(18):提交訂單

前面的內容已經基本上涵蓋了Django開發的主要方面,我們從需求和界面設計出發,創建模型和修改模型,并通過scaffold作為開發的起點;在scaffold的基礎上重新定制模板,并且通過Model類和Form類對用戶輸入的數據進行校驗。我們也涉及到了單元測試。為了提高開發用戶界面的效率,更好地實現模板,我們還討論了對靜態資源(css,js,image等)的管理,并通過模板繼承的方式實現了整個站點的統一布局。作為web應用必不可少的部分,我們還演示了如何使用會話(session)。最后,我們還在這些基礎上增加了RESTful web service,將jquery集成到Django,并實現了ajax。

有了這些基礎,可以應付Django開發中的絕大多數問題。

?

下面我們繼續實現depot購物車的web應用。本節要實現提交訂單功能。現在買方已經可以挑選需要的產品放入購物車,但是還不能進行購買。我們希望實現這樣的功能:

買方點擊”結算“按鈕,然后輸入姓名、地址和email信息,就向賣方發出了一張訂單,該訂單包含上述買方信息和其選購的所有條目。首先還是實現Model類。我們要增加一個訂單類(Order),并修改原來的條目類(LineItem),增加到Order的外鍵(即LineItem到Order的many-to-one關聯)。如下:

?

[python] view plaincopy
  1. class Order(models.Model):
  2. name?=?models.CharField(max_length=50)
  3. address?=?models.TextField()
  4. email?=?models.EmailField()
  5. class LineItem(models.Model):
  6. product?=?models.ForeignKey(Product)
  7. order?=?models.ForeignKey(Order)
  8. unit_price?=?models.DecimalField(max_digits=8,decimal_places=2)
  9. quantity?=?models.IntegerField()

要注意,因為LineItem引用了Order,所以在定義模型類的順序上要將Order放在前面。

?

前面介紹過修改模型類之后應該如何處理,這里就不再重復了。

然后祭出scaffold,快速生成一系列”丑陋“的界面。該工具還不夠成熟,在生成之前,一定要備份depotapp/urls.py 、views.py 和 forms.py,之后手工合并,切記!

之后將產品目錄界面(depot/templates/depotapp/store.html)中的”結算“標簽的鏈接改為映射到生成的create_order視圖函數:

?

[html] view plaincopy
  1. <aclass="btn?success"href="{%?url?depotapp.views.create_order?%}">結算</a>

兩 個界面就鏈接起來了。但是自動生成的訂單界面并沒有將session中的條目保存到數據庫,也沒有清空購物車,并且提交訂單后沒有返回到產品目錄界面,所 以還要對其進行修改。主要的修改在create_order視圖函數中進行。為了方便對比,將生成的原始視圖函數列出如下:

?

?

[python] view plaincopy
  1. def create_order(request):
  2. form?=?OrderForm(request.POST?orNone)
  3. if form.is_valid():
  4. form.save()
  5. form?=?OrderForm()
  6. t?=?get_template('depotapp/create_order.html')
  7. c?=?RequestContext(request,locals())
  8. return HttpResponse(t.render(c))

關于事務處理

?

”保存訂單“和”保存訂單條目“應該形成一個事務。Django的事務處理可以通過middleware自動添加,也可以手工添加。手工添加的方式更加靈活,通過在view函數前增加修飾符(decorator)來實現,有三種修飾符可以選擇:

?

[plain] view plaincopy
  1. @transaction.autocommit?????在?save()?或?delete()?時自動提交事務。
  2. @transaction.commit_on_success???當整個view成功后提交事務,否則回滾(?TransactionMiddleware采用的就是這種機制)
  3. @transaction.commit_manually??需要手動調用commit或rollback。

?

我們暫時不想使用middleware的方式,所以用@transaction.commit_on_success來實現事務管理。這需要引用transaction模塊:from django.db import transaction

最終修改的create_order視圖函數如下:

?

[python] view plaincopy
  1. @transaction.commit_on_success
  2. def create_order(request):
  3. form?=?OrderForm(request.POST?orNone)
  4. if form.is_valid():
  5. order?=?form.save()
  6. for item in request.session['cart'].items:
  7. item.order?=?order
  8. item.save()
  9. clean_cart(request)
  10. return store_view(request)
  11. t?=?get_template('depotapp/create_order.html')
  12. c?=?RequestContext(request,locals())
  13. return HttpResponse(t.render(c))

?

轉載于:https://www.cnblogs.com/holbrook/archive/2012/02/19/2358710.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377731.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377731.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377731.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

No module named ‘tensorflow.examples‘解決方案

想從tensorflow中導入mnist手寫數字數據集&#xff0c;結果報錯 from tensorflow.examples.tutorials.mnist import input_data import tensorflow.compat.v1 as tf tf.disable_v2_behavior()my_mnist input_data.read_data_sets("MNIST_data_bak/", one_hotTrue)&…

julia example_使用Julia中的Example的sign()函數

julia exampleJulia| sign()函數 (Julia | sign() function) sign() function is a library function in Julia programming language, it returns the sign of the given value in the form of -1/1. sign()函數是Julia編程語言中的庫函數&#xff0c;它以-1 / 1的形式返回給…

.NET通用基本權限系統

DEMO下載地址&#xff1a; http://download.csdn.net/detail/shecixiong/5372895 一、開發技術&#xff1a;B/S(.NET C# ) 1、Windows XP以上 (支援最新Win 8) 2、Microsoft Visual Studio 2010/2012 C#.NET 3、.NET Framework 4.0以上 (支援最新4.5版本) 4、SQL Server 2005以…

leetcode 37. 解數獨 思考分析

目錄題目核心思路的不斷細化1、核心框架2、考慮到每個位置的工作3、考慮到到達最后一列、該位置的數已經預置的情況4、判斷是否符合規則的函數5、確定遞歸終止條件確定函數返回值AC代碼題目 編寫一個程序&#xff0c;通過填充空格來解決數獨問題。 一個數獨的解法需遵循如下規…

快速完成兼職外包開發任務

做了很多年的開發相關的工作&#xff0c;做過兼職開發&#xff0c;也做過外包一些開發項目。 兼職人員角色時 正是經歷這些事情時&#xff0c;每次就要提前很費經的跟公司溝通&#xff0c;讓他們把公司內部的svn開發出去&#xff0c;但是就是很難&#xff0c;會涉及到安全各方的…

使用YOLOv5訓練NEU-DET數據集

一、下載YOLOv5源碼和NEU-DET(鋼材表面缺陷)數據集 YOLOv5源碼 NEU-DET(鋼材表面缺陷)數據集 這里的數據集已經經過處理了&#xff0c;下載即可 若通過其他途徑下載的原始數據集標簽為xml格式&#xff0c;需要轉化為txt格式XML轉txt格式腳本 二、數據集準備 NEU-DET(鋼材表…

kotlin獲取屬性_Kotlin程序獲取系統MAC地址

kotlin獲取屬性The task is to get system MAC address. 任務是獲取系統MAC地址。 package com.includehelpimport java.net.InetAddressimport java.net.NetworkInterface//Function to get System MACfun getSystemMac(): String? {return try {val OSName System.getProp…

帶分頁功能的SSH整合,DAO層經典封裝

任何一個封裝講究的是&#xff0c;使用&#xff0c;多狀態。Action&#xff1a;任何一個Action繼承分頁有關參數類PageManage&#xff0c;自然考慮的到分頁效果&#xff0c;我們必須定義下幾個分頁的參數。并根據這個參數進行查值。然后在繼承ServiceManage&#xff0c;Service…

在windows phone Mango中使用原生代碼開發程序

本文不討論創建可執行的exe程序,主要想說明怎么在silverlight程序里面調用由原生代碼所編寫的DLL(C / ARM). 原生代碼可以調用更多的API,但是這并不是說你就能隨意獲得那些你沒有權限的資源,比如,你可以使用CopyFile這個API,但是如果你試圖把文件Copy到\Windows文件夾,就會得到…

leetcode 198. 打家劫舍 思考分析

目錄1、題目2、求解思路3、代碼1、題目 你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚上被小偷闖入&#xff0c;系統會自動…

找不到Windows照片查看器解決方法

桌面創建一個txt文本 復制這些命令&#xff0c;之后將后綴改為.reg&#xff0c;右擊管理員身份運行即可 Windows Registry Editor Version 5.00 ; Change Extensions File Type [HKEY_CURRENT_USER\Software\Classes\.jpg] "PhotoViewer.FileAssoc.Tiff" ; Change E…

數字拆分為斐波那契數列_檢查數字是否為斐波那契

數字拆分為斐波那契數列Description: 描述&#xff1a; We are often used to generate Fibonacci numbers. But in this article, we are going to learn about how to search Fibonacci numbers in an array? 我們經常被用來產生斐波那契數。 但是在本文中&#xff0c;我們…

伙伴分配器的一個極簡實現

提起buddy system相信很多人不會陌生&#xff0c;它是一種經典的內存分配算法&#xff0c;大名鼎鼎的Linux底層的內存管理用的就是它。這里不探討內核這么復雜實現&#xff0c;而僅僅是將該算法抽象提取出來&#xff0c;同時給出一份及其簡潔的源碼實現&#xff0c;以便定制擴展…

[USACO3.2.3 Spinning Wheels]

[關鍵字]&#xff1a;模擬 枚舉 [題目大意]&#xff1a;有5個輪子&#xff0c;每個輪子優r個缺口并且會按一定速度不停轉動&#xff0c;問什么時候可以使一條光線射過所有輪子。 // [分析]&#xff1a;從0到1000&#xff08;或其他的&#xff09;枚舉分鐘然后判斷&#xff0c;當…

一、SQLServer2008安裝(帶密碼)、創建數據庫、C#窗體項目測試

一、下載和安裝SQLServer2008 東西太大了&#xff0c;沒法上傳到資源里面&#xff0c;官網其他公眾號都下載可以。 右擊管理員身份 運行setup.exe 這個密鑰不能用的話&#xff0c;也可以去百度其他密鑰 JD8Y6-HQG69-P9H84-XDTPG-34MBB 建議改一下路徑&#xff0c;我這邊修…

python獲取當前日期_Python程序獲取當前日期

python獲取當前日期In the below example – we are implementing a python program to get the current date. 在下面的示例中-我們正在實現一個python程序來獲取當前日期 。 Steps: 腳步&#xff1a; Import the date class from datetime module. 從datetime模塊導入日期類…

【C++grammar】多態、聯編、虛函數

目錄1、多態概念1.多態性有兩種表現的方式2、聯編&#xff08;實現多態&#xff09;1.靜態聯編2.動態聯編3、實現運行時多態1.為何要使用運行時多態&#xff1f;2.如何實現運行時多態3.多態的例子1.調用哪個同名虛函數&#xff1f;2. 用途&#xff1a;可以用父類指針訪問子類對…

一 MVC - HtmlHelper

HtmlHelper類位于System.Web.Mvc.Html之中主要有七個靜態類組成&#xff1a; FormExtensions - BeginForm, BeginRouteForm, EndForm InputExtensions - CheckBox, CheckBoxFor, Hidden, HiddenFor, Password, PasswordFor, RadioButton, RadioButtonFor, TextBox, TextBoxFor …

HDOJ 400題紀念。

剛剛交了1506&#xff0c;無意間瞟到左邊的隨筆數&#xff0c;發現已經401題了&#xff0c;這么說前幾天就400題了啊囧。 昨天還想交到400題就先放放&#xff0c;背單詞的&#xff0c;沒想到那么快。等把USACO那個八皇后寫完吧。人生總是有許多不想做又不得不做的事情。。。 還…

二、用戶登錄和注冊

一、頁面設計 一共四個頁面 主頁面Form1&#xff0c;登錄頁面login&#xff0c;注冊頁面resister&#xff0c;主菜單頁面main_page 系統運行進入Form1&#xff0c;單擊登錄按鈕跳轉到login&#xff0c;數據庫中得存在數據信息且輸入正確才可登錄成功&#xff0c;跳轉到main_pa…