html天天生鲜项目,day54-天天生鲜项目订单管理
1生成結(jié)算頁面的相關(guān)數(shù)據(jù)
生成提交頁面的商品種類及小計(jì),總價(jià)等信息
def place_order(request):
if request.method == 'GET':
獲取當(dāng)前登陸系統(tǒng)的用戶對象
user = request.user
carts = ShoppingCart.objects.filter(user=user, is_select=True).all()
計(jì)算小計(jì)和總價(jià)
total_price = 0
for cart in carts:
小計(jì)金額
price = cart.goods.shop_price * cart.nums
給cart添加一個(gè)小計(jì)的屬性并賦值
cart.goods_price = price
總金額
total_price += price
獲取當(dāng)前登陸系統(tǒng)的用戶的收貨地址信息
user_addrss = UserAddress.objects.filter(user=user).all()
return render(request, 'place_order.html', {'carts': carts,
'total_price': total_price, 'num': len(carts),
'user_address': user_addrss})
寄送地址
寄送到:{% for address in user_address %}
{{ address.address }}
({{ address.signer_name }} 收 )
{{ address.signer_mobile }}
{% endfor %}
所提交的商品詳情頁面
{% for cart in carts %}
- {{ forloop.counter }}
- {{ cart.goods.name }}
- 500g
- {{ cart.goods.shop_price }}元
- {{ cart.nums }}
- {{ cart.goods_price }}元
{% endfor %}
金額結(jié)算
總金額結(jié)算
共{{ num }}件商品,總金額{{ total_price }}元運(yùn)費(fèi):10元實(shí)付款:{{ total_price | add:'10' }}元ajax異步請求傳輸數(shù)據(jù)并進(jìn)行提示
多對多數(shù)據(jù)表,中間表中只有關(guān)聯(lián)的兩個(gè)表的外鍵,而將多對多的中間表自己定義成另一個(gè)表格,則除了添加兩個(gè)一對多,還可以自己添加其他的一些字段;
$('#order_btn').click(function() {
localStorage.setItem('order_finish', 2);
{#判斷是否選擇收貨地址#}
var address_radio = $('input[name="address_radio"]')
for(var i=0;i
if(address_radio[i].checked == true){
var ad_id = address_radio[i].value;
}
}
if(ad_id){
{#創(chuàng)建訂單#}
var csrf = $('input[name="csrfmiddlewaretoken"]').val()
$.ajax({
url:'/order/order/',
type:'POST',
data:{'ad_id':ad_id},
dataType:'json',
headers:{'X-CSRFToken':csrf},
success:function (data) {
$('.popup p').text('提交訂單成功')
$('.popup_con').fadeIn('fast', function() {
setTimeout(function(){
$('.popup_con').fadeOut('fast',function(){
window.location.href = '{% url 'goods:index' %}';
});
},3000)
});
},
error:function (data) {
}
})
}else {
{#沒有收貨地址,修改彈窗的信息“提交訂單失敗”#}
$('.popup p').text('提交訂單失敗(請選擇收貨地址)')
$('.popup_con').fadeIn('fast', function() {
setTimeout(function(){
$('.popup_con').fadeOut('fast',function(){
{#window.location.href = '{% url 'goods:index' %}';#}
});
},3000)
});
}
});
收貨地址選擇按鈕判斷
$('input[name="address_ridio"]')獲取input標(biāo)簽中name為address_ridio的標(biāo)簽
獲取按鈕中name屬性為address_ridio的一系列標(biāo)簽的選擇狀態(tài)
var address_radio = $('input[name="address_radio"]')
for(var i=0;i
if(address_radio[i].checked == true){
var ad_id = address_radio[i].value;
}
}
2提交訂單時(shí)后臺(tái)處理函數(shù)
def order(request):
if request.method == 'POST':
1.獲取收貨地址值
ad_id = request.POST.get('ad_id')
2.創(chuàng)建訂單
user_id = request.session.get('user_id')
獲取訂單編號(hào)
order_sn = get_order_sn()
shop_cart = ShoppingCart.objects.filter(user_id=user_id,
is_select=True)
計(jì)算訂單總金額
order_mount = 0
for cart in shop_cart:
order_mount += cart.goods.shop_price * cart.nums
收貨信息
user_address = UserAddress.objects.filter(pk=ad_id).first()
order = OrderInfo.objects.create(user_id=user_id, order_sn=order_sn,
order_mount=order_mount, address=user_address,
signer_name=user_address.signer_name,
signer_mobile=user_address.signer_mobile)
3.創(chuàng)建訂單詳情
for cart in shop_cart:
OrderGoods.objects.create(order=order, goods=cart.goods,
goods_nums=cart.nums)
4.刪除購物車中已結(jié)算的商品
刪除數(shù)據(jù)庫中的商品
shop_cart.delete()
session_goods = request.session.get('goods')
刪除session中已選擇(結(jié)算)的物品
for se_goods in session_goods[:]:
se_goods結(jié)果[goods_id, nums, is_select]
if se_goods[2]:
session_goods.remove(se_goods)
request.session['goods'] = session_goods
return JsonResponse({'code': 200, 'msg': '請求成功'})
分頁
{% if orders.has_previous %}
上一頁
{% endif %}
{% for i in orders.paginator.page_range %}
{{ i }}
{% endfor %}
{% if orders.has_next %}
下一頁
{% endif %}
分頁
def user_order(request):
if request.method == 'GET':
activate = 'order'
page = int(request.GET.get('page', 1))
獲取登陸系統(tǒng)用戶的id值
user_id = request.session.get('user_id')
查詢當(dāng)前用戶產(chǎn)生的訂單信息
orders = OrderInfo.objects.filter(user_id=user_id)
status = OrderInfo.ORDER_STATUS
分頁,ORDER_NUMBER為工程目錄中設(shè)置的每頁顯示的信息數(shù)量
pg = Paginator(orders, ORDER_NUMBER)
my_page = pg.page(page)
return render(request, 'user_center_order.html',
{'orders': my_page, 'status': status,'activate': activate}
3按鈕頁面選擇
在html頁面中嵌入{% include ‘xxx.html’ %}表示把其他頁面的內(nèi)容直接拿過來在本頁面用
{% include 'base_user.html' %}
‘xxx.html’中內(nèi)容
當(dāng)點(diǎn)擊選項(xiàng)時(shí),頁面會(huì)對應(yīng)出現(xiàn)activate中對應(yīng)傳過來的路由
{% if activate == 'info' %} class = "active" {% endif %}>· 個(gè)人信息
{% if activate == 'order' %} class = "active" {% endif %}>· 全部訂單
- · 收貨地址
視圖函數(shù)中引入activate
def user_info(request):
if request.method == 'GET':
activate = 'info'
return render(request, 'user_center_info.html', {'activate': activate})
4.文件部署
當(dāng)需要對頁面進(jìn)行分頁設(shè)置的時(shí)候,可以在settings中設(shè)置ORDER_NUMBER = 3,然后再,需要使用的位置導(dǎo)入這個(gè)變量。
當(dāng)部署文章的時(shí)候,端口號(hào)設(shè)置成80端口時(shí),訪問的時(shí)候可以不加端口號(hào)訪問。
當(dāng)需要直接輸入網(wǎng)址(不帶端口后的路由)就訪問某個(gè)指定的網(wǎng)頁時(shí),可以在工程目錄的urls文件中的urlpatterns中添加首頁路徑
from goods import views
path('', views.index),
上面表示從index所在的goods應(yīng)用中導(dǎo)入views,然后將訪問應(yīng)用設(shè)置成空,最后設(shè)置所訪問的主頁
4.1直接訪問index下中間件設(shè)置訪問攔截
由于index主頁不需要進(jìn)行訪問攔截,故需要重新設(shè)置中間件登陸校驗(yàn)
主要添加以下兩句
if path == '/':
return None
由于訪問地址都會(huì)自動(dòng)在最后加/,所以不加路由訪問的時(shí)候地址就是http://127.0.0.1:80/,當(dāng)獲取到路由的時(shí)候一般都是('/user/register/')這種格式,所以當(dāng)直接將/加入到免登陸訪問頁面的時(shí)候,所有頁面都會(huì)面登陸訪問;故要將其分開來單獨(dú)判斷。
也可以在免登陸訪問的路由列表中加入'^/$'使用正則的單詞開頭和單詞結(jié)尾來對其進(jìn)行限制。則不需要單獨(dú)對其進(jìn)行判斷
全部代碼如下:
class LoggingMiddleware(MiddlewareMixin):
def process_request(self, request):
攔截請求之前的函數(shù)
判斷是否處于登陸狀態(tài)
1.給request.user屬性賦值,賦值為當(dāng)前登陸系統(tǒng)的用戶
user_id = request.session.get('user_id')
if user_id:
拿到用戶對象
user = User.objects.filter(pk=user_id).first()
請求中的用戶屬性改為當(dāng)前登陸用戶對象
request.user = user
2 .登陸校驗(yàn),需區(qū)分哪些地址需要做登陸校驗(yàn),哪些地址不需要做登陸校驗(yàn)
path = request.path
if path == '/':
如果直接訪問不帶路由的地址(通常為主頁),則不用進(jìn)行強(qiáng)制登陸(也可在下面不用校驗(yàn)的集合中寫成
# '^/$‘,則此處不用寫這個(gè)if語句)。
return None
不需要做登陸校驗(yàn)的地址
not_need_check = ['/user/register/', '/user/login/', '/goods/index/',
'/goods/detail/.*/', '/cart/.*/']
for check_path in not_need_check:
if re.match(check_path, path):
當(dāng)前path路徑為不需要做登陸校驗(yàn)的路由,則直接訪問對應(yīng)頁面
return None
if not user_id:
path為需要做登陸校驗(yàn)的路由時(shí),判斷用戶是否登陸,沒有登陸則跳轉(zhuǎn)到登陸頁面
return HttpResponseRedirect(reverse('user:login'))
總結(jié)
以上是生活随笔為你收集整理的html天天生鲜项目,day54-天天生鲜项目订单管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 近世代数课后习题作业 1
- 下一篇: 联想Y9000X Opencore引导黑