Django项目之电商购物商城 – 创建收货地址
一. 在users中创建新的视图与路由用于创建收货地址
# 设置收货地址 class AddressView(View): def get(self , request): return render(request , "user_center_site.html")
# 设置收货地址 path('user_center_site/', views.AddressView.as_view() , name = 'user_center_site')
二. 创建新的app – areas 用于显示省市区等收货地址
1. 创建模型类使用自关联方式关联所有数据
from django.db import models class AreaModles(models.Model): area_name = models.CharField(max_length=20) parent = models.ForeignKey('self', on_delete=models.SET_NULL , null=True,blank=True,related_name='subs' ) class Meta: db_table = 'areas'
三. 创建视图
- 在请求页面的时候会首先发送一次请求获取到全国的省份 , 该请求不携带任何参数
- 当点击省份后, 会获取该省份的所有市 , 在请求过程中会携带市的id , 可以用此来区分不同的请求
- 创建视图用来获取全国的省份数据
from django.views import View from areas.models import AreaModles from django.http import JsonResponse from utils.response_code import RETCODE # 获取全国城市名称 class SetAreasView(View): def get(self , request): area_id = request.GET.get('area_id') # 判断是否携带参数 if not area_id: province_modle_list = AreaModles.objects.filter(parent_id__isnull=True) province_list = [] for province_modle in province_modle_list: province_dict = { 'id' : province_modle.id, 'name' : province_modle.area_name, } province_list.append(province_dict) print(province_list) return JsonResponse({ 'code' : RETCODE.OK, 'errmsg' : "OK", 'province_list' : province_list }) else: # 获取到当前选择的省份 sub_province = AreaModles.objects.get(id = area_id) print(sub_province.area_name) # 获取当前省份的所有市区 sub_area_list = sub_province.subs.all() sub_list = [] for sub_area in sub_area_list: sub_area_dict = { 'id' : sub_area.id, 'name' : sub_area.area_name, } sub_list.append(sub_area_dict) print(sub_list) sub_data = { 'id' :sub_province.id, 'name' : sub_province.area_name, 'subs' : sub_list } return JsonResponse({ 'code' : RETCODE.OK, 'errmsg' : "OK", 'sub_data' : sub_data })
- 对前端进行修改循环遍历获得所有数据
<div class="form_group"> <label>*所在地区:</label> <select v-model="form_address.province_id"> <option value="0">请选择</option> <option :value="province.id" v-for="province in provinces" >[[province.name]]</option> </select> <select v-model="form_address.city_id"> <option value="0">请选择</option> <option :value="city.id" v-for="city in cities" >[[city.name]]</option> </select> <select v-model="form_address.district_id"> <option value="0">请选择</option> <option :value="district.id" v-for="district in districts" >[[district.name]]</option> </select> </div>
- 那么就到此为止了吗 , 是否可以再优化一下?
当多用户进行设置是不可避免的会对数据库查询造成巨大的压力 , 我们可以将查询到的数据缓存到内存中 , 设置缓存时间
那么就会大大减少数据库的压力
from django.shortcuts import render from django.views import View from areas.models import AreaModles from django.http import JsonResponse from utils.response_code import RETCODE from django.core.cache import cache # 获取全国城市名称 class SetAreasView(View): def get(self , request): # 从缓存中获取数据 province_list = cache.get('province_list') # 判断是否携带参数 area_id = request.GET.get('area_id') if not area_id: # 如果数据不存在获取数据 if not province_list: province_modle_list = AreaModles.objects.filter(parent_id__isnull=True) province_list = [] for province_modle in province_modle_list: province_dict = { 'id' : province_modle.id, 'name' : province_modle.area_name, } province_list.append(province_dict) cache.set('province_list' , province_list , 3600) """ { 'code' : 200, 'errmsg' : "OK", 'province_list' : [ { 'id' : 1 ,'name' : '北京'}, { 'id' : 2 ,'name' : '上海'}, { 'id' : 3 ,'name' : '南京'}, ....... } """ return JsonResponse({ 'code' : RETCODE.OK, 'errmsg' : "OK", 'province_list' : province_list }) else: sub_data = cache.get(f'sub_data_{area_id}') if not sub_data: # 获取到当前选择的省份 sub_province = AreaModles.objects.get(id = area_id) # 获取当前省份的所有市区 sub_area_list = sub_province.subs.all() sub_list = [] for sub_area in sub_area_list: sub_area_dict = { 'id' : sub_area.id, 'name' : sub_area.area_name, } sub_list.append(sub_area_dict) sub_data = { 'id' :sub_province.id, 'name' : sub_province.area_name, 'subs' : sub_list } cache.set(f'sub_data_{area_id}' , sub_data , 3600) return JsonResponse({ 'code' : RETCODE.OK, 'errmsg' : "OK", 'sub_data' : sub_data })