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 modelsclass 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})