html天天生鲜项目,day54-天天生鲜项目订单管理
1生成結算頁面的相關數據
生成提交頁面的商品種類及小計,總價等信息
def place_order(request):
if request.method == 'GET':
獲取當前登陸系統的用戶對象
user = request.user
carts = ShoppingCart.objects.filter(user=user, is_select=True).all()
計算小計和總價
total_price = 0
for cart in carts:
小計金額
price = cart.goods.shop_price * cart.nums
給cart添加一個小計的屬性并賦值
cart.goods_price = price
總金額
total_price += price
獲取當前登陸系統的用戶的收貨地址信息
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 %}
金額結算
總金額結算
共{{ num }}件商品,總金額{{ total_price }}元運費:10元實付款:{{ total_price | add:'10' }}元ajax異步請求傳輸數據并進行提示
多對多數據表,中間表中只有關聯的兩個表的外鍵,而將多對多的中間表自己定義成另一個表格,則除了添加兩個一對多,還可以自己添加其他的一些字段;
$('#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){
{#創建訂單#}
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標簽中name為address_ridio的標簽
獲取按鈕中name屬性為address_ridio的一系列標簽的選擇狀態
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提交訂單時后臺處理函數
def order(request):
if request.method == 'POST':
1.獲取收貨地址值
ad_id = request.POST.get('ad_id')
2.創建訂單
user_id = request.session.get('user_id')
獲取訂單編號
order_sn = get_order_sn()
shop_cart = ShoppingCart.objects.filter(user_id=user_id,
is_select=True)
計算訂單總金額
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.創建訂單詳情
for cart in shop_cart:
OrderGoods.objects.create(order=order, goods=cart.goods,
goods_nums=cart.nums)
4.刪除購物車中已結算的商品
刪除數據庫中的商品
shop_cart.delete()
session_goods = request.session.get('goods')
刪除session中已選擇(結算)的物品
for se_goods in session_goods[:]:
se_goods結果[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))
獲取登陸系統用戶的id值
user_id = request.session.get('user_id')
查詢當前用戶產生的訂單信息
orders = OrderInfo.objects.filter(user_id=user_id)
status = OrderInfo.ORDER_STATUS
分頁,ORDER_NUMBER為工程目錄中設置的每頁顯示的信息數量
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’ %}表示把其他頁面的內容直接拿過來在本頁面用
{% include 'base_user.html' %}
‘xxx.html’中內容
當點擊選項時,頁面會對應出現activate中對應傳過來的路由
{% if activate == 'info' %} class = "active" {% endif %}>· 個人信息
{% if activate == 'order' %} class = "active" {% endif %}>· 全部訂單
- · 收貨地址
視圖函數中引入activate
def user_info(request):
if request.method == 'GET':
activate = 'info'
return render(request, 'user_center_info.html', {'activate': activate})
4.文件部署
當需要對頁面進行分頁設置的時候,可以在settings中設置ORDER_NUMBER = 3,然后再,需要使用的位置導入這個變量。
當部署文章的時候,端口號設置成80端口時,訪問的時候可以不加端口號訪問。
當需要直接輸入網址(不帶端口后的路由)就訪問某個指定的網頁時,可以在工程目錄的urls文件中的urlpatterns中添加首頁路徑
from goods import views
path('', views.index),
上面表示從index所在的goods應用中導入views,然后將訪問應用設置成空,最后設置所訪問的主頁
4.1直接訪問index下中間件設置訪問攔截
由于index主頁不需要進行訪問攔截,故需要重新設置中間件登陸校驗
主要添加以下兩句
if path == '/':
return None
由于訪問地址都會自動在最后加/,所以不加路由訪問的時候地址就是http://127.0.0.1:80/,當獲取到路由的時候一般都是('/user/register/')這種格式,所以當直接將/加入到免登陸訪問頁面的時候,所有頁面都會面登陸訪問;故要將其分開來單獨判斷。
也可以在免登陸訪問的路由列表中加入'^/$'使用正則的單詞開頭和單詞結尾來對其進行限制。則不需要單獨對其進行判斷
全部代碼如下:
class LoggingMiddleware(MiddlewareMixin):
def process_request(self, request):
攔截請求之前的函數
判斷是否處于登陸狀態
1.給request.user屬性賦值,賦值為當前登陸系統的用戶
user_id = request.session.get('user_id')
if user_id:
拿到用戶對象
user = User.objects.filter(pk=user_id).first()
請求中的用戶屬性改為當前登陸用戶對象
request.user = user
2 .登陸校驗,需區分哪些地址需要做登陸校驗,哪些地址不需要做登陸校驗
path = request.path
if path == '/':
如果直接訪問不帶路由的地址(通常為主頁),則不用進行強制登陸(也可在下面不用校驗的集合中寫成
# '^/$‘,則此處不用寫這個if語句)。
return None
不需要做登陸校驗的地址
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):
當前path路徑為不需要做登陸校驗的路由,則直接訪問對應頁面
return None
if not user_id:
path為需要做登陸校驗的路由時,判斷用戶是否登陸,沒有登陸則跳轉到登陸頁面
return HttpResponseRedirect(reverse('user:login'))
總結
以上是生活随笔為你收集整理的html天天生鲜项目,day54-天天生鲜项目订单管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 近世代数课后习题作业 1
- 下一篇: 联想Y9000X Opencore引导黑